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.io.IOException;
20 import java.io.ObjectInputStream;
21 import java.io.ObjectOutputStream;
22 import java.util.Arrays;
23 import java.util.IllegalFormatException;
24 import java.util.Locale;
25
26 import org.apache.logging.log4j.Logger;
27 import org.apache.logging.log4j.status.StatusLogger;
28
29
30
31
32 public class StringFormattedMessage implements Message {
33
34 private static final Logger LOGGER = StatusLogger.getLogger();
35
36 private static final long serialVersionUID = -665975803997290697L;
37
38 private static final int HASHVAL = 31;
39
40 private String messagePattern;
41 private transient Object[] argArray;
42 private String[] stringArgs;
43 private transient String formattedMessage;
44 private transient Throwable throwable;
45 private final Locale locale;
46
47
48
49
50
51
52
53
54
55 public StringFormattedMessage(final Locale locale, final String messagePattern, final Object... arguments) {
56 this.locale = locale;
57 this.messagePattern = messagePattern;
58 this.argArray = arguments;
59 if (arguments != null && arguments.length > 0 && arguments[arguments.length - 1] instanceof Throwable) {
60 this.throwable = (Throwable) arguments[arguments.length - 1];
61 }
62 }
63
64
65
66
67
68
69
70
71 public StringFormattedMessage(final String messagePattern, final Object... arguments) {
72 this(Locale.getDefault(Locale.Category.FORMAT), messagePattern, arguments);
73 }
74
75
76
77
78
79 @Override
80 public String getFormattedMessage() {
81 if (formattedMessage == null) {
82 formattedMessage = formatMessage(messagePattern, argArray);
83 }
84 return formattedMessage;
85 }
86
87
88
89
90
91 @Override
92 public String getFormat() {
93 return messagePattern;
94 }
95
96
97
98
99
100 @Override
101 public Object[] getParameters() {
102 if (argArray != null) {
103 return argArray;
104 }
105 return stringArgs;
106 }
107
108 protected String formatMessage(final String msgPattern, final Object... args) {
109 try {
110 return String.format(locale, msgPattern, args);
111 } catch (final IllegalFormatException ife) {
112 LOGGER.error("Unable to format msg: " + msgPattern, ife);
113 return msgPattern;
114 }
115 }
116
117 @Override
118 public boolean equals(final Object o) {
119 if (this == o) {
120 return true;
121 }
122 if (o == null || getClass() != o.getClass()) {
123 return false;
124 }
125
126 final StringFormattedMessage that = (StringFormattedMessage) o;
127
128 if (messagePattern != null ? !messagePattern.equals(that.messagePattern) : that.messagePattern != null) {
129 return false;
130 }
131
132 return Arrays.equals(stringArgs, that.stringArgs);
133 }
134
135 @Override
136 public int hashCode() {
137 int result = messagePattern != null ? messagePattern.hashCode() : 0;
138 result = HASHVAL * result + (stringArgs != null ? Arrays.hashCode(stringArgs) : 0);
139 return result;
140 }
141
142
143 @Override
144 public String toString() {
145 return getFormattedMessage();
146 }
147
148 private void writeObject(final ObjectOutputStream out) throws IOException {
149 out.defaultWriteObject();
150 getFormattedMessage();
151 out.writeUTF(formattedMessage);
152 out.writeUTF(messagePattern);
153 out.writeInt(argArray.length);
154 stringArgs = new String[argArray.length];
155 int i = 0;
156 for (final Object obj : argArray) {
157 final String string = String.valueOf(obj);
158 stringArgs[i] = string;
159 out.writeUTF(string);
160 ++i;
161 }
162 }
163
164 private void readObject(final ObjectInputStream in) throws IOException, ClassNotFoundException {
165 in.defaultReadObject();
166 formattedMessage = in.readUTF();
167 messagePattern = in.readUTF();
168 final int length = in.readInt();
169 stringArgs = new String[length];
170 for (int i = 0; i < length; ++i) {
171 stringArgs[i] = in.readUTF();
172 }
173 }
174
175
176
177
178
179
180 @Override
181 public Throwable getThrowable() {
182 return throwable;
183 }
184 }