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 @Override
48 public Object visit( ExprNode node )
49 {
50 if ( !( node instanceof BranchNode ) )
51 {
52 return null;
53 }
54
55 BranchNode branch = ( BranchNode ) node;
56
57 Comparator<ExprNode> nodeComparator = new NodeComparator();
58
59 Set<ExprNode> set = new TreeSet<>( nodeComparator );
60
61 List<ExprNode> children = branch.getChildren();
62
63 for ( ExprNode child : branch.getChildren() )
64 {
65 if ( !child.isLeaf() )
66 {
67 ExprNode newChild = ( ExprNode ) visit( child );
68
69 if ( newChild != null )
70 {
71 set.add( newChild );
72 }
73 }
74 else
75 {
76 set.add( child );
77 }
78 }
79
80 children.clear();
81
82 children.addAll( set );
83
84 return branch;
85 }
86
87
88
89
90
91 @Override
92 public boolean canVisit( ExprNode node )
93 {
94 return node instanceof BranchNode;
95 }
96
97
98
99
100
101 @Override
102 public boolean isPrefix()
103 {
104 return false;
105 }
106
107
108
109
110
111 @Override
112 public List<ExprNode> getOrder( BranchNode node, List<ExprNode> children )
113 {
114 return children;
115 }
116
117
118
119
120
121
122
123
124
125
126
127 public static String getNormalizedFilter( SchemaManager schemaManager, String filter ) throws ParseException
128 {
129 ExprNode originalNode = FilterParser.parse( schemaManager, filter );
130
131 return getNormalizedFilter( originalNode );
132 }
133
134
135
136
137
138
139
140
141
142
143 public static String getNormalizedFilter( ExprNode filter )
144 {
145 BranchNormalizedVisitor visitor = new BranchNormalizedVisitor();
146
147 ExprNode result = ( ExprNode ) visitor.visit( filter );
148
149 return result.toString().trim();
150 }
151
152
153 static class NodeComparator implements Comparator<ExprNode>
154 {
155 @Override
156 public int compare( ExprNode o1, ExprNode o2 )
157 {
158 String s1 = o1.toString();
159 String s2 = o2.toString();
160
161 return s1.compareTo( s2 );
162 }
163 }
164 }