1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.lookup;
18
19 import java.util.HashMap;
20 import java.util.Map;
21
22 import org.apache.logging.log4j.Logger;
23 import org.apache.logging.log4j.core.LogEvent;
24 import org.apache.logging.log4j.core.config.plugins.PluginManager;
25 import org.apache.logging.log4j.core.config.plugins.PluginType;
26 import org.apache.logging.log4j.status.StatusLogger;
27
28
29
30
31 public class Interpolator implements StrLookup {
32
33 private static final Logger LOGGER = StatusLogger.getLogger();
34
35
36 private static final char PREFIX_SEPARATOR = ':';
37
38 private final Map<String, StrLookup> lookups = new HashMap<String, StrLookup>();
39
40 private final StrLookup defaultLookup;
41
42 public Interpolator(final StrLookup defaultLookup) {
43 this.defaultLookup = defaultLookup == null ? new MapLookup(new HashMap<String, String>()) : defaultLookup;
44 final PluginManager manager = new PluginManager("Lookup");
45 manager.collectPlugins();
46 final Map<String, PluginType<?>> plugins = manager.getPlugins();
47
48 for (final Map.Entry<String, PluginType<?>> entry : plugins.entrySet()) {
49 @SuppressWarnings("unchecked")
50 final Class<? extends StrLookup> clazz = (Class<? extends StrLookup>) entry.getValue().getPluginClass();
51 try {
52 lookups.put(entry.getKey(), clazz.newInstance());
53 } catch (final Exception ex) {
54 LOGGER.error("Unable to create Lookup for " + entry.getKey(), ex);
55 }
56 }
57 }
58
59
60
61
62 public Interpolator() {
63 this((Map<String, String>) null);
64 }
65
66
67
68
69 public Interpolator(Map<String, String> properties) {
70 this.defaultLookup = new MapLookup(properties == null ? new HashMap<String, String>() : properties);
71 lookups.put("sys", new SystemPropertiesLookup());
72 lookups.put("env", new EnvironmentLookup());
73 lookups.put("jndi", new JndiLookup());
74 try {
75 if (Class.forName("javax.servlet.ServletContext") != null) {
76 lookups.put("web", new WebLookup());
77 }
78 } catch (ClassNotFoundException ex) {
79 LOGGER.debug("ServletContext not present - WebLookup not added");
80 } catch (Exception ex) {
81 LOGGER.error("Unable to locate ServletContext", ex);
82 }
83 }
84
85
86
87
88
89
90
91
92
93
94
95
96
97 @Override
98 public String lookup(final String var) {
99 return lookup(null, var);
100 }
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115 @Override
116 public String lookup(final LogEvent event, String var) {
117 if (var == null) {
118 return null;
119 }
120
121 final int prefixPos = var.indexOf(PREFIX_SEPARATOR);
122 if (prefixPos >= 0) {
123 final String prefix = var.substring(0, prefixPos);
124 final String name = var.substring(prefixPos + 1);
125 final StrLookup lookup = lookups.get(prefix);
126 String value = null;
127 if (lookup != null) {
128 value = event == null ? lookup.lookup(name) : lookup.lookup(event, name);
129 }
130
131 if (value != null) {
132 return value;
133 }
134 var = var.substring(prefixPos + 1);
135 }
136 if (defaultLookup != null) {
137 return event == null ? defaultLookup.lookup(var) : defaultLookup.lookup(event, var);
138 }
139 return null;
140 }
141
142 @Override
143 public String toString() {
144 final StringBuilder sb = new StringBuilder();
145 for (final String name : lookups.keySet()) {
146 if (sb.length() == 0) {
147 sb.append("{");
148 } else {
149 sb.append(", ");
150 }
151
152 sb.append(name);
153 }
154 if (sb.length() > 0) {
155 sb.append("}");
156 }
157 return sb.toString();
158 }
159 }