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(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 public static <M extends AbstractManager, T> M getManager(String name, ManagerFactory<M, T> factory, T data) {
64 lock.lock();
65 try {
66 M manager = (M) map.get(name);
67 if (manager == null) {
68 manager = factory.createManager(name, data);
69 if (manager == null) {
70 throw new IllegalStateException("Unable to create a manager");
71 }
72 map.put(name, manager);
73 }
74 manager.count++;
75 return manager;
76 } finally {
77 lock.unlock();
78 }
79 }
80
81
82
83
84
85
86 public static boolean hasManager(String name) {
87 lock.lock();
88 try {
89 return map.containsKey(name);
90 } finally {
91 lock.unlock();
92 }
93 }
94
95
96
97
98
99 protected void releaseSub() {
100 }
101
102 protected int getCount() {
103 return count;
104 }
105
106
107
108
109 public void release() {
110 lock.lock();
111 try {
112 --count;
113 if (count <= 0) {
114 map.remove(name);
115 LOGGER.debug("Shutting down {} {}", this.getClass().getSimpleName(), getName());
116 releaseSub();
117 }
118 } finally {
119 lock.unlock();
120 }
121 }
122
123
124
125
126
127 public String getName() {
128 return name;
129 }
130 }