1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.logging.log4j.core.filter;
18
19 import java.util.Iterator;
20 import java.util.concurrent.TimeUnit;
21
22 import org.apache.logging.log4j.core.AbstractLifeCycle;
23 import org.apache.logging.log4j.core.Filter;
24 import org.apache.logging.log4j.core.LifeCycle2;
25 import org.apache.logging.log4j.core.LogEvent;
26 import org.apache.logging.log4j.core.config.Property;
27 import org.apache.logging.log4j.core.config.plugins.PluginElement;
28
29
30
31
32 public abstract class AbstractFilterable extends AbstractLifeCycle implements Filterable {
33
34
35
36
37
38
39 public abstract static class Builder<B extends Builder<B>> {
40
41 @PluginElement("Filter")
42 private Filter filter;
43
44
45
46 @PluginElement("Properties")
47 private Property[] propertyArray;
48
49 @SuppressWarnings("unchecked")
50 public B asBuilder() {
51 return (B) this;
52 }
53
54 public Filter getFilter() {
55 return filter;
56 }
57
58 public Property[] getPropertyArray() {
59 return propertyArray;
60 }
61
62 public B setFilter(final Filter filter) {
63 this.filter = filter;
64 return asBuilder();
65 }
66
67 public B setPropertyArray(final Property[] properties) {
68 this.propertyArray = properties;
69 return asBuilder();
70 }
71
72
73
74
75
76
77
78
79 @Deprecated
80 public B withFilter(final Filter filter) {
81 return setFilter(filter);
82 }
83
84 }
85
86
87
88
89 private volatile Filter filter;
90
91 @PluginElement("Properties")
92 private final Property[] propertyArray;
93
94 protected AbstractFilterable() {
95 this(null, Property.EMPTY_ARRAY);
96 }
97
98 protected AbstractFilterable(final Filter filter) {
99 this(filter, Property.EMPTY_ARRAY);
100 }
101
102
103
104
105 protected AbstractFilterable(final Filter filter, final Property[] propertyArray) {
106 this.filter = filter;
107 this.propertyArray = propertyArray == null ? Property.EMPTY_ARRAY : propertyArray;
108 }
109
110
111
112
113
114 @Override
115 public synchronized void addFilter(final Filter filter) {
116 if (filter == null) {
117 return;
118 }
119 if (this.filter == null) {
120 this.filter = filter;
121 } else if (this.filter instanceof CompositeFilter) {
122 this.filter = ((CompositeFilter) this.filter).addFilter(filter);
123 } else {
124 final Filter[] filters = new Filter[] {this.filter, filter};
125 this.filter = CompositeFilter.createFilters(filters);
126 }
127 }
128
129
130
131
132
133 @Override
134 public Filter getFilter() {
135 return filter;
136 }
137
138
139
140
141
142 @Override
143 public boolean hasFilter() {
144 return filter != null;
145 }
146
147
148
149
150
151
152 @Override
153 public boolean isFiltered(final LogEvent event) {
154 return filter != null && filter.filter(event) == Filter.Result.DENY;
155 }
156
157
158
159
160
161 @Override
162 public synchronized void removeFilter(final Filter filter) {
163 if (this.filter == null || filter == null) {
164 return;
165 }
166 if (this.filter == filter || this.filter.equals(filter)) {
167 this.filter = null;
168 } else if (this.filter instanceof CompositeFilter) {
169 CompositeFilter composite = (CompositeFilter) this.filter;
170 composite = composite.removeFilter(filter);
171 if (composite.size() > 1) {
172 this.filter = composite;
173 } else if (composite.size() == 1) {
174 final Iterator<Filter> iter = composite.iterator();
175 this.filter = iter.next();
176 } else {
177 this.filter = null;
178 }
179 }
180 }
181
182
183
184
185 @Override
186 public void start() {
187 this.setStarting();
188 if (filter != null) {
189 filter.start();
190 }
191 this.setStarted();
192 }
193
194
195
196
197 @Override
198 public boolean stop(final long timeout, final TimeUnit timeUnit) {
199 return stop(timeout, timeUnit, true);
200 }
201
202
203
204
205 protected boolean stop(final long timeout, final TimeUnit timeUnit, final boolean changeLifeCycleState) {
206 if (changeLifeCycleState) {
207 this.setStopping();
208 }
209 boolean stopped = true;
210 if (filter != null) {
211 if (filter instanceof LifeCycle2) {
212 stopped = ((LifeCycle2) filter).stop(timeout, timeUnit);
213 } else {
214 filter.stop();
215 stopped = true;
216 }
217 }
218 if (changeLifeCycleState) {
219 this.setStopped();
220 }
221 return stopped;
222 }
223
224 public Property[] getPropertyArray() {
225 return propertyArray;
226 }
227
228 }