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    }