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
021package org.apache.directory.ldap.client.api;
022
023
024import java.io.IOException;
025import java.text.ParseException;
026import java.util.ArrayList;
027import java.util.List;
028import java.util.Set;
029
030import org.apache.directory.api.ldap.model.constants.MetaSchemaConstants;
031import org.apache.directory.api.ldap.model.constants.SchemaConstants;
032import org.apache.directory.api.ldap.model.entry.Attribute;
033import org.apache.directory.api.ldap.model.entry.DefaultEntry;
034import org.apache.directory.api.ldap.model.entry.Entry;
035import org.apache.directory.api.ldap.model.entry.Value;
036import org.apache.directory.api.ldap.model.exception.LdapException;
037import org.apache.directory.api.ldap.model.exception.LdapInvalidAttributeValueException;
038import org.apache.directory.api.ldap.model.name.Dn;
039import org.apache.directory.api.ldap.model.schema.AttributeType;
040import org.apache.directory.api.ldap.model.schema.AttributesFactory;
041import org.apache.directory.api.ldap.model.schema.DitContentRule;
042import org.apache.directory.api.ldap.model.schema.DitStructureRule;
043import org.apache.directory.api.ldap.model.schema.LdapSyntax;
044import org.apache.directory.api.ldap.model.schema.MatchingRule;
045import org.apache.directory.api.ldap.model.schema.MatchingRuleUse;
046import org.apache.directory.api.ldap.model.schema.NameForm;
047import org.apache.directory.api.ldap.model.schema.ObjectClass;
048import org.apache.directory.api.ldap.model.schema.SchemaObject;
049import org.apache.directory.api.ldap.model.schema.SchemaObjectWrapper;
050import org.apache.directory.api.ldap.model.schema.parsers.AttributeTypeDescriptionSchemaParser;
051import org.apache.directory.api.ldap.model.schema.parsers.DitContentRuleDescriptionSchemaParser;
052import org.apache.directory.api.ldap.model.schema.parsers.DitStructureRuleDescriptionSchemaParser;
053import org.apache.directory.api.ldap.model.schema.parsers.LdapComparatorDescription;
054import org.apache.directory.api.ldap.model.schema.parsers.LdapComparatorDescriptionSchemaParser;
055import org.apache.directory.api.ldap.model.schema.parsers.LdapSyntaxDescriptionSchemaParser;
056import org.apache.directory.api.ldap.model.schema.parsers.MatchingRuleDescriptionSchemaParser;
057import org.apache.directory.api.ldap.model.schema.parsers.MatchingRuleUseDescriptionSchemaParser;
058import org.apache.directory.api.ldap.model.schema.parsers.NameFormDescriptionSchemaParser;
059import org.apache.directory.api.ldap.model.schema.parsers.NormalizerDescription;
060import org.apache.directory.api.ldap.model.schema.parsers.NormalizerDescriptionSchemaParser;
061import org.apache.directory.api.ldap.model.schema.parsers.ObjectClassDescriptionSchemaParser;
062import org.apache.directory.api.ldap.model.schema.parsers.SyntaxCheckerDescription;
063import org.apache.directory.api.ldap.model.schema.parsers.SyntaxCheckerDescriptionSchemaParser;
064import org.apache.directory.api.ldap.model.schema.registries.AbstractSchemaLoader;
065import org.apache.directory.api.ldap.model.schema.registries.DefaultSchema;
066import org.apache.directory.api.ldap.model.schema.registries.Schema;
067import org.apache.directory.api.util.Base64;
068import org.apache.directory.api.util.Strings;
069import org.apache.directory.ldap.client.api.exception.InvalidConnectionException;
070import org.slf4j.Logger;
071import org.slf4j.LoggerFactory;
072
073
074/**
075 * A schema loader which uses LdapConnection to load schema from a ApacheDS serveur
076 *
077 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
078 */
079public class DefaultSchemaLoader extends AbstractSchemaLoader
080{
081    private static final String DEFAULT_APACHEDS_VENDOR_NAME = "Apache Software Foundation";
082
083    /** the logger */
084    private static final Logger LOG = LoggerFactory.getLogger( DefaultSchemaLoader.class );
085
086    /** the connection to the ldap server */
087    private LdapConnection connection;
088
089    /** the subschemaSubentry DN */
090    private Dn subschemaSubentryDn;
091
092    /** The SubschemaSubentry descriptions parsers */
093    private static AttributeTypeDescriptionSchemaParser AT_DESCR_SCHEMA_PARSER = new AttributeTypeDescriptionSchemaParser();
094    private static DitStructureRuleDescriptionSchemaParser DSR_DESCR_SCHEMA_PARSER = new DitStructureRuleDescriptionSchemaParser();
095    private static DitContentRuleDescriptionSchemaParser DCR_DESCR_SCHEMA_PARSER = new DitContentRuleDescriptionSchemaParser();
096    private static MatchingRuleDescriptionSchemaParser MR_DESCR_SCHEMA_PARSER = new MatchingRuleDescriptionSchemaParser();
097    private static MatchingRuleUseDescriptionSchemaParser MRU_DESCR_SCHEMA_PARSER = new MatchingRuleUseDescriptionSchemaParser();
098    private static NameFormDescriptionSchemaParser NF_DESCR_SCHEMA_PARSER = new NameFormDescriptionSchemaParser();
099    private static ObjectClassDescriptionSchemaParser OC_DESCR_SCHEMA_PARSER = new ObjectClassDescriptionSchemaParser();
100    private static LdapSyntaxDescriptionSchemaParser LS_DESCR_SCHEMA_PARSER = new LdapSyntaxDescriptionSchemaParser();
101
102    private static LdapComparatorDescriptionSchemaParser C_DESCR_SCHEMA_PARSER = new LdapComparatorDescriptionSchemaParser();
103    private static NormalizerDescriptionSchemaParser N_DESCR_SCHEMA_PARSER = new NormalizerDescriptionSchemaParser();
104    private static SyntaxCheckerDescriptionSchemaParser SC_DESCR_SCHEMA_PARSER = new SyntaxCheckerDescriptionSchemaParser();
105
106
107    /**
108     * Creates a new instance of DefaultSchemaLoader.
109     *
110     * @param connection the LDAP connection
111     * @throws Exception if the connection is not authenticated or if there are any problems
112     *                   while loading the schema entries
113     */
114    public DefaultSchemaLoader( LdapConnection connection ) throws LdapException
115    {
116        if ( connection == null )
117        {
118            throw new InvalidConnectionException( "Cannot connect on the server, the connection is null" );
119        }
120
121        this.connection = connection;
122
123        // Flagging if the connection was already connected
124        boolean wasConnected = connection.isConnected();
125
126        try
127        {
128            // Connecting (if needed)
129            if ( !wasConnected )
130            {
131                connection.connect();
132            }
133
134            // Getting the subschemaSubentry DN from the rootDSE
135            Entry rootDse = connection.lookup( Dn.ROOT_DSE, SchemaConstants.SUBSCHEMA_SUBENTRY_AT,
136                SchemaConstants.VENDOR_NAME_AT );
137
138            if ( rootDse != null )
139            {
140                // Checking if this is an ApacheDS server
141                if ( isApacheDs( rootDse ) )
142                {
143                    // Getting the subSchemaSubEntry attribute
144                    Attribute subschemaSubentryAttribute = rootDse.get( SchemaConstants.SUBSCHEMA_SUBENTRY_AT );
145
146                    if ( ( subschemaSubentryAttribute != null ) && ( subschemaSubentryAttribute.size() > 0 ) )
147                    {
148                        subschemaSubentryDn = new Dn( connection.getSchemaManager(),
149                            subschemaSubentryAttribute.getString() );
150
151                        loadSchemas();
152                    }
153                }
154                else
155                {
156                    // TODO Handle schema loading on other LDAP servers
157                }
158            }
159        }
160        finally
161        {
162            // Checking if the connection needs to be closed
163            if ( ( !wasConnected ) && ( connection.isConnected() ) )
164            {
165                try
166                {
167                    connection.close();
168                }
169                catch ( IOException e )
170                {
171                    throw new LdapException( e );
172                }
173            }
174        }
175    }
176
177
178    /**
179     * Indicates if the given Root DSE corresponds to an ApacheDS server.
180     *
181     * @param rootDse the Root DSE
182     * @return <code>true</code> if this is an ApacheDS server,
183     *         <code>false</code> if not.
184     * @throws LdapInvalidAttributeValueException
185     */
186    private boolean isApacheDs( Entry rootDse ) throws LdapInvalidAttributeValueException
187    {
188        if ( rootDse != null )
189        {
190            Attribute vendorNameAttribute = rootDse.get( SchemaConstants.VENDOR_NAME_AT );
191
192            if ( ( vendorNameAttribute != null ) && vendorNameAttribute.size() == 1 )
193            {
194                return DEFAULT_APACHEDS_VENDOR_NAME.equalsIgnoreCase( vendorNameAttribute.getString() );
195            }
196        }
197
198        return false;
199    }
200
201
202    /**
203     * Creates a new instance of NetworkSchemaLoader.
204     *
205     * @param connection the LDAP connection
206     * @throws Exception if the connection is not authenticated or if there are any problems
207     *                   while loading the schema entries
208     */
209    public DefaultSchemaLoader( LdapConnection connection, Dn subschemaSubentryDn ) throws Exception
210    {
211        if ( !connection.isAuthenticated() )
212        {
213            throw new IllegalArgumentException( "connection is not authenticated" );
214        }
215
216        this.connection = connection;
217        this.subschemaSubentryDn = subschemaSubentryDn;
218
219        loadSchemas();
220    }
221
222
223    /**
224     * Load all the schemas.
225     * 
226     * @param subschemaSubentryDn
227     * @throws Exception
228     */
229    private void loadSchemas() throws LdapException
230    {
231        LOG.debug( "initializing schemas" );
232
233        // Load all the elements from the SubschemaSubentry
234        Entry subschemaSubentry = connection.lookup( subschemaSubentryDn,
235            SchemaConstants.ATTRIBUTE_TYPES_AT,
236            SchemaConstants.COMPARATORS_AT,
237            SchemaConstants.DIT_CONTENT_RULES_AT,
238            SchemaConstants.DIT_STRUCTURE_RULES_AT,
239            SchemaConstants.LDAP_SYNTAXES_AT,
240            SchemaConstants.MATCHING_RULES_AT,
241            SchemaConstants.MATCHING_RULE_USE_AT,
242            SchemaConstants.NAME_FORMS_AT,
243            SchemaConstants.NORMALIZERS_AT,
244            SchemaConstants.OBJECT_CLASSES_AT,
245            SchemaConstants.SYNTAX_CHECKERS_AT
246            );
247
248        // Load all the AT
249        Attribute attributeTypes = subschemaSubentry.get( SchemaConstants.ATTRIBUTE_TYPES_AT );
250        loadAttributeTypes( attributeTypes );
251
252        // Load all the C
253        Attribute comparators = subschemaSubentry.get( SchemaConstants.COMPARATORS_AT );
254        loadComparators( comparators );
255
256        // Load all the DCR
257        Attribute ditContentRules = subschemaSubentry.get( SchemaConstants.DIT_CONTENT_RULES_AT );
258        loadDitContentRules( ditContentRules );
259
260        // Load all the DSR
261        Attribute ditStructureRules = subschemaSubentry.get( SchemaConstants.DIT_STRUCTURE_RULES_AT );
262        loadDitStructureRules( ditStructureRules );
263
264        // Load all the LS
265        Attribute ldapSytaxes = subschemaSubentry.get( SchemaConstants.LDAP_SYNTAXES_AT );
266        loadLdapSyntaxes( ldapSytaxes );
267
268        // Load all the MR
269        Attribute matchingRules = subschemaSubentry.get( SchemaConstants.MATCHING_RULES_AT );
270        loadMatchingRules( matchingRules );
271
272        // Load all the MRU
273        Attribute matchingRuleUse = subschemaSubentry.get( SchemaConstants.MATCHING_RULE_USE_AT );
274        loadMatchingRuleUses( matchingRuleUse );
275
276        // Load all the N
277        Attribute normalizers = subschemaSubentry.get( SchemaConstants.NORMALIZERS_AT );
278        loadNormalizers( normalizers );
279
280        // Load all the NF
281        Attribute nameForms = subschemaSubentry.get( SchemaConstants.NAME_FORMS_AT );
282        loadNameForms( nameForms );
283
284        // Load all the OC
285        Attribute objectClasses = subschemaSubentry.get( SchemaConstants.OBJECT_CLASSES_AT );
286        loadObjectClasses( objectClasses );
287
288        // Load all the SC
289        Attribute syntaxCheckers = subschemaSubentry.get( SchemaConstants.SYNTAX_CHECKERS_AT );
290        loadSyntaxCheckers( syntaxCheckers );
291    }
292
293
294    /**
295     * {@inheritDoc}
296     */
297    private void loadAttributeTypes( Attribute attributeTypes ) throws LdapException
298    {
299        if ( attributeTypes == null )
300        {
301            return;
302        }
303
304        for ( Value<?> value : attributeTypes )
305        {
306            String desc = value.getString();
307
308            try
309            {
310                AttributeType attributeType = AT_DESCR_SCHEMA_PARSER.parseAttributeTypeDescription( desc );
311
312                updateSchemas( attributeType );
313            }
314            catch ( ParseException pe )
315            {
316                throw new LdapException( pe );
317            }
318        }
319    }
320
321
322    /**
323     * {@inheritDoc}
324     */
325    private void loadComparators( Attribute comparators ) throws LdapException
326    {
327        if ( comparators == null )
328        {
329            return;
330        }
331
332        for ( Value<?> value : comparators )
333        {
334            String desc = value.getString();
335
336            try
337            {
338                LdapComparatorDescription comparator = C_DESCR_SCHEMA_PARSER.parseComparatorDescription( desc );
339
340                updateSchemas( comparator );
341            }
342            catch ( ParseException pe )
343            {
344                throw new LdapException( pe );
345            }
346        }
347    }
348
349
350    /**
351     * {@inheritDoc}
352     */
353    private void loadDitContentRules( Attribute ditContentRules ) throws LdapException
354    {
355        if ( ditContentRules == null )
356        {
357            return;
358        }
359
360        for ( Value<?> value : ditContentRules )
361        {
362            String desc = value.getString();
363
364            try
365            {
366                DitContentRule ditContentRule = DCR_DESCR_SCHEMA_PARSER.parseDITContentRuleDescription( desc );
367
368                updateSchemas( ditContentRule );
369            }
370            catch ( ParseException pe )
371            {
372                throw new LdapException( pe );
373            }
374        }
375    }
376
377
378    /**
379     * {@inheritDoc}
380     */
381    private void loadDitStructureRules( Attribute ditStructureRules ) throws LdapException
382    {
383        if ( ditStructureRules == null )
384        {
385            return;
386        }
387
388        for ( Value<?> value : ditStructureRules )
389        {
390            String desc = value.getString();
391
392            try
393            {
394                DitStructureRule ditStructureRule = DSR_DESCR_SCHEMA_PARSER.parseDITStructureRuleDescription( desc );
395
396                updateSchemas( ditStructureRule );
397            }
398            catch ( ParseException pe )
399            {
400                throw new LdapException( pe );
401            }
402        }
403    }
404
405
406    /**
407     * {@inheritDoc}
408     */
409    private void loadLdapSyntaxes( Attribute ldapSyntaxes ) throws LdapException
410    {
411        if ( ldapSyntaxes == null )
412        {
413            return;
414        }
415
416        for ( Value<?> value : ldapSyntaxes )
417        {
418            String desc = value.getString();
419
420            try
421            {
422                LdapSyntax ldapSyntax = LS_DESCR_SCHEMA_PARSER.parseLdapSyntaxDescription( desc );
423
424                updateSchemas( ldapSyntax );
425            }
426            catch ( ParseException pe )
427            {
428                throw new LdapException( pe );
429            }
430        }
431    }
432
433
434    /**
435     * {@inheritDoc}
436     */
437    private void loadMatchingRules( Attribute matchingRules ) throws LdapException
438    {
439        if ( matchingRules == null )
440        {
441            return;
442        }
443
444        for ( Value<?> value : matchingRules )
445        {
446            String desc = value.getString();
447
448            try
449            {
450                MatchingRule matchingRule = MR_DESCR_SCHEMA_PARSER.parseMatchingRuleDescription( desc );
451
452                updateSchemas( matchingRule );
453            }
454            catch ( ParseException pe )
455            {
456                throw new LdapException( pe );
457            }
458        }
459    }
460
461
462    /**
463     * {@inheritDoc}
464     */
465    private void loadMatchingRuleUses( Attribute matchingRuleUses ) throws LdapException
466    {
467        if ( matchingRuleUses == null )
468        {
469            return;
470        }
471
472        for ( Value<?> value : matchingRuleUses )
473        {
474            String desc = value.getString();
475
476            try
477            {
478                MatchingRuleUse matchingRuleUse = MRU_DESCR_SCHEMA_PARSER.parseMatchingRuleUseDescription( desc );
479
480                updateSchemas( matchingRuleUse );
481            }
482            catch ( ParseException pe )
483            {
484                throw new LdapException( pe );
485            }
486        }
487    }
488
489
490    /**
491     * {@inheritDoc}
492     */
493    private void loadNameForms( Attribute nameForms ) throws LdapException
494    {
495        if ( nameForms == null )
496        {
497            return;
498        }
499
500        for ( Value<?> value : nameForms )
501        {
502            String desc = value.getString();
503
504            try
505            {
506                NameForm nameForm = NF_DESCR_SCHEMA_PARSER.parseNameFormDescription( desc );
507
508                updateSchemas( nameForm );
509            }
510            catch ( ParseException pe )
511            {
512                throw new LdapException( pe );
513            }
514        }
515    }
516
517
518    /**
519     * {@inheritDoc}
520     */
521    private void loadNormalizers( Attribute normalizers ) throws LdapException
522    {
523        if ( normalizers == null )
524        {
525            return;
526        }
527
528        for ( Value<?> value : normalizers )
529        {
530            String desc = value.getString();
531
532            try
533            {
534                NormalizerDescription normalizer = N_DESCR_SCHEMA_PARSER.parseNormalizerDescription( desc );
535
536                updateSchemas( normalizer );
537            }
538            catch ( ParseException pe )
539            {
540                throw new LdapException( pe );
541            }
542        }
543    }
544
545
546    /**
547     * {@inheritDoc}
548     */
549    private void loadObjectClasses( Attribute objectClasses ) throws LdapException
550    {
551        if ( objectClasses == null )
552        {
553            return;
554        }
555
556        for ( Value<?> value : objectClasses )
557        {
558            String desc = value.getString();
559
560            try
561            {
562                ObjectClass objectClass = OC_DESCR_SCHEMA_PARSER.parseObjectClassDescription( desc );
563
564                updateSchemas( objectClass );
565            }
566            catch ( ParseException pe )
567            {
568                throw new LdapException( pe );
569            }
570        }
571    }
572
573
574    /**
575     * {@inheritDoc}
576     */
577    private void loadSyntaxCheckers( Attribute syntaxCheckers ) throws LdapException
578    {
579        if ( syntaxCheckers == null )
580        {
581            return;
582        }
583
584        for ( Value<?> value : syntaxCheckers )
585        {
586            String desc = value.getString();
587
588            try
589            {
590                SyntaxCheckerDescription syntaxChecker = SC_DESCR_SCHEMA_PARSER.parseSyntaxCheckerDescription( desc );
591
592                updateSchemas( syntaxChecker );
593            }
594            catch ( ParseException pe )
595            {
596                throw new LdapException( pe );
597            }
598        }
599    }
600
601
602    private void updateSchemas( SchemaObject schemaObject )
603    {
604        String schemaName = schemaObject.getSchemaName();
605        Schema schema = null;
606
607        if ( Strings.isEmpty( schemaName ) || Strings.equals( "null", schemaName ) )
608        {
609            schemaName = "default";
610            schema = schemaMap.get( schemaName );
611        }
612        else
613        {
614            schema = schemaMap.get( schemaName );
615        }
616
617        if ( schema == null )
618        {
619            schema = new DefaultSchema( schemaName );
620
621            schemaMap.put( schemaName, schema );
622        }
623
624        schema.getContent().add( new SchemaObjectWrapper( schemaObject ) );
625
626    }
627
628
629    /**
630     * {@inheritDoc}
631     */
632    public List<Entry> loadAttributeTypes( Schema... schemas ) throws LdapException, IOException
633    {
634        List<Entry> attributeTypeEntries = new ArrayList<Entry>();
635
636        if ( schemas == null )
637        {
638            return attributeTypeEntries;
639        }
640
641        AttributesFactory factory = new AttributesFactory();
642
643        for ( Schema schema : schemas )
644        {
645            Set<SchemaObjectWrapper> schemaObjectWrappers = schema.getContent();
646
647            for ( SchemaObjectWrapper schemaObjectWrapper : schemaObjectWrappers )
648            {
649                SchemaObject schemaObject = schemaObjectWrapper.get();
650
651                if ( schemaObject instanceof AttributeType )
652                {
653                    AttributeType attributeType = ( AttributeType ) schemaObject;
654
655                    Entry attributeTypeEntry = factory.convert( attributeType, schema, null );
656
657                    attributeTypeEntries.add( attributeTypeEntry );
658                }
659            }
660        }
661
662        return attributeTypeEntries;
663    }
664
665
666    /**
667     * {@inheritDoc}
668     */
669    public List<Entry> loadComparators( Schema... schemas ) throws LdapException, IOException
670    {
671        List<Entry> comparatorEntries = new ArrayList<Entry>();
672
673        if ( schemas == null )
674        {
675            return comparatorEntries;
676        }
677
678        for ( Schema schema : schemas )
679        {
680            Set<SchemaObjectWrapper> schemaObjectWrappers = schema.getContent();
681
682            for ( SchemaObjectWrapper schemaObjectWrapper : schemaObjectWrappers )
683            {
684                SchemaObject schemaObject = schemaObjectWrapper.get();
685
686                if ( schemaObject instanceof LdapComparatorDescription )
687                {
688                    LdapComparatorDescription ldapComparatorDescription = ( LdapComparatorDescription ) schemaObject;
689                    Entry lcEntry = getEntry( ldapComparatorDescription );
690
691                    comparatorEntries.add( lcEntry );
692                }
693            }
694        }
695
696        return comparatorEntries;
697    }
698
699
700    /**
701     * {@inheritDoc}
702     */
703    public List<Entry> loadDitContentRules( Schema... schemas ) throws LdapException, IOException
704    {
705        List<Entry> ditContentRuleEntries = new ArrayList<Entry>();
706
707        if ( schemas == null )
708        {
709            return ditContentRuleEntries;
710        }
711
712        AttributesFactory factory = new AttributesFactory();
713
714        for ( Schema schema : schemas )
715        {
716            Set<SchemaObjectWrapper> schemaObjectWrappers = schema.getContent();
717
718            for ( SchemaObjectWrapper schemaObjectWrapper : schemaObjectWrappers )
719            {
720                SchemaObject schemaObject = schemaObjectWrapper.get();
721
722                if ( schemaObject instanceof DitContentRule )
723                {
724                    DitContentRule ditContentRule = ( DitContentRule ) schemaObject;
725
726                    Entry ditContentRuleEntry = factory.convert( ditContentRule, schema, null );
727
728                    ditContentRuleEntries.add( ditContentRuleEntry );
729                }
730            }
731        }
732
733        return ditContentRuleEntries;
734    }
735
736
737    /**
738     * {@inheritDoc}
739     */
740    public List<Entry> loadDitStructureRules( Schema... schemas ) throws LdapException, IOException
741    {
742        List<Entry> ditStructureRuleEntries = new ArrayList<Entry>();
743
744        if ( schemas == null )
745        {
746            return ditStructureRuleEntries;
747        }
748
749        AttributesFactory factory = new AttributesFactory();
750
751        for ( Schema schema : schemas )
752        {
753            Set<SchemaObjectWrapper> schemaObjectWrappers = schema.getContent();
754
755            for ( SchemaObjectWrapper schemaObjectWrapper : schemaObjectWrappers )
756            {
757                SchemaObject schemaObject = schemaObjectWrapper.get();
758
759                if ( schemaObject instanceof DitStructureRule )
760                {
761                    DitStructureRule ditStructureRule = ( DitStructureRule ) schemaObject;
762
763                    Entry ditStructureRuleEntry = factory.convert( ditStructureRule, schema, null );
764
765                    ditStructureRuleEntries.add( ditStructureRuleEntry );
766                }
767            }
768        }
769
770        return ditStructureRuleEntries;
771    }
772
773
774    /**
775     * {@inheritDoc}
776     */
777    public List<Entry> loadMatchingRuleUses( Schema... schemas ) throws LdapException, IOException
778    {
779        List<Entry> matchingRuleUseEntries = new ArrayList<Entry>();
780
781        if ( schemas == null )
782        {
783            return matchingRuleUseEntries;
784        }
785
786        AttributesFactory factory = new AttributesFactory();
787
788        for ( Schema schema : schemas )
789        {
790            Set<SchemaObjectWrapper> schemaObjectWrappers = schema.getContent();
791
792            for ( SchemaObjectWrapper schemaObjectWrapper : schemaObjectWrappers )
793            {
794                SchemaObject schemaObject = schemaObjectWrapper.get();
795
796                if ( schemaObject instanceof MatchingRuleUse )
797                {
798                    MatchingRuleUse matchingRuleUse = ( MatchingRuleUse ) schemaObject;
799
800                    Entry matchingRuleUseEntry = factory.convert( matchingRuleUse, schema, null );
801
802                    matchingRuleUseEntries.add( matchingRuleUseEntry );
803                }
804            }
805        }
806
807        return matchingRuleUseEntries;
808    }
809
810
811    /**
812     * {@inheritDoc}
813     */
814    public List<Entry> loadMatchingRules( Schema... schemas ) throws LdapException, IOException
815    {
816        List<Entry> matchingRuleEntries = new ArrayList<Entry>();
817
818        if ( schemas == null )
819        {
820            return matchingRuleEntries;
821        }
822
823        AttributesFactory factory = new AttributesFactory();
824
825        for ( Schema schema : schemas )
826        {
827            Set<SchemaObjectWrapper> schemaObjectWrappers = schema.getContent();
828
829            for ( SchemaObjectWrapper schemaObjectWrapper : schemaObjectWrappers )
830            {
831                SchemaObject schemaObject = schemaObjectWrapper.get();
832
833                if ( schemaObject instanceof MatchingRule )
834                {
835                    MatchingRule matchingRule = ( MatchingRule ) schemaObject;
836
837                    Entry matchingRuleEntry = factory.convert( matchingRule, schema, null );
838
839                    matchingRuleEntries.add( matchingRuleEntry );
840                }
841            }
842        }
843
844        return matchingRuleEntries;
845    }
846
847
848    /**
849     * {@inheritDoc}
850     */
851    public List<Entry> loadNameForms( Schema... schemas ) throws LdapException, IOException
852    {
853        List<Entry> nameFormEntries = new ArrayList<Entry>();
854
855        if ( schemas == null )
856        {
857            return nameFormEntries;
858        }
859
860        AttributesFactory factory = new AttributesFactory();
861
862        for ( Schema schema : schemas )
863        {
864            Set<SchemaObjectWrapper> schemaObjectWrappers = schema.getContent();
865
866            for ( SchemaObjectWrapper schemaObjectWrapper : schemaObjectWrappers )
867            {
868                SchemaObject schemaObject = schemaObjectWrapper.get();
869
870                if ( schemaObject instanceof NameForm )
871                {
872                    NameForm nameForm = ( NameForm ) schemaObject;
873
874                    Entry nameFormEntry = factory.convert( nameForm, schema, null );
875
876                    nameFormEntries.add( nameFormEntry );
877                }
878            }
879        }
880
881        return nameFormEntries;
882    }
883
884
885    /**
886     * {@inheritDoc}
887     */
888    public List<Entry> loadNormalizers( Schema... schemas ) throws LdapException, IOException
889    {
890        List<Entry> normalizerEntries = new ArrayList<Entry>();
891
892        if ( schemas == null )
893        {
894            return normalizerEntries;
895        }
896
897        for ( Schema schema : schemas )
898        {
899            Set<SchemaObjectWrapper> schemaObjectWrappers = schema.getContent();
900
901            for ( SchemaObjectWrapper schemaObjectWrapper : schemaObjectWrappers )
902            {
903                SchemaObject schemaObject = schemaObjectWrapper.get();
904
905                if ( schemaObject instanceof NormalizerDescription )
906                {
907                    NormalizerDescription normalizerDescription = ( NormalizerDescription ) schemaObject;
908                    Entry normalizerEntry = getEntry( normalizerDescription );
909
910                    normalizerEntries.add( normalizerEntry );
911                }
912            }
913        }
914
915        return normalizerEntries;
916    }
917
918
919    /**
920     * {@inheritDoc}
921     */
922    public List<Entry> loadObjectClasses( Schema... schemas ) throws LdapException, IOException
923    {
924        List<Entry> objectClassEntries = new ArrayList<Entry>();
925
926        if ( schemas == null )
927        {
928            return objectClassEntries;
929        }
930
931        AttributesFactory factory = new AttributesFactory();
932
933        for ( Schema schema : schemas )
934        {
935            Set<SchemaObjectWrapper> schemaObjectWrappers = schema.getContent();
936
937            for ( SchemaObjectWrapper schemaObjectWrapper : schemaObjectWrappers )
938            {
939                SchemaObject schemaObject = schemaObjectWrapper.get();
940
941                if ( schemaObject instanceof ObjectClass )
942                {
943                    ObjectClass objectClass = ( ObjectClass ) schemaObject;
944
945                    Entry objectClassEntry = factory.convert( objectClass, schema, null );
946
947                    objectClassEntries.add( objectClassEntry );
948                }
949            }
950        }
951
952        return objectClassEntries;
953    }
954
955
956    /**
957     * {@inheritDoc}
958     */
959    public List<Entry> loadSyntaxCheckers( Schema... schemas ) throws LdapException, IOException
960    {
961        List<Entry> syntaxCheckerEntries = new ArrayList<Entry>();
962
963        if ( schemas == null )
964        {
965            return syntaxCheckerEntries;
966        }
967
968        for ( Schema schema : schemas )
969        {
970            Set<SchemaObjectWrapper> schemaObjectWrappers = schema.getContent();
971
972            for ( SchemaObjectWrapper schemaObjectWrapper : schemaObjectWrappers )
973            {
974                SchemaObject schemaObject = schemaObjectWrapper.get();
975
976                if ( schemaObject instanceof SyntaxCheckerDescription )
977                {
978                    SyntaxCheckerDescription syntaxCheckerDescription = ( SyntaxCheckerDescription ) schemaObject;
979                    Entry syntaxCheckerEntry = getEntry( syntaxCheckerDescription );
980
981                    syntaxCheckerEntries.add( syntaxCheckerEntry );
982                }
983            }
984        }
985
986        return syntaxCheckerEntries;
987    }
988
989
990    /**
991     * {@inheritDoc}
992     */
993    public List<Entry> loadSyntaxes( Schema... schemas ) throws LdapException, IOException
994    {
995        List<Entry> syntaxEntries = new ArrayList<Entry>();
996
997        if ( schemas == null )
998        {
999            return syntaxEntries;
1000        }
1001
1002        AttributesFactory factory = new AttributesFactory();
1003
1004        for ( Schema schema : schemas )
1005        {
1006            Set<SchemaObjectWrapper> schemaObjectWrappers = schema.getContent();
1007
1008            for ( SchemaObjectWrapper schemaObjectWrapper : schemaObjectWrappers )
1009            {
1010                SchemaObject schemaObject = schemaObjectWrapper.get();
1011
1012                if ( schemaObject instanceof LdapSyntax )
1013                {
1014                    LdapSyntax ldapSyntax = ( LdapSyntax ) schemaObject;
1015
1016                    Entry ldapSyntaxEntry = factory.convert( ldapSyntax, schema, null );
1017
1018                    syntaxEntries.add( ldapSyntaxEntry );
1019                }
1020            }
1021        }
1022
1023        return syntaxEntries;
1024    }
1025
1026
1027    private Entry getEntry( LdapComparatorDescription comparatorDescription )
1028    {
1029        Entry entry = new DefaultEntry();
1030
1031        entry.put( SchemaConstants.OBJECT_CLASS_AT,
1032            SchemaConstants.TOP_OC,
1033            MetaSchemaConstants.META_TOP_OC,
1034            MetaSchemaConstants.META_COMPARATOR_OC );
1035
1036        entry.put( MetaSchemaConstants.M_OID_AT, comparatorDescription.getOid() );
1037        entry.put( MetaSchemaConstants.M_FQCN_AT, comparatorDescription.getFqcn() );
1038
1039        if ( comparatorDescription.getBytecode() != null )
1040        {
1041            entry.put( MetaSchemaConstants.M_BYTECODE_AT,
1042                Base64.decode( comparatorDescription.getBytecode().toCharArray() ) );
1043        }
1044
1045        if ( comparatorDescription.getDescription() != null )
1046        {
1047            entry.put( MetaSchemaConstants.M_DESCRIPTION_AT, comparatorDescription.getDescription() );
1048        }
1049
1050        return entry;
1051    }
1052
1053
1054    private Entry getEntry( SyntaxCheckerDescription syntaxCheckerDescription )
1055    {
1056        Entry entry = new DefaultEntry();
1057
1058        entry.put( SchemaConstants.OBJECT_CLASS_AT,
1059            SchemaConstants.TOP_OC,
1060            MetaSchemaConstants.META_TOP_OC,
1061            MetaSchemaConstants.META_SYNTAX_CHECKER_OC );
1062
1063        entry.put( MetaSchemaConstants.M_OID_AT, syntaxCheckerDescription.getOid() );
1064        entry.put( MetaSchemaConstants.M_FQCN_AT, syntaxCheckerDescription.getFqcn() );
1065
1066        if ( syntaxCheckerDescription.getBytecode() != null )
1067        {
1068            entry.put( MetaSchemaConstants.M_BYTECODE_AT,
1069                Base64.decode( syntaxCheckerDescription.getBytecode().toCharArray() ) );
1070        }
1071
1072        if ( syntaxCheckerDescription.getDescription() != null )
1073        {
1074            entry.put( MetaSchemaConstants.M_DESCRIPTION_AT, syntaxCheckerDescription.getDescription() );
1075        }
1076
1077        return entry;
1078    }
1079
1080
1081    private Entry getEntry( NormalizerDescription normalizerDescription )
1082    {
1083        Entry entry = new DefaultEntry();
1084
1085        entry.put( SchemaConstants.OBJECT_CLASS_AT,
1086            SchemaConstants.TOP_OC,
1087            MetaSchemaConstants.META_TOP_OC,
1088            MetaSchemaConstants.META_NORMALIZER_OC );
1089
1090        entry.put( MetaSchemaConstants.M_OID_AT, normalizerDescription.getOid() );
1091        entry.put( MetaSchemaConstants.M_FQCN_AT, normalizerDescription.getFqcn() );
1092
1093        if ( normalizerDescription.getBytecode() != null )
1094        {
1095            entry.put( MetaSchemaConstants.M_BYTECODE_AT,
1096                Base64.decode( normalizerDescription.getBytecode().toCharArray() ) );
1097        }
1098
1099        if ( normalizerDescription.getDescription() != null )
1100        {
1101            entry.put( MetaSchemaConstants.M_DESCRIPTION_AT, normalizerDescription.getDescription() );
1102        }
1103
1104        return entry;
1105    }
1106}