1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.jcl;
18
19 import java.util.Map;
20 import java.util.WeakHashMap;
21 import java.util.concurrent.ConcurrentHashMap;
22 import java.util.concurrent.ConcurrentMap;
23
24 import org.apache.commons.logging.Log;
25 import org.apache.commons.logging.LogConfigurationException;
26 import org.apache.commons.logging.LogFactory;
27 import org.apache.logging.log4j.LogManager;
28 import org.apache.logging.log4j.spi.LoggerContext;
29 import org.apache.logging.log4j.spi.ExtendedLogger;
30
31
32
33
34 public class LogFactoryImpl extends LogFactory {
35
36 private final Map<LoggerContext, ConcurrentMap<String, Log>> contextMap =
37 new WeakHashMap<LoggerContext, ConcurrentMap<String, Log>>();
38
39 private final ConcurrentMap<String, Object> attributes = new ConcurrentHashMap<String, Object>();
40
41 @Override
42 public Log getInstance(final String name) throws LogConfigurationException {
43 final ConcurrentMap<String, Log> loggers = getLoggersMap();
44 if (loggers.containsKey(name)) {
45 return loggers.get(name);
46 }
47 loggers.putIfAbsent(name, new Log4jLog(PrivateManager.getLogger(name)));
48 return loggers.get(name);
49 }
50
51 private ConcurrentMap<String, Log> getLoggersMap() {
52 final LoggerContext context = PrivateManager.getContext();
53 synchronized (contextMap) {
54 ConcurrentMap<String, Log> map = contextMap.get(context);
55 if (map == null) {
56 map = new ConcurrentHashMap<String, Log>();
57 contextMap.put(context, map);
58 }
59 return map;
60 }
61 }
62
63 @Override
64 public Object getAttribute(final String name) {
65 return attributes.get(name);
66 }
67
68 @Override
69 public String[] getAttributeNames() {
70 return attributes.keySet().toArray(new String[attributes.size()]);
71 }
72
73 @Override
74 public Log getInstance(@SuppressWarnings("rawtypes") final Class clazz) throws LogConfigurationException {
75 return getInstance(clazz.getName());
76 }
77
78
79
80
81
82 @Override
83 public void release() {
84 getLoggersMap().clear();
85 }
86
87 @Override
88 public void removeAttribute(final String name) {
89 attributes.remove(name);
90 }
91
92 @Override
93 public void setAttribute(final String name, final Object value) {
94 if (value != null) {
95 attributes.put(name, value);
96 } else {
97 removeAttribute(name);
98 }
99 }
100
101
102
103
104 private static class PrivateManager extends LogManager {
105 private static final String FQCN = LogFactory.class.getName();
106
107 public static LoggerContext getContext() {
108 return getContext(FQCN, false);
109 }
110
111 public static ExtendedLogger getLogger(final String name) {
112 return getContext().getLogger(name);
113 }
114 }
115
116 }