1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.server.core.event;
21
22
23 import javax.naming.NamingException;
24
25 import org.apache.directory.server.core.entry.ServerEntry;
26 import org.apache.directory.server.schema.registries.AttributeTypeRegistry;
27 import org.apache.directory.server.schema.registries.OidRegistry;
28 import org.apache.directory.shared.ldap.filter.AndNode;
29 import org.apache.directory.shared.ldap.filter.BranchNode;
30 import org.apache.directory.shared.ldap.filter.ExprNode;
31 import org.apache.directory.shared.ldap.filter.NotNode;
32 import org.apache.directory.shared.ldap.filter.OrNode;
33
34
35
36
37
38
39
40
41
42 public class ExpressionEvaluator implements Evaluator
43 {
44
45 private LeafEvaluator leafEvaluator;
46
47
48
49
50
51
52
53
54
55
56
57
58 public ExpressionEvaluator(LeafEvaluator leafEvaluator)
59 {
60 this.leafEvaluator = leafEvaluator;
61 }
62
63
64
65
66
67
68
69
70
71 public ExpressionEvaluator(OidRegistry oidRegistry, AttributeTypeRegistry attributeTypeRegistry)
72 {
73 SubstringEvaluator substringEvaluator = null;
74 substringEvaluator = new SubstringEvaluator( oidRegistry, attributeTypeRegistry );
75 leafEvaluator = new LeafEvaluator( oidRegistry, attributeTypeRegistry, substringEvaluator );
76 }
77
78
79
80
81
82
83
84 public LeafEvaluator getLeafEvaluator()
85 {
86 return leafEvaluator;
87 }
88
89
90
91
92
93
94
95
96
97 public boolean evaluate( ExprNode node, String dn, ServerEntry entry ) throws NamingException
98 {
99 if ( node.isLeaf() )
100 {
101 return leafEvaluator.evaluate( node, dn, entry );
102 }
103
104 BranchNode bnode = ( BranchNode ) node;
105
106 if ( bnode instanceof OrNode )
107 {
108 for ( ExprNode child: bnode.getChildren() )
109 {
110 if ( evaluate( child, dn, entry ) )
111 {
112 return true;
113 }
114 }
115
116 return false;
117 }
118 else if ( bnode instanceof AndNode )
119 {
120 for ( ExprNode child: bnode.getChildren() )
121 {
122 if ( !evaluate( child, dn, entry ) )
123 {
124 return false;
125 }
126 }
127
128 return true;
129 }
130 else if ( bnode instanceof NotNode )
131 {
132 if ( null != bnode.getFirstChild() )
133 {
134 return !evaluate( bnode.getFirstChild(), dn, entry );
135 }
136
137 throw new NamingException( "Negation has no child: " + node );
138 }
139 else
140 {
141 throw new NamingException( "Unrecognized branch node operator: " + bnode );
142 }
143 }
144 }