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 javax.xml.stream.XMLOutputFactory;
20 import javax.xml.stream.XMLStreamException;
21 import javax.xml.stream.XMLStreamWriter;
22 import java.io.ByteArrayOutputStream;
23 import java.io.Serializable;
24 import java.util.Collections;
25 import java.util.HashMap;
26 import java.util.Map;
27 import java.util.SortedMap;
28 import java.util.TreeMap;
29
30
31
32
33 public class MapMessage implements FormattedMessage, Serializable {
34
35
36
37 public static final String XML = "XML";
38 private static final long serialVersionUID = -5031471831131487120L;
39
40 private final Map<String, String> data;
41
42 private String format = null;
43
44
45
46
47 public MapMessage() {
48 data = new HashMap<String, String>();
49 }
50
51
52
53
54
55 public MapMessage(Map<String, String> map) {
56 this.data = map;
57 }
58
59
60
61
62
63 public void setFormat(String format) {
64 this.format = format;
65 }
66
67
68
69
70
71 public String getFormat() {
72 return this.format;
73 }
74
75
76
77
78
79
80 public Object[] getParameters() {
81 return data.values().toArray();
82 }
83
84
85
86
87
88 public String getMessageFormat() {
89 return "";
90 }
91
92
93
94
95
96 public Map<String, String> getData() {
97 return Collections.unmodifiableMap(data);
98 }
99
100
101
102
103 public void clear() {
104 data.clear();
105 }
106
107
108
109
110
111
112 public void put(String key, String value) {
113 if (value == null) {
114 throw new IllegalArgumentException("No value provided for key " + key);
115 }
116 validate(key, value);
117 data.put(key, value);
118 }
119
120 protected void validate(String key, String value) {
121
122 }
123
124
125
126
127
128 public void putAll(Map<String, String> map) {
129 data.putAll(map);
130 }
131
132
133
134
135
136
137 public String get(String key) {
138 return data.get(key);
139 }
140
141
142
143
144
145
146 public String remove(String key) {
147 return data.remove(key);
148 }
149
150
151
152
153
154
155 public String asString() {
156 return asString(format == null ? "" : format);
157 }
158
159
160
161
162
163
164
165 public String asString(String format) {
166 StringBuilder sb = new StringBuilder();
167 if (format.equalsIgnoreCase(XML)) {
168 asXML(sb);
169 } else {
170 appendMap(sb);
171 }
172 return sb.toString();
173 }
174
175 public void asXML(StringBuilder sb) {
176 sb.append("<Map>\n");
177 SortedMap<String, String> sorted = new TreeMap<String, String>(data);
178 for (Map.Entry<String, String> entry : sorted.entrySet()) {
179 sb.append(" <Entry key=").append(entry.getKey()).append(">").append(entry.getValue()).append("</Entry>\n");
180 }
181 sb.append("</Map>");
182 }
183
184
185
186
187
188 public String getFormattedMessage() {
189 return asString();
190 }
191
192 protected void appendMap(StringBuilder sb) {
193 SortedMap<String, String> sorted = new TreeMap<String, String>(data);
194 boolean first = true;
195 for (Map.Entry<String, String> entry : sorted.entrySet()) {
196 if (!first) {
197 sb.append(" ");
198 }
199 first = false;
200 sb.append(entry.getKey()).append("=\"").append(entry.getValue()).append("\"");
201 }
202 }
203
204 public MapMessage newInstance(Map<String, String> map) {
205 return new MapMessage(map);
206 }
207
208 public String toString() {
209 return asString();
210 }
211
212 public boolean equals(Object o) {
213 if (this == o) {
214 return true;
215 }
216 if (o == null || getClass() != o.getClass()) {
217 return false;
218 }
219
220 MapMessage that = (MapMessage) o;
221
222 return this.data.equals(that.data);
223 }
224
225 public int hashCode() {
226 return data.hashCode();
227 }
228 }