1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.log4j.builders.layout;
18
19 import static org.apache.log4j.builders.BuilderManager.CATEGORY;
20 import static org.apache.log4j.xml.XmlConfiguration.PARAM_TAG;
21 import static org.apache.log4j.xml.XmlConfiguration.forEachElement;
22
23 import java.util.Properties;
24 import java.util.concurrent.atomic.AtomicBoolean;
25 import java.util.concurrent.atomic.AtomicReference;
26
27 import org.apache.log4j.Layout;
28 import org.apache.log4j.bridge.LayoutWrapper;
29 import org.apache.log4j.builders.AbstractBuilder;
30 import org.apache.log4j.config.PropertiesConfiguration;
31 import org.apache.log4j.xml.XmlConfiguration;
32 import org.apache.logging.log4j.Logger;
33 import org.apache.logging.log4j.core.config.plugins.Plugin;
34 import org.apache.logging.log4j.core.layout.HtmlLayout;
35 import org.apache.logging.log4j.status.StatusLogger;
36 import org.w3c.dom.Element;
37
38
39
40
41 @Plugin(name = "org.apache.log4j.HTMLLayout", category = CATEGORY)
42 public class HtmlLayoutBuilder extends AbstractBuilder implements LayoutBuilder {
43
44 private static final Logger LOGGER = StatusLogger.getLogger();
45
46 private static final String TITLE = "Title";
47 private static final String LOCATION_INFO = "LocationInfo";
48
49 public HtmlLayoutBuilder() {
50 }
51
52 public HtmlLayoutBuilder(String prefix, Properties props) {
53 super(prefix, props);
54 }
55
56
57 @Override
58 public Layout parseLayout(Element layoutElement, XmlConfiguration config) {
59 final AtomicReference<String> title = new AtomicReference<>();
60 final AtomicBoolean locationInfo = new AtomicBoolean();
61 forEachElement(layoutElement.getElementsByTagName("param"), currentElement -> {
62 if (currentElement.getTagName().equals(PARAM_TAG)) {
63 if (TITLE.equalsIgnoreCase(currentElement.getAttribute("name"))) {
64 title.set(currentElement.getAttribute("value"));
65 } else if (LOCATION_INFO.equalsIgnoreCase(currentElement.getAttribute("name"))) {
66 locationInfo.set(Boolean.parseBoolean(currentElement.getAttribute("value")));
67 }
68 }
69 });
70 return createLayout(title.get(), locationInfo.get());
71 }
72
73 @Override
74 public Layout parseLayout(PropertiesConfiguration config) {
75 String title = getProperty(TITLE);
76 boolean locationInfo = getBooleanProperty(LOCATION_INFO);
77 return createLayout(title, locationInfo);
78 }
79
80 private Layout createLayout(String title, boolean locationInfo) {
81 return new LayoutWrapper(HtmlLayout.newBuilder()
82 .withTitle(title)
83 .withLocationInfo(locationInfo)
84 .build());
85 }
86 }