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 org.apache.logging.log4j.Logger;
20 import org.apache.logging.log4j.core.LogEvent;
21 import org.apache.logging.log4j.core.config.plugins.PluginManager;
22 import org.apache.logging.log4j.core.config.plugins.PluginType;
23 import org.apache.logging.log4j.status.StatusLogger;
24
25 import java.util.HashMap;
26 import java.util.Map;
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<StrLookup> clazz = 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.defaultLookup = new MapLookup(new HashMap<String, String>());
64 lookups.put("sys", new SystemPropertiesLookup());
65 lookups.put("env", new EnvironmentLookup());
66 }
67
68
69
70
71
72
73
74
75
76
77
78
79
80 @Override
81 public String lookup(final String var) {
82 return lookup(null, var);
83 }
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98 @Override
99 public String lookup(final LogEvent event, String var) {
100 if (var == null) {
101 return null;
102 }
103
104 final int prefixPos = var.indexOf(PREFIX_SEPARATOR);
105 if (prefixPos >= 0) {
106 final String prefix = var.substring(0, prefixPos);
107 final String name = var.substring(prefixPos + 1);
108 final StrLookup lookup = lookups.get(prefix);
109 String value = null;
110 if (lookup != null) {
111 value = event == null ? lookup.lookup(name) : lookup.lookup(event, name);
112 }
113
114 if (value != null) {
115 return value;
116 }
117 var = var.substring(prefixPos + 1);
118 }
119 if (defaultLookup != null) {
120 return event == null ? defaultLookup.lookup(var) : defaultLookup.lookup(event, var);
121 }
122 return null;
123 }
124
125 @Override
126 public String toString() {
127 final StringBuilder sb = new StringBuilder();
128 for (final String name : lookups.keySet()) {
129 if (sb.length() == 0) {
130 sb.append("{");
131 } else {
132 sb.append(", ");
133 }
134
135 sb.append(name);
136 }
137 if (sb.length() > 0) {
138 sb.append("}");
139 }
140 return sb.toString();
141 }
142 }