1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.message;
18
19 import java.util.Collections;
20 import java.util.Map;
21 import java.util.SortedMap;
22 import java.util.TreeMap;
23
24 import org.apache.logging.log4j.util.EnglishEnums;
25
26
27
28
29 public class MapMessage implements MultiformatMessage {
30
31
32
33
34 public enum MapFormat {
35
36 XML,
37
38 JSON,
39
40 JAVA
41 }
42
43 private static final long serialVersionUID = -5031471831131487120L;
44
45 private final SortedMap<String, String> data;
46
47
48
49
50 public MapMessage() {
51 data = new TreeMap<String, String>();
52 }
53
54
55
56
57
58 public MapMessage(final Map<String, String> map) {
59 this.data = map instanceof SortedMap ? (SortedMap<String, String>) map : new TreeMap<String, String>(map);
60 }
61
62 public String[] getFormats() {
63 final String[] formats = new String[MapFormat.values().length];
64 int i = 0;
65 for (final MapFormat format : MapFormat.values()) {
66 formats[i++] = format.name();
67 }
68 return formats;
69 }
70
71
72
73
74
75 public Object[] getParameters() {
76 return data.values().toArray();
77 }
78
79
80
81
82
83 public String getFormat() {
84 return "";
85 }
86
87
88
89
90
91 public Map<String, String> getData() {
92 return Collections.unmodifiableMap(data);
93 }
94
95
96
97
98 public void clear() {
99 data.clear();
100 }
101
102
103
104
105
106
107 public void put(final String key, final String value) {
108 if (value == null) {
109 throw new IllegalArgumentException("No value provided for key " + key);
110 }
111 validate(key, value);
112 data.put(key, value);
113 }
114
115 protected void validate(final String key, final String value) {
116
117 }
118
119
120
121
122
123 public void putAll(final Map<String, String> map) {
124 data.putAll(map);
125 }
126
127
128
129
130
131
132 public String get(final String key) {
133 return data.get(key);
134 }
135
136
137
138
139
140
141 public String remove(final String key) {
142 return data.remove(key);
143 }
144
145
146
147
148
149
150 public String asString() {
151 return asString((MapFormat) null);
152 }
153
154 public String asString(final String format) {
155 try {
156 return asString(EnglishEnums.valueOf(MapFormat.class, format));
157 } catch (final IllegalArgumentException ex) {
158 return asString();
159 }
160 }
161
162
163
164
165
166
167 private String asString(final MapFormat format) {
168 final StringBuilder sb = new StringBuilder();
169 if (format == null) {
170 appendMap(sb);
171 } else {
172 switch (format) {
173 case XML : {
174 asXML(sb);
175 break;
176 }
177 case JSON : {
178 asJSON(sb);
179 break;
180 }
181 case JAVA : {
182 asJava(sb);
183 break;
184 }
185 default : {
186 appendMap(sb);
187 }
188 }
189 }
190 return sb.toString();
191 }
192
193 public void asXML(final StringBuilder sb) {
194 sb.append("<Map>\n");
195 for (final Map.Entry<String, String> entry : data.entrySet()) {
196 sb.append(" <Entry key=\"").append(entry.getKey()).append("\">").append(entry.getValue())
197 .append("</Entry>\n");
198 }
199 sb.append("</Map>");
200 }
201
202
203
204
205
206 public String getFormattedMessage() {
207 return asString();
208 }
209
210
211
212
213
214
215
216
217
218 public String getFormattedMessage(final String[] formats) {
219 if (formats == null || formats.length == 0) {
220 return asString();
221 }
222 for (final String format : formats) {
223 for (final MapFormat mapFormat : MapFormat.values()) {
224 if (mapFormat.name().equalsIgnoreCase(format)) {
225 return asString(mapFormat);
226 }
227 }
228 }
229 return asString();
230
231 }
232
233 protected void appendMap(final StringBuilder sb) {
234 boolean first = true;
235 for (final Map.Entry<String, String> entry : data.entrySet()) {
236 if (!first) {
237 sb.append(" ");
238 }
239 first = false;
240 sb.append(entry.getKey()).append("=\"").append(entry.getValue()).append("\"");
241 }
242 }
243
244 protected void asJSON(final StringBuilder sb) {
245 boolean first = true;
246 sb.append("{");
247 for (final Map.Entry<String, String> entry : data.entrySet()) {
248 if (!first) {
249 sb.append(", ");
250 }
251 first = false;
252 sb.append("\"").append(entry.getKey()).append("\":");
253 sb.append("\"").append(entry.getValue()).append("\"");
254 }
255 sb.append("}");
256 }
257
258
259 protected void asJava(final StringBuilder sb) {
260 boolean first = true;
261 sb.append("{");
262 for (final Map.Entry<String, String> entry : data.entrySet()) {
263 if (!first) {
264 sb.append(", ");
265 }
266 first = false;
267 sb.append(entry.getKey()).append("=\"").append(entry.getValue()).append("\"");
268 }
269 sb.append("}");
270 }
271
272 public MapMessage newInstance(final Map<String, String> map) {
273 return new MapMessage(map);
274 }
275
276 @Override
277 public String toString() {
278 return asString();
279 }
280
281 @Override
282 public boolean equals(final Object o) {
283 if (this == o) {
284 return true;
285 }
286 if (o == null || this.getClass() != o.getClass()) {
287 return false;
288 }
289
290 final MapMessage that = (MapMessage) o;
291
292 return this.data.equals(that.data);
293 }
294
295 @Override
296 public int hashCode() {
297 return data.hashCode();
298 }
299
300
301
302
303
304
305 public Throwable getThrowable() {
306 return null;
307 }
308 }