1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.directory.api.ldap.model.filter;
21
22
23 import java.text.ParseException;
24 import java.util.Comparator;
25 import java.util.List;
26 import java.util.Set;
27 import java.util.TreeSet;
28
29 import org.apache.directory.api.ldap.model.schema.SchemaManager;
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 public class BranchNormalizedVisitor implements FilterVisitor
46 {
47
48
49
50 @Override
51 public Object visit( ExprNode node )
52 {
53 if ( !( node instanceof BranchNode ) )
54 {
55 return null;
56 }
57
58 BranchNode branch = ( BranchNode ) node;
59
60 Comparator<ExprNode> nodeComparator = new NodeComparator();
61
62 Set<ExprNode> set = new TreeSet<>( nodeComparator );
63
64 List<ExprNode> children = branch.getChildren();
65
66 for ( ExprNode child : branch.getChildren() )
67 {
68 if ( !child.isLeaf() )
69 {
70 ExprNode newChild = ( ExprNode ) visit( child );
71
72 if ( newChild != null )
73 {
74 set.add( newChild );
75 }
76 }
77 else
78 {
79 set.add( child );
80 }
81 }
82
83 children.clear();
84
85 children.addAll( set );
86
87 return branch;
88 }
89
90
91
92
93
94 @Override
95 public boolean canVisit( ExprNode node )
96 {
97 return node instanceof BranchNode;
98 }
99
100
101
102
103
104 @Override
105 public boolean isPrefix()
106 {
107 return false;
108 }
109
110
111
112
113
114 @Override
115 public List<ExprNode> getOrder( BranchNode node, List<ExprNode> children )
116 {
117 return children;
118 }
119
120
121
122
123
124
125
126
127
128
129
130 public static String getNormalizedFilter( SchemaManager schemaManager, String filter ) throws ParseException
131 {
132 ExprNode originalNode = FilterParser.parse( schemaManager, filter );
133
134 return getNormalizedFilter( originalNode );
135 }
136
137
138
139
140
141
142
143
144
145 public static String getNormalizedFilter( ExprNode filter )
146 {
147 BranchNormalizedVisitor visitor = new BranchNormalizedVisitor();
148
149 ExprNode result = ( ExprNode ) visitor.visit( filter );
150
151 return result.toString().trim();
152 }
153
154 static class NodeComparator implements Comparator<ExprNode>
155 {
156 @Override
157 public int compare( ExprNode o1, ExprNode o2 )
158 {
159 StringBuilder buf = new StringBuilder();
160
161 buf.setLength( 0 );
162
163 String s1;
164
165 buf.append( o1.toString() );
166
167 s1 = buf.toString();
168
169 buf.setLength( 0 );
170
171 String s2;
172
173 buf.append( o2.toString() );
174
175 s2 = buf.toString();
176
177 return s1.compareTo( s2 );
178 }
179 }
180 }