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 org.apache.logging.log4j.status.StatusLogger;
20
21 import java.io.IOException;
22 import java.io.ObjectInputStream;
23 import java.io.ObjectOutputStream;
24 import java.util.Locale;
25 import java.util.MissingResourceException;
26 import java.util.ResourceBundle;
27
28
29
30
31
32
33
34
35
36
37 public class LocalizedMessage implements Message, LoggerNameAwareMessage {
38 private static final long serialVersionUID = 3893703791567290742L;
39
40 private String bundleId;
41
42 private transient ResourceBundle bundle;
43
44 private Locale locale;
45
46 private transient StatusLogger logger = StatusLogger.getLogger();
47
48 private String loggerName;
49 private String messagePattern;
50 private String[] stringArgs;
51 private transient Object[] argArray;
52 private String formattedMessage;
53 private transient Throwable throwable;
54
55
56
57
58
59
60
61 public LocalizedMessage(final String messagePattern, final Object[] arguments) {
62 this((ResourceBundle) null, (Locale) null, messagePattern, arguments);
63 }
64
65 public LocalizedMessage(final String bundleId, final String key, final Object[] arguments) {
66 this(bundleId, (Locale) null, key, arguments);
67 }
68
69 public LocalizedMessage(final ResourceBundle bundle, final String key, final Object[] arguments) {
70 this(bundle, (Locale) null, key, arguments);
71 }
72
73 public LocalizedMessage(final String bundleId, final Locale locale, final String key, final Object[] arguments) {
74 this.messagePattern = key;
75 this.argArray = arguments;
76 this.throwable = null;
77 setup(bundleId, null, locale);
78 }
79
80 public LocalizedMessage(final ResourceBundle bundle, final Locale locale, final String key,
81 final Object[] arguments) {
82 this.messagePattern = key;
83 this.argArray = arguments;
84 this.throwable = null;
85 setup(null, bundle, locale);
86 }
87
88 public LocalizedMessage(final Locale locale, final String key, final Object[] arguments) {
89 this((ResourceBundle) null, locale, key, arguments);
90 }
91
92 public LocalizedMessage(final String messagePattern, final Object arg) {
93 this((ResourceBundle) null, (Locale) null, messagePattern, new Object[] {arg});
94 }
95
96 public LocalizedMessage(final String bundleId, final String key, final Object arg) {
97 this(bundleId, (Locale) null, key, new Object[] {arg});
98 }
99
100 public LocalizedMessage(final ResourceBundle bundle, final String key, final Object arg) {
101 this(bundle, (Locale) null, key, new Object[] {arg});
102 }
103
104 public LocalizedMessage(final String bundleId, final Locale locale, final String key, final Object arg) {
105 this(bundleId, locale, key, new Object[] {arg});
106 }
107
108 public LocalizedMessage(final ResourceBundle bundle, final Locale locale, final String key, final Object arg) {
109 this(bundle, locale, key, new Object[] {arg});
110 }
111
112 public LocalizedMessage(final Locale locale, final String key, final Object arg) {
113 this((ResourceBundle) null, locale, key, new Object[] {arg});
114 }
115
116 public LocalizedMessage(final String messagePattern, final Object arg1, final Object arg2) {
117 this((ResourceBundle) null, (Locale) null, messagePattern, new Object[] {arg1, arg2});
118 }
119
120 public LocalizedMessage(final String bundleId, final String key, final Object arg1, final Object arg2) {
121 this(bundleId, (Locale) null, key, new Object[] {arg1, arg2});
122 }
123
124 public LocalizedMessage(final ResourceBundle bundle, final String key, final Object arg1, final Object arg2) {
125 this(bundle, (Locale) null, key, new Object[] {arg1, arg2});
126 }
127
128 public LocalizedMessage(final String bundleId, final Locale locale, final String key, final Object arg1,
129 final Object arg2) {
130 this(bundleId, locale, key, new Object[] {arg1, arg2});
131 }
132
133 public LocalizedMessage(final ResourceBundle bundle, final Locale locale, final String key, final Object arg1,
134 final Object arg2) {
135 this(bundle, locale, key, new Object[] {arg1, arg2});
136 }
137
138 public LocalizedMessage(final Locale locale, final String key, final Object arg1, final Object arg2) {
139 this((ResourceBundle) null, locale, key, new Object[] {arg1, arg2});
140 }
141
142
143
144
145
146 public void setLoggerName(final String name) {
147 this.loggerName = name;
148 }
149
150
151
152
153
154 public String getLoggerName() {
155 return this.loggerName;
156 }
157
158 private void setup(final String bundleId, final ResourceBundle bundle, final Locale locale) {
159 this.bundleId = bundleId;
160 this.bundle = bundle;
161 this.locale = locale;
162 }
163
164
165
166
167
168 public String getFormattedMessage() {
169 if (formattedMessage != null) {
170 return formattedMessage;
171 }
172 ResourceBundle bundle = this.bundle;
173 if (bundle == null) {
174 if (bundleId != null) {
175 bundle = getBundle(bundleId, locale, false);
176 } else {
177 bundle = getBundle(loggerName, locale, true);
178 }
179 }
180 final String messagePattern = getFormat();
181 final String msgPattern = (bundle == null || !bundle.containsKey(messagePattern)) ?
182 messagePattern : bundle.getString(messagePattern);
183 final Object[] array = argArray == null ? stringArgs : argArray;
184 final FormattedMessage msg = new FormattedMessage(msgPattern, array);
185 formattedMessage = msg.getFormattedMessage();
186 throwable = msg.getThrowable();
187 return formattedMessage;
188 }
189
190 public String getFormat() {
191 return messagePattern;
192 }
193
194 public Object[] getParameters() {
195 if (argArray != null) {
196 return argArray;
197 }
198 return stringArgs;
199 }
200
201 public Throwable getThrowable() {
202 return throwable;
203 }
204
205
206
207
208
209
210
211
212
213 protected ResourceBundle getBundle(final String key, final Locale locale, final boolean loop) {
214 ResourceBundle rb = null;
215
216 if (key == null) {
217 return null;
218 }
219 try {
220 if (locale != null) {
221 rb = ResourceBundle.getBundle(key, locale);
222 } else {
223 rb = ResourceBundle.getBundle(key);
224 }
225 } catch (final MissingResourceException ex) {
226 if (!loop) {
227 logger.debug("Unable to locate ResourceBundle " + key);
228 return null;
229 }
230 }
231
232 String substr = key;
233 int i;
234 while (rb == null && (i = substr.lastIndexOf('.')) > 0) {
235 substr = substr.substring(0, i);
236 try {
237 if (locale != null) {
238 rb = ResourceBundle.getBundle(substr, locale);
239 } else {
240 rb = ResourceBundle.getBundle(substr);
241 }
242 } catch (final MissingResourceException ex) {
243 logger.debug("Unable to locate ResourceBundle " + substr);
244 }
245 }
246 return rb;
247 }
248
249 private void writeObject(final ObjectOutputStream out) throws IOException {
250 out.defaultWriteObject();
251 getFormattedMessage();
252 out.writeUTF(formattedMessage);
253 out.writeUTF(messagePattern);
254 out.writeUTF(bundleId);
255 out.writeInt(argArray.length);
256 stringArgs = new String[argArray.length];
257 int i = 0;
258 for (final Object obj : argArray) {
259 stringArgs[i] = obj.toString();
260 ++i;
261 }
262 }
263
264 private void readObject(final ObjectInputStream in) throws IOException, ClassNotFoundException {
265 in.defaultReadObject();
266 formattedMessage = in.readUTF();
267 messagePattern = in.readUTF();
268 bundleId = in.readUTF();
269 final int length = in.readInt();
270 stringArgs = new String[length];
271 for (int i = 0; i < length; ++i) {
272 stringArgs[i] = in.readUTF();
273 }
274 logger = StatusLogger.getLogger();
275 bundle = null;
276 argArray = null;
277 }
278 }