Skip to content

Commit 242a541

Browse files
authored
Merge pull request #552 from syjer/jdklogging-formatting-opt
optimize the log formatter
2 parents 4a0612f + 14f26f8 commit 242a541

File tree

5 files changed

+161
-43
lines changed

5 files changed

+161
-43
lines changed

openhtmltopdf-core/src/main/java/com/openhtmltopdf/util/Diagnostic.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,7 @@ public Throwable getError() {
3636
}
3737

3838
public String getFormattedMessage() {
39-
if (logMessageId instanceof LogMessageId.LogMessageId0Param) {
40-
return logMessageId.getMessageFormat();
41-
} else {
42-
return String.format(MESSAGE_FORMAT_PLACEHOLDER.matcher(logMessageId.getMessageFormat()).replaceAll("%s"), args);
43-
}
39+
return logMessageId.formatMessage(args);
4440
}
4541

4642
public Object[] getArgs() {

openhtmltopdf-core/src/main/java/com/openhtmltopdf/util/JDKXRLogger.java

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@
2121
*/
2222
package com.openhtmltopdf.util;
2323

24+
import java.util.HashMap;
25+
import java.util.Map;
2426
import java.util.logging.Level;
2527
import java.util.logging.Logger;
26-
import java.util.stream.Collectors;
2728
import java.util.logging.Handler;
2829
import java.util.logging.ConsoleHandler;
2930
import java.util.logging.Formatter;
3031
import java.util.Arrays;
31-
import java.util.List;
3232

3333
/**
3434
* An {@link XRLogger} interface that uses <code>java.util.logging</code>.
@@ -37,9 +37,9 @@
3737
public class JDKXRLogger implements XRLogger {
3838
private boolean initPending = true;
3939

40-
// Keep a list of Loggers so they are not garbage collected
40+
// Keep a map of Loggers so they are not garbage collected
4141
// which makes them lose their settings we have applied.
42-
private List<Logger> loggers;
42+
private Map<String, Logger> loggers;
4343

4444
private final boolean useParent;
4545
private final Level level;
@@ -54,7 +54,7 @@ public JDKXRLogger() {
5454
}
5555

5656
public JDKXRLogger(boolean useParent, Level level, Handler handler, Formatter formatter) {
57-
this.useParent = false;
57+
this.useParent = useParent;
5858
this.level = level;
5959
this.handler = handler;
6060
this.formatter = formatter;
@@ -100,7 +100,7 @@ public void setLevel(String logger, Level level) {
100100
*/
101101
private Logger getLogger(String log) {
102102
checkInitPending();
103-
return Logger.getLogger(log);
103+
return loggers.get(log);
104104
}
105105

106106
private void init(boolean useParent, Level level, Handler handler, Formatter formatter) {
@@ -122,27 +122,30 @@ private void initializeJDKLogManager(boolean useParent, Level level, Handler han
122122
}
123123

124124
private void configureLoggerHandlerForwarding(boolean useParentHandlers) {
125-
loggers.forEach(logger -> logger.setUseParentHandlers(useParentHandlers));
125+
loggers.forEach((name, logger) -> logger.setUseParentHandlers(useParentHandlers));
126126
}
127127

128128
/**
129129
* Returns a List of all Logger instances used by this project from the JDK LogManager; these will
130130
* be automatically created if they aren't already available.
131131
*/
132-
private List<Logger> retrieveLoggers() {
133-
return XRLog.listRegisteredLoggers().stream()
134-
.map(Logger::getLogger).collect(Collectors.toList());
132+
private Map<String, Logger> retrieveLoggers() {
133+
Map<String, Logger> loggers = new HashMap<>();
134+
for (String name : XRLog.listRegisteredLoggers()) {
135+
loggers.put(name, Logger.getLogger(name));
136+
}
137+
return loggers;
135138
}
136139

137140
private void configureLogHandlers(Handler handler, Formatter formatter) {
138141
handler.setFormatter(formatter);
139142
// Note Logger::removeLogger doesn't throw if the handler isn't found
140143
// so there are no sync issues here.
141-
loggers.forEach(logger -> Arrays.stream(logger.getHandlers()).forEach(logger::removeHandler));
142-
loggers.forEach(logger -> logger.addHandler(handler));
144+
loggers.forEach((name, logger) -> Arrays.stream(logger.getHandlers()).forEach(logger::removeHandler));
145+
loggers.forEach((name, logger) -> logger.addHandler(handler));
143146
}
144147

145148
private void configureLogLevels(Level level) {
146-
loggers.forEach(logger -> logger.setLevel(level));
149+
loggers.forEach((name, logger) -> logger.setLevel(level));
147150
}
148151
}

openhtmltopdf-core/src/main/java/com/openhtmltopdf/util/LogMessageId.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ public interface LogMessageId {
55
Enum<?> getEnum();
66
String getWhere();
77
String getMessageFormat();
8+
String formatMessage(Object[] args);
89

910
enum LogMessageId0Param implements LogMessageId {
1011
CSS_PARSE_MUST_PROVIDE_AT_LEAST_A_FONT_FAMILY_AND_SRC_IN_FONT_FACE_RULE(XRLog.CSS_PARSE, "Must provide at least a font-family and src in @font-face rule"),
@@ -81,6 +82,10 @@ public String getWhere() {
8182
return where;
8283
}
8384

85+
@Override
86+
public String formatMessage(Object[] args) {
87+
return getMessageFormat();
88+
}
8489
}
8590

8691
enum LogMessageId1Param implements LogMessageId {
@@ -160,10 +165,12 @@ enum LogMessageId1Param implements LogMessageId {
160165

161166
private final String where;
162167
private final String messageFormat;
168+
private final LogMessageIdFormat logMessageIdFormat;
163169

164170
LogMessageId1Param(String where, String messageFormat) {
165171
this.where = where;
166172
this.messageFormat = messageFormat;
173+
this.logMessageIdFormat = new LogMessageIdFormat(messageFormat);
167174
}
168175

169176
@Override
@@ -180,6 +187,11 @@ public String getMessageFormat() {
180187
public String getWhere() {
181188
return where;
182189
}
190+
191+
@Override
192+
public String formatMessage(Object[] args) {
193+
return logMessageIdFormat.formatMessage(args);
194+
}
183195
}
184196

185197
enum LogMessageId2Param implements LogMessageId {
@@ -216,10 +228,12 @@ enum LogMessageId2Param implements LogMessageId {
216228

217229
private final String where;
218230
private final String messageFormat;
231+
private final LogMessageIdFormat logMessageIdFormat;
219232

220233
LogMessageId2Param(String where, String messageFormat) {
221234
this.where = where;
222235
this.messageFormat = messageFormat;
236+
this.logMessageIdFormat = new LogMessageIdFormat(messageFormat);
223237
}
224238

225239
@Override
@@ -232,6 +246,11 @@ public String getMessageFormat() {
232246
return messageFormat;
233247
}
234248

249+
@Override
250+
public String formatMessage(Object[] args) {
251+
return logMessageIdFormat.formatMessage(args);
252+
}
253+
235254
@Override
236255
public String getWhere() {
237256
return where;
@@ -252,10 +271,12 @@ enum LogMessageId3Param implements LogMessageId {
252271

253272
private final String where;
254273
private final String messageFormat;
274+
private final LogMessageIdFormat logMessageIdFormat;
255275

256276
LogMessageId3Param(String where, String messageFormat) {
257277
this.where = where;
258278
this.messageFormat = messageFormat;
279+
this.logMessageIdFormat = new LogMessageIdFormat(messageFormat);
259280
}
260281

261282
@Override
@@ -272,6 +293,11 @@ public String getMessageFormat() {
272293
public String getWhere() {
273294
return where;
274295
}
296+
297+
@Override
298+
public String formatMessage(Object[] args) {
299+
return logMessageIdFormat.formatMessage(args);
300+
}
275301
}
276302

277303
enum LogMessageId4Param implements LogMessageId {
@@ -286,10 +312,12 @@ enum LogMessageId4Param implements LogMessageId {
286312

287313
private final String where;
288314
private final String messageFormat;
315+
private final LogMessageIdFormat logMessageIdFormat;
289316

290317
LogMessageId4Param(String where, String messageFormat) {
291318
this.where = where;
292319
this.messageFormat = messageFormat;
320+
this.logMessageIdFormat = new LogMessageIdFormat(messageFormat);
293321
}
294322

295323
@Override
@@ -306,6 +334,11 @@ public String getMessageFormat() {
306334
public String getWhere() {
307335
return where;
308336
}
337+
338+
@Override
339+
public String formatMessage(Object[] args) {
340+
return logMessageIdFormat.formatMessage(args);
341+
}
309342
}
310343

311344
enum LogMessageId5Param implements LogMessageId {
@@ -314,10 +347,12 @@ enum LogMessageId5Param implements LogMessageId {
314347

315348
private final String where;
316349
private final String messageFormat;
350+
private final LogMessageIdFormat logMessageIdFormat;
317351

318352
LogMessageId5Param(String where, String messageFormat) {
319353
this.where = where;
320354
this.messageFormat = messageFormat;
355+
this.logMessageIdFormat = new LogMessageIdFormat(messageFormat);
321356
}
322357

323358
@Override
@@ -335,5 +370,10 @@ public String getWhere() {
335370
return where;
336371
}
337372

373+
@Override
374+
public String formatMessage(Object[] args) {
375+
return logMessageIdFormat.formatMessage(args);
376+
}
377+
338378
}
339379
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.openhtmltopdf.util;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
6+
class LogMessageIdFormat {
7+
8+
private final Object PLACEHOLDER = new Object();
9+
10+
11+
private final List<Object> tokens;
12+
13+
LogMessageIdFormat(String message) {
14+
this.tokens = prepareFormatter(message);
15+
}
16+
17+
private List<Object> prepareFormatter(String messageFormat) {
18+
List<Object> v = new ArrayList<>();
19+
int idx = 0;
20+
while(true) {
21+
int newIdx = messageFormat.indexOf("{}", idx);
22+
String messageSegment = newIdx == -1 ? messageFormat.substring(idx) : messageFormat.substring(idx, newIdx);
23+
if (!messageSegment.isEmpty()) {
24+
v.add(messageSegment);
25+
}
26+
if (newIdx == -1) {
27+
break;
28+
}
29+
idx = newIdx + 2;
30+
v.add(PLACEHOLDER);
31+
}
32+
return v;
33+
}
34+
35+
String formatMessage(Object[] args) {
36+
StringBuilder sb = new StringBuilder();
37+
int size = tokens.size();
38+
int argsUse = 0;
39+
for (int i = 0; i < size; i++) {
40+
Object f = tokens.get(i);
41+
if (f == PLACEHOLDER) {
42+
Object argument = args[argsUse];
43+
sb.append(argument);
44+
argsUse++;
45+
} else {
46+
sb.append(f);
47+
}
48+
}
49+
return sb.toString();
50+
}
51+
}

0 commit comments

Comments
 (0)