1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.log4j.rule;
19
20 import org.apache.log4j.spi.LoggingEvent;
21
22 import java.util.HashMap;
23 import java.util.HashSet;
24 import java.util.Iterator;
25 import java.util.Map;
26 import java.util.Set;
27 import java.util.Stack;
28
29 /***
30 * A Rule class implementing logical not.
31 *
32 * @author Scott Deboy (sdeboy@apache.org)
33 */
34 public class NotRule extends AbstractRule {
35 /***
36 * Serialization ID.
37 */
38 static final long serialVersionUID = -6827159473117969306L;
39 /***
40 * Enclosed rule.
41 */
42 private final Rule rule;
43
44 /***
45 * Create new instance.
46 * @param rule enclosed rule.
47 */
48 private NotRule(final Rule rule) {
49 super();
50 this.rule = rule;
51 }
52
53 /***
54 * Create new instance.
55 * @param rule enclosed rule.
56 * @return new rule.
57 */
58 public static Rule getRule(final Rule rule) {
59 return new NotRule(rule);
60 }
61
62 /***
63 * Create new instance from top element of stack.
64 * @param stack stack
65 * @return new rule.
66 */
67 public static Rule getRule(final Stack stack) {
68 if (stack.size() < 1) {
69 throw new IllegalArgumentException(
70 "Invalid NOT rule - expected one rule but received "
71 + stack.size());
72 }
73 Object o1 = stack.pop();
74 if (o1 instanceof Rule) {
75 Rule p1 = (Rule) o1;
76 return new NotRule(p1);
77 }
78 throw new IllegalArgumentException(
79 "Invalid NOT rule: - expected rule but received " + o1);
80 }
81
82 /*** {@inheritDoc} */
83 public boolean evaluate(final LoggingEvent event, Map matches) {
84 if (matches == null) {
85 return !(rule.evaluate(event, null));
86 }
87 Map tempMatches = new HashMap();
88 boolean result = !(rule.evaluate(event, tempMatches));
89 if (result) {
90 for (Iterator iter = tempMatches.entrySet().iterator();iter.hasNext();) {
91 Map.Entry entry = (Map.Entry)iter.next();
92 Object key = entry.getKey();
93 Set value = (Set)entry.getValue();
94 Set mainSet = (Set) matches.get(key);
95 if (mainSet == null) {
96 mainSet = new HashSet();
97 matches.put(key, mainSet);
98 }
99 mainSet.addAll(value);
100 }
101 }
102 return result;
103 }
104 }