1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.appender;
18
19 import org.apache.logging.log4j.Logger;
20 import org.apache.logging.log4j.status.StatusLogger;
21
22 import java.util.HashMap;
23 import java.util.Map;
24 import java.util.concurrent.locks.Lock;
25 import java.util.concurrent.locks.ReentrantLock;
26
27
28
29
30 public abstract class AbstractManager {
31
32
33
34
35 protected static final Logger LOGGER = StatusLogger.getLogger();
36
37
38
39 private static final Map<String, AbstractManager> MAP = new HashMap<String, AbstractManager>();
40
41 private static final Lock LOCK = new ReentrantLock();
42
43
44
45
46 protected int count;
47
48 private final String name;
49
50 protected AbstractManager(final String name) {
51 this.name = name;
52 LOGGER.debug("Starting {} {}", this.getClass().getSimpleName(), name);
53 }
54
55
56
57
58
59
60
61
62
63
64 public static <M extends AbstractManager, T> M getManager(final String name, final ManagerFactory<M, T> factory,
65 final T data) {
66 LOCK.lock();
67 try {
68 M manager = (M) MAP.get(name);
69 if (manager == null) {
70 manager = factory.createManager(name, data);
71 if (manager == null) {
72 throw new IllegalStateException("Unable to create a manager");
73 }
74 MAP.put(name, manager);
75 }
76 manager.count++;
77 return manager;
78 } finally {
79 LOCK.unlock();
80 }
81 }
82
83
84
85
86
87
88 public static boolean hasManager(final String name) {
89 LOCK.lock();
90 try {
91 return MAP.containsKey(name);
92 } finally {
93 LOCK.unlock();
94 }
95 }
96
97
98
99
100
101 protected void releaseSub() {
102 }
103
104 protected int getCount() {
105 return count;
106 }
107
108
109
110
111 public void release() {
112 LOCK.lock();
113 try {
114 --count;
115 if (count <= 0) {
116 MAP.remove(name);
117 LOGGER.debug("Shutting down {} {}", this.getClass().getSimpleName(), getName());
118 releaseSub();
119 }
120 } finally {
121 LOCK.unlock();
122 }
123 }
124
125
126
127
128
129 public String getName() {
130 return name;
131 }
132 }