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