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(StrLookup defaultLookup) {
43 this.defaultLookup = defaultLookup == null ? new MapLookup(new HashMap<String, String>()) : defaultLookup;
44 PluginManager manager = new PluginManager("Lookup");
45 manager.collectPlugins();
46 Map<String, PluginType> plugins = manager.getPlugins();
47
48 for (Map.Entry<String, PluginType> entry : plugins.entrySet()) {
49 Class<StrLookup> clazz = entry.getValue().getPluginClass();
50 try {
51 lookups.put(entry.getKey(), clazz.newInstance());
52 } catch (Exception ex) {
53 LOGGER.error("Unable to create Lookup for " + entry.getKey(), ex);
54 }
55 }
56 }
57
58 public Interpolator() {
59 this.defaultLookup = new MapLookup(new HashMap<String, String>());
60 lookups.put("sys", new SystemPropertiesLookup());
61 }
62
63
64
65
66
67
68
69
70
71
72
73
74
75 public String lookup(String var) {
76 return lookup(null, var);
77 }
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92 public String lookup(LogEvent event, String var) {
93 if (var == null) {
94 return null;
95 }
96
97 int prefixPos = var.indexOf(PREFIX_SEPARATOR);
98 if (prefixPos >= 0) {
99 String prefix = var.substring(0, prefixPos);
100 String name = var.substring(prefixPos + 1);
101 StrLookup lookup = lookups.get(prefix);
102 String value = null;
103 if (lookup != null) {
104 value = event == null ? lookup.lookup(name) : lookup.lookup(event, name);
105 }
106
107 if (value != null) {
108 return value;
109 }
110 var = var.substring(prefixPos + 1);
111 }
112 if (defaultLookup != null) {
113 return event == null ? defaultLookup.lookup(var) : defaultLookup.lookup(event, var);
114 }
115 return null;
116 }
117
118 @Override
119 public String toString() {
120 StringBuilder sb = new StringBuilder();
121 for (String name : lookups.keySet()) {
122 if (sb.length() == 0) {
123 sb.append("{");
124 } else {
125 sb.append(", ");
126 }
127
128 sb.append(name);
129 }
130 if (sb.length() > 0) {
131 sb.append("}");
132 }
133 return sb.toString();
134 }
135 }