001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 *
019 */
020 package org.apache.directory.server.schema.bootstrap;
021
022
023 import java.util.Comparator;
024
025 import javax.naming.NamingException;
026
027 import org.apache.directory.server.schema.DnComparator;
028 import org.apache.directory.server.schema.NameAndOptionalUIDComparator;
029 import org.apache.directory.server.schema.NameAndOptionalUIDNormalizer;
030 import org.apache.directory.server.schema.bootstrap.ProducerTypeEnum;
031 import org.apache.directory.server.schema.registries.Registries;
032 import org.apache.directory.shared.ldap.constants.SchemaConstants;
033 import org.apache.directory.shared.ldap.schema.comparators.ByteArrayComparator;
034 import org.apache.directory.shared.ldap.schema.comparators.ComparableComparator;
035 import org.apache.directory.shared.ldap.schema.comparators.IntegerOrderingComparator;
036 import org.apache.directory.shared.ldap.schema.comparators.NormalizingComparator;
037 import org.apache.directory.shared.ldap.schema.comparators.ObjectIdentifierComparator;
038 import org.apache.directory.shared.ldap.schema.comparators.TelephoneNumberComparator;
039 import org.apache.directory.shared.ldap.schema.normalizers.CachingNormalizer;
040 import org.apache.directory.shared.ldap.schema.normalizers.DeepTrimNormalizer;
041 import org.apache.directory.shared.ldap.schema.normalizers.DeepTrimToLowerNormalizer;
042
043
044 /**
045 * Document this class.
046 *
047 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
048 * @version $Rev: 803313 $
049 */
050 public class SystemComparatorProducer extends AbstractBootstrapProducer
051 {
052 public SystemComparatorProducer()
053 {
054 super( ProducerTypeEnum.COMPARATOR_PRODUCER );
055 }
056
057
058 public static class DeepTrimToLowerCachingNormalizingComparator extends NormalizingComparator
059 {
060 public DeepTrimToLowerCachingNormalizingComparator()
061 {
062 super( new CachingNormalizer( new DeepTrimToLowerNormalizer() ), new ComparableComparator() );
063 }
064 }
065
066
067 public static class DeepTrimCachingNormalizingComparator extends NormalizingComparator
068 {
069 public DeepTrimCachingNormalizingComparator()
070 {
071 super( new CachingNormalizer( new DeepTrimNormalizer() ), new ComparableComparator() );
072 }
073 }
074
075 /**
076 * This caching NormalizingComparator would be a good thing to have,
077 * sadly we can't use it as the registries are not available here ...
078 *
079 * TODO Inject the AttributeType registry into the caching normalizer.
080 */
081 public static class NameAndOptionalUIDCachingNormalizingComparator extends NormalizingComparator
082 {
083 public NameAndOptionalUIDCachingNormalizingComparator()
084 {
085 super( new CachingNormalizer( NameAndOptionalUIDNormalizer.INSTANCE ), new NameAndOptionalUIDComparator() );
086 }
087 }
088
089
090 // ------------------------------------------------------------------------
091 // BootstrapProducer Methods
092 // We need comparators for
093 // o objectIdentifierMatch 2.5.13.0 (ObjectIdentifierComparator)
094 // o distinguishedNameMatch 2.5.13.1 (DnComparator)
095 // o caseIgnoreMatch 2.5.13.2 (DeepTrimToLowerCachingNormalizingComparator)
096 // o caseIgnoreOrderingMatch 2.5.13.3 (DeepTrimToLowerCachingNormalizingComparator)
097 // o caseIgnoreSubstringsMatch 2.5.13.4 (DeepTrimToLowerCachingNormalizingComparator)
098 // o caseExactMatch 2.5.13.5 (DeepTrimCachingNormalizingComparator)
099 // o caseExactOrderingMatch 2.5.13.6 (ComparableComparator)
100 // o caseExactSubstringsMatch 2.5.13.7 (DeepTrimCachingNormalizingComparator)
101 // o numericStringMatch 2.5.13.8 (ComparableComparator)
102 // o numericStringOrderingMatch 2.5.13.9 (ComparableComparator)
103 // o numericStringSubstringsMatch 2.5.13.10 (ComparableComparator)
104 // o caseIgnoreListMatch 2.5.13.11 (DeepTrimToLowerCachingNormalizingComparator)
105 // o caseIgnoreListSubstringsMatch 2.5.13.12 (DeepTrimToLowerCachingNormalizingComparator)
106 // o booleanMatch 2.5.13.13 (ComparableComparator)
107 // o integerMatch 2.5.13.14 (ComparableComparator)
108 // o integerOrderingMatch 2.5.13.15 (IntegerOrderingComparator)
109 // o bitStringMatch 2.5.13.16 (ComparableComparator)
110 // o octetStringMatch 2.5.13.17 (ByteArrayComparator)
111 // o octetStringOrderingMatch 2.5.13.18 (ByteArrayComparator)
112 // o octetStringSubstringsMatch 2.5.13.19 (ByteArrayComparator)
113 // o telephoneNumberMatch 2.5.13.20 (TelephoneNumberComparator)
114 // o telephoneNumberSubstringsMatch 2.5.13.21 (ComparableComparator)
115 // o presentationAddressMatch 2.5.13.22 (ComparableComparator)
116 // o uniqueMemberMatch 2.5.13.23 (NameAndOptionalUIDComparator)
117 // o protocolInformationMatch 2.5.13.24 (ComparableComparator)
118 // o generalizedTimeMatch 2.5.13.27 (ComparableComparator)
119 // o generalizedTimeOrderingMatch 2.5.13.28 (ComparableComparator)
120 // o integerFirstComponentMatch 2.5.13.29 (ComparableComparator)
121 // o objectIdentifierFirstComponentMatch 2.5.13.30 (ComparableComparator)
122 // o directoryStringFirstComponentMatch 2.5.13.31 (ComparableComparator)
123 // o wordMatch 2.5.13.32 (ComparableComparator)
124 // o keywordMatch 2.5.13.33 (ComparableComparator)
125 // o caseExactIA5Match 1.3.6.1.4.1.1466.109.114.1 (DeepTrimCachingNormalizingComparator)
126 // o caseIgnoreIA5Match 1.3.6.1.4.1.1466.109.114.2 (DeepTrimToLowerCachingNormalizingComparator)
127 // o caseIgnoreIA5SubstringsMatch 1.3.6.1.4.1.1466.109.114.3 (DeepTrimToLowerCachingNormalizingComparator)
128 // ------------------------------------------------------------------------
129
130
131 /**
132 * {@inheritDoc}
133 */
134 public void produce( Registries registries, ProducerCallback cb ) throws NamingException
135 {
136 Comparator comparator;
137
138 /*
139 * Straight out of RFC 4517
140 * =======================================
141 * ( 2.5.13.0 NAME 'objectIdentifierMatch'
142 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )
143 */
144 comparator = new ObjectIdentifierComparator();
145 cb.schemaObjectProduced( this, SchemaConstants.OBJECT_IDENTIFIER_MATCH_MR_OID, comparator );
146
147 /*
148 * ( 2.5.13.1 NAME 'distinguishedNameMatch'
149 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.12 )
150 */
151 comparator = new DnComparator( registries.getAttributeTypeRegistry() );
152 cb.schemaObjectProduced( this, SchemaConstants.DISTINGUISHED_NAME_MATCH_MR_OID, comparator );
153
154 /*
155 * ( 2.5.13.2 NAME 'caseIgnoreMatch'
156 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
157 */
158 comparator = new DeepTrimToLowerCachingNormalizingComparator();
159 cb.schemaObjectProduced( this, SchemaConstants.CASE_IGNORE_MATCH_MR_OID, comparator );
160
161 /*
162 * ( 2.5.13.3 NAME 'caseIgnoreOrderingMatch'
163 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
164 */
165 comparator = new DeepTrimToLowerCachingNormalizingComparator();
166 cb.schemaObjectProduced( this, SchemaConstants.CASE_IGNORE_ORDERING_MATCH_MR_OID, comparator );
167
168 /*
169 * ( 2.5.13.4 NAME 'caseIgnoreSubstringsMatch'
170 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )
171 */
172 comparator = new DeepTrimToLowerCachingNormalizingComparator();
173 cb.schemaObjectProduced( this, SchemaConstants.CASE_IGNORE_SUBSTRING_MATCH_MR_OID, comparator );
174
175 /*
176 * ( 2.5.13.5 NAME 'caseExactMatch'
177 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
178 */
179 comparator = new DeepTrimCachingNormalizingComparator();
180 cb.schemaObjectProduced( this, SchemaConstants.CASE_EXACT_MATCH_MR_OID, comparator );
181
182 /*
183 * ( 2.5.13.6 NAME 'caseExactOrderingMatch'
184 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
185 */
186 comparator = new ComparableComparator();
187 cb.schemaObjectProduced( this, SchemaConstants.CASE_EXACT_ORDERING_MATCH_MR_OID, comparator );
188
189 /*
190 * ( 2.5.13.7 NAME 'caseExactSubstringsMatch'
191 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )
192 */
193 comparator = new DeepTrimCachingNormalizingComparator();
194 cb.schemaObjectProduced( this, SchemaConstants.CASE_EXACT_SUBSTRING_MATCH_MR_OID, comparator );
195
196 /*
197 * ( 2.5.13.8 NAME 'numericStringMatch'
198 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )
199 */
200 comparator = new ComparableComparator();
201 cb.schemaObjectProduced( this, SchemaConstants.NUMERIC_STRING_MATCH_MR_OID, comparator );
202
203 /*
204 * ( 2.5.13.9 NAME 'numericStringOrderingMatch'
205 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.36 )
206 */
207 comparator = new ComparableComparator();
208 cb.schemaObjectProduced( this, SchemaConstants.NUMERIC_STRING_ORDERING_MATCH_MR_OID, comparator );
209
210 /*
211 * ( 2.5.13.10 NAME 'numericStringSubstringsMatch'
212 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )
213 */
214 comparator = new ComparableComparator();
215 cb.schemaObjectProduced( this, SchemaConstants.NUMERIC_STRING_SUBSTRINGS_MATCH_MR_OID, comparator );
216
217 /*
218 * ( 2.5.13.11 NAME 'caseIgnoreListMatch'
219 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.41 )
220 */
221 comparator = new DeepTrimToLowerCachingNormalizingComparator();
222 cb.schemaObjectProduced( this, SchemaConstants.CASE_IGNORE_LIST_MATCH_MR_OID, comparator );
223
224 /*
225 * ( 2.5.13.12 NAME 'caseIgnoreListSubstringsMatch'
226 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )
227 */
228 comparator = new DeepTrimToLowerCachingNormalizingComparator();
229 cb.schemaObjectProduced( this, SchemaConstants.CASE_IGNORE_LIST_SUBSTRINGS_MATCH_MR_OID, comparator );
230
231 /*
232 * ( 2.5.13.13 NAME 'booleanMatch'
233 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 )
234 */
235 comparator = new ComparableComparator();
236 cb.schemaObjectProduced( this, SchemaConstants.BOOLEAN_MATCH_MR_OID, comparator );
237
238 /*
239 * ( 2.5.13.14 NAME 'integerMatch'
240 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
241 */
242 comparator = new ComparableComparator();
243 cb.schemaObjectProduced( this, SchemaConstants.INTEGER_MATCH_MR_OID, comparator );
244
245 /*
246 * ( 2.5.13.15 NAME 'integerOrderingMatch'
247 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
248 */
249 comparator = new IntegerOrderingComparator();
250 cb.schemaObjectProduced( this, SchemaConstants.INTEGER_ORDERING_MATCH_MR_OID, comparator );
251
252 /*
253 * ( 2.5.13.16 NAME 'bitStringMatch'
254 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.6 )
255 */
256 comparator = new ComparableComparator();
257 cb.schemaObjectProduced( this, SchemaConstants.BIT_STRING_MATCH_MR_OID, comparator );
258
259 /*
260 * ( 2.5.13.17 NAME 'octetStringMatch'
261 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
262 */
263 comparator = new ByteArrayComparator();
264 cb.schemaObjectProduced( this, SchemaConstants.OCTET_STRING_MATCH_MR_OID, comparator );
265
266 /*
267 * ( 2.5.13.18 NAME 'octetStringOrderingMatch'
268 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
269 */
270 comparator = new ByteArrayComparator();
271 cb.schemaObjectProduced( this, SchemaConstants.OCTET_STRING_ORDERING_MATCH_MR_OID, comparator );
272
273 /*
274 * ( 2.5.13.19 NAME 'octetStringSubstringsMatch'
275 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
276 */
277 comparator = new ByteArrayComparator();
278 cb.schemaObjectProduced( this, SchemaConstants.OCTET_STRING_SUBSTRINGS_MATCH_MR_OID, comparator );
279
280 /*
281 * ( 2.5.13.20 NAME 'telephoneNumberMatch'
282 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.50 )
283 */
284 comparator = new TelephoneNumberComparator();
285 cb.schemaObjectProduced( this, SchemaConstants.TELEPHONE_NUMBER_MATCH_MR_OID, comparator );
286
287 /*
288 * ( 2.5.13.21 NAME 'telephoneNumberSubstringsMatch'
289 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )
290 */
291 comparator = new ComparableComparator();
292 cb.schemaObjectProduced( this, SchemaConstants.TELEPHONE_NUMBER_SUBSTRINGS_MATCH_MR_OID, comparator );
293
294 /*
295 * ( 2.5.13.22 NAME 'presentationAddressMatch'
296 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.43 )
297 */
298 comparator = new ComparableComparator();
299 cb.schemaObjectProduced( this, SchemaConstants.PRESENTATION_ADDRESS_MATCH_MATCH_MR_OID, comparator );
300
301 /*
302 * ( 2.5.13.23 NAME 'uniqueMemberMatch'
303 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.34 )
304 */
305 comparator = new NameAndOptionalUIDComparator();
306 cb.schemaObjectProduced( this,SchemaConstants.UNIQUE_MEMBER_MATCH_MATCH_MR_OID, comparator );
307
308 /*
309 * ( 2.5.13.24 NAME 'protocolInformationMatch'
310 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.42 )
311 */
312 comparator = new ComparableComparator();
313 cb.schemaObjectProduced( this, SchemaConstants.PROTOCOL_INFORMATION_MATCH_MATCH_MR_OID, comparator );
314
315 // 2.5.13.25 is not defined...
316
317 // 2.5.13.26 is not defined...
318
319 /*
320 * ( 2.5.13.27 NAME 'generalizedTimeMatch'
321 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )
322 */
323 comparator = new ComparableComparator();
324 cb.schemaObjectProduced( this, SchemaConstants.GENERALIZED_TIME_MATCH_MR_OID, comparator );
325
326 /*
327 * ( 2.5.13.28 NAME 'generalizedTimeOrderingMatch'
328 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )
329 */
330 comparator = new ComparableComparator();
331 cb.schemaObjectProduced( this, SchemaConstants.GENERALIZED_TIME_ORDERING_MATCH_MR_OID, comparator );
332
333 /*
334 * ( 2.5.13.29 NAME 'integerFirstComponentMatch'
335 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
336 */
337 comparator = new ComparableComparator();
338 cb.schemaObjectProduced( this, SchemaConstants.INTEGER_FIRST_COMPONENT_MATCH_MR_OID, comparator );
339
340 /*
341 * ( 2.5.13.30 NAME 'objectIdentifierFirstComponentMatch'
342 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.38 )
343 */
344 comparator = new ComparableComparator();
345 cb.schemaObjectProduced( this, SchemaConstants.OBJECT_IDENTIFIER_FIRST_COMPONENT_MATCH_MR_OID, comparator );
346
347 /*
348 * ( 2.5.13.31 NAME 'directoryStringFirstComponentMatch'
349 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
350 */
351 comparator = new ComparableComparator();
352 cb.schemaObjectProduced( this, SchemaConstants.DIRECTORY_STRING_FIRST_COMPONENT_MATCH_MR_OID, comparator );
353
354 /*
355 * ( 2.5.13.32 NAME 'wordMatch'
356 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
357 */
358 comparator = new ComparableComparator();
359 cb.schemaObjectProduced( this, SchemaConstants.WORD_MATCH_MR_OID, comparator );
360
361 /*
362 * ( 2.5.13.33 NAME 'keywordMatch'
363 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 )
364 */
365 comparator = new ComparableComparator();
366 cb.schemaObjectProduced( this, SchemaConstants.KEYWORD_MATCH_MR_OID, comparator );
367
368 /*
369 * ( 1.3.6.1.4.1.1466.109.114.1 NAME 'caseExactIA5Match'
370 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
371 */
372 comparator = new DeepTrimCachingNormalizingComparator();
373 cb.schemaObjectProduced( this, SchemaConstants.CASE_EXACT_IA5_MATCH_MR_OID, comparator );
374
375 /*
376 * ( 1.3.6.1.4.1.1466.109.114.2 NAME 'caseIgnoreIA5Match'
377 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
378 */
379 comparator = new DeepTrimToLowerCachingNormalizingComparator();
380 cb.schemaObjectProduced( this, SchemaConstants.CASE_IGNORE_IA5_MATCH_MR_OID, comparator );
381
382 /*
383 * ( 1.3.6.1.4.1.1466.109.114.3 NAME 'caseIgnoreIA5SubstringsMatch'
384 * SYNTAX 1.3.6.1.4.1.1466.115.121.1.58 )
385 */
386 comparator = new DeepTrimToLowerCachingNormalizingComparator();
387 cb.schemaObjectProduced( this, SchemaConstants.CASE_IGNORE_IA5_SUBSTRINGS_MATCH_MR_OID, comparator );
388 }
389 }