1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j;
18
19 import java.util.concurrent.ConcurrentHashMap;
20 import java.util.concurrent.ConcurrentMap;
21
22
23
24
25
26
27 public final class MarkerManager {
28
29 private static ConcurrentMap<String, Marker> markerMap = new ConcurrentHashMap<String, Marker>();
30
31 private MarkerManager() {
32 }
33
34
35
36
37
38
39 public static Marker getMarker(final String name) {
40 markerMap.putIfAbsent(name, new Log4JMarker(name));
41 return markerMap.get(name);
42 }
43
44
45
46
47
48
49
50
51 public static Marker getMarker(final String name, final String parent) {
52 final Marker parentMarker = markerMap.get(parent);
53 if (parentMarker == null) {
54 throw new IllegalArgumentException("Parent Marker " + parent + " has not been defined");
55 }
56 return getMarker(name, parentMarker);
57 }
58
59
60
61
62
63
64
65 public static Marker getMarker(final String name, final Marker parent) {
66 markerMap.putIfAbsent(name, new Log4JMarker(name, parent));
67 return markerMap.get(name);
68 }
69
70
71
72
73 private static class Log4JMarker implements Marker {
74
75 private static final long serialVersionUID = 100L;
76
77 private final String name;
78 private final Marker parent;
79
80 public Log4JMarker(final String name) {
81 this.name = name;
82 this.parent = null;
83 }
84
85 public Log4JMarker(final String name, final Marker parent) {
86 this.name = name;
87 this.parent = parent;
88 }
89
90 public String getName() {
91 return this.name;
92 }
93
94 public Marker getParent() {
95 return this.parent;
96 }
97
98 public boolean isInstanceOf(final Marker m) {
99 if (m == null) {
100 throw new IllegalArgumentException("A marker parameter is required");
101 }
102 Marker test = this;
103 do {
104 if (test == m) {
105 return true;
106 }
107 test = test.getParent();
108 } while (test != null);
109 return false;
110 }
111
112 public boolean isInstanceOf(final String name) {
113 if (name == null) {
114 throw new IllegalArgumentException("A marker name is required");
115 }
116 Marker toTest = this;
117 do {
118 if (name.equals(toTest.getName())) {
119 return true;
120 }
121 toTest = toTest.getParent();
122 } while (toTest != null);
123 return false;
124 }
125
126 @Override
127 public boolean equals(final Object o) {
128 if (this == o) {
129 return true;
130 }
131 if (o == null || !(o instanceof Marker)) {
132 return false;
133 }
134
135 final Marker marker = (Marker) o;
136
137 if (name != null ? !name.equals(marker.getName()) : marker.getName() != null) {
138 return false;
139 }
140
141 return true;
142 }
143
144 @Override
145 public int hashCode() {
146 return name != null ? name.hashCode() : 0;
147 }
148
149 @Override
150 public String toString() {
151 final StringBuilder sb = new StringBuilder(name);
152 if (parent != null) {
153 Marker m = parent;
154 sb.append("[ ");
155 boolean first = true;
156 while (m != null) {
157 if (!first) {
158 sb.append(", ");
159 }
160 sb.append(m.getName());
161 first = false;
162 m = m.getParent();
163 }
164 sb.append(" ]");
165 }
166 return sb.toString();
167 }
168 }
169 }