You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by el...@apache.org on 2009/10/30 16:42:39 UTC

svn commit: r831341 - in /directory/shared/branches/shared-schema: ldap-schema-loader/src/main/java/org/apache/directory/shared/schema/ ldap-schema-loader/src/test/java/org/apache/directory/server/schema/ ldap/src/main/java/org/apache/directory/shared/...

Author: elecharny
Date: Fri Oct 30 15:42:39 2009
New Revision: 831341

URL: http://svn.apache.org/viewvc?rev=831341&view=rev
Log:
Added the SchemaManager interface and a default implementation + test

Added:
    directory/shared/branches/shared-schema/ldap-schema-loader/src/main/java/org/apache/directory/shared/schema/DefaultSchemaManager.java
    directory/shared/branches/shared-schema/ldap-schema-loader/src/test/java/org/apache/directory/server/schema/SchemaManagerTest.java
    directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SchemaManager.java
Modified:
    directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SchemaObject.java

Added: directory/shared/branches/shared-schema/ldap-schema-loader/src/main/java/org/apache/directory/shared/schema/DefaultSchemaManager.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap-schema-loader/src/main/java/org/apache/directory/shared/schema/DefaultSchemaManager.java?rev=831341&view=auto
==============================================================================
--- directory/shared/branches/shared-schema/ldap-schema-loader/src/main/java/org/apache/directory/shared/schema/DefaultSchemaManager.java (added)
+++ directory/shared/branches/shared-schema/ldap-schema-loader/src/main/java/org/apache/directory/shared/schema/DefaultSchemaManager.java Fri Oct 30 15:42:39 2009
@@ -0,0 +1,1125 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.shared.schema;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.naming.NamingException;
+
+import org.apache.directory.shared.ldap.NotImplementedException;
+import org.apache.directory.shared.ldap.constants.MetaSchemaConstants;
+import org.apache.directory.shared.ldap.constants.SchemaConstants;
+import org.apache.directory.shared.ldap.entry.Entry;
+import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.schema.AttributeType;
+import org.apache.directory.shared.ldap.schema.DITContentRule;
+import org.apache.directory.shared.ldap.schema.DITStructureRule;
+import org.apache.directory.shared.ldap.schema.EntityFactory;
+import org.apache.directory.shared.ldap.schema.LdapComparator;
+import org.apache.directory.shared.ldap.schema.LdapSyntax;
+import org.apache.directory.shared.ldap.schema.MatchingRule;
+import org.apache.directory.shared.ldap.schema.MatchingRuleUse;
+import org.apache.directory.shared.ldap.schema.NameForm;
+import org.apache.directory.shared.ldap.schema.Normalizer;
+import org.apache.directory.shared.ldap.schema.ObjectClass;
+import org.apache.directory.shared.ldap.schema.SchemaManager;
+import org.apache.directory.shared.ldap.schema.SyntaxChecker;
+import org.apache.directory.shared.ldap.schema.registries.Registries;
+import org.apache.directory.shared.ldap.schema.registries.Schema;
+import org.apache.directory.shared.ldap.schema.registries.SchemaLoader;
+import org.apache.directory.shared.schema.loader.ldif.SchemaEntityFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * 
+ * TODO DefaultSchemaManager.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class DefaultSchemaManager implements SchemaManager
+{
+    /** static class logger */
+    private static final Logger LOG = LoggerFactory.getLogger( DefaultSchemaManager.class );
+
+    /** The NamingContext this SchemaManager is associated with */
+    private LdapDN namingContext;
+    
+    /** The global registries for this namingContext */
+    private volatile Registries registries;
+    
+    /** The list of errors produced when loading some schema elements */
+    private List<Throwable> errors;
+    
+    /** The Schema loader used by this SchemaManager */
+    private SchemaLoader loader;
+    
+    /** the factory that generates respective SchemaObjects from LDIF entries */
+    protected final EntityFactory factory;
+    
+    /** the normalized name for the schema modification attributes */
+    private LdapDN schemaModificationAttributesDN;
+    
+    /**
+     * Creates a new instance of DefaultSchemaManager with the default schema loader
+     *
+     * @param loader
+     */
+    public DefaultSchemaManager( SchemaLoader loader ) throws Exception
+    {
+        // Default to the the root (one schemaManager for all the entries
+        namingContext = LdapDN.EMPTY_LDAPDN;
+        this.loader = loader;
+        errors = null;
+        registries = new Registries();
+        factory = new SchemaEntityFactory();
+    }
+
+    /**
+     * Creates a new instance of DefaultSchemaManager, for a specific
+     * naming context
+     *
+     * @param namingContext The associated NamingContext
+     */
+    public DefaultSchemaManager( SchemaLoader loader, LdapDN namingContext ) throws Exception
+    {
+        this.namingContext = namingContext;
+        this.loader = loader;
+        errors = null;
+        registries = new Registries();
+        factory = new SchemaEntityFactory();
+    }
+
+    
+    //-----------------------------------------------------------------------
+    // Helper methods
+    //-----------------------------------------------------------------------
+    /**
+     * Clone the registries before doing any modification on it. Relax it
+     * too so that we can update it. 
+     */
+    private Registries cloneRegistries() throws Exception
+    {
+        // Relax the controls at first
+        errors = new ArrayList<Throwable>();
+
+        // Clone the Registries
+        Registries clonedRegistries = registries.clone();
+        
+        // And update references. We may have errors, that may be fixed
+        // by the new loaded schemas.
+        errors = clonedRegistries.checkRefInteg();
+        
+        // Now, relax the cloned Registries if there is no error
+        clonedRegistries.setRelaxed();
+
+        return clonedRegistries;
+    }
+    
+    
+    /***
+     * Swap the registries, deleting all the schemaObjects and links from the old one
+     * to avoid memory leaks.
+     */
+    private boolean swapRegistries( Registries clonedRegistries )
+    {
+        // Check the resulting registries
+        errors = clonedRegistries.checkRefInteg();
+        
+        // if we have no more error, we can swap the registries
+        if ( errors.size() == 0 )
+        {
+            clonedRegistries.setStrict();
+            
+            // Rebuild the references
+            errors = clonedRegistries.checkRefInteg();
+
+            if ( errors.size() == 0 )
+            {
+                Registries oldRegistries = registries;
+                registries = clonedRegistries;
+
+                // Delete the old registries to avoid memory leaks
+                //destroy( oldRegistries );
+                
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
+        else
+        {
+            // We can't use this new registries.
+            return false;
+        }
+    }
+    
+    
+    /**
+     * Transform a String[] array of schema to a Schema[]
+     */
+    private Schema[] toArray( String... schemas ) throws Exception
+    {
+        Schema[] schemaArray = new Schema[schemas.length];
+        int n = 0;
+        
+        for ( String schemaName:schemas )
+        {
+            schemaArray[n++] = loader.getSchema( schemaName );
+        }
+        
+        return schemaArray;
+    }
+    
+    
+    public boolean disable( Schema... schemas )
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public boolean disable( String... schemas )
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public boolean disabledRelaxed( Schema... schemas )
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public boolean disabledRelaxed( String... schemas )
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean enable( Schema... schemas ) throws Exception
+    {
+        // Work on a cloned and relaxed registries
+        Registries clonedRegistries = cloneRegistries();
+
+        for ( Schema schema:schemas )
+        {
+            schema.enable();
+            load( clonedRegistries, schema  );
+        }
+        
+        // Swap the registries if it is consistent
+        return swapRegistries( clonedRegistries );
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public boolean enable( String... schemas ) throws Exception
+    {
+        return enable( toArray( schemas ) );
+    }
+
+    public boolean enableRelaxed( Schema... schemas )
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public boolean enableRelaxed( String... schemas )
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    
+    /**
+     * {@inheritDoc}
+     */
+    public List<Throwable> getErrors()
+    {
+        return errors;
+    }
+
+    public Registries getRegistries()
+    {
+        return registries;
+    }
+
+    public boolean isDisabledAccepter()
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean load( Schema... schemas ) throws Exception
+    {
+        // Work on a cloned and relaxed registries
+        Registries clonedRegistries = cloneRegistries();
+
+        //Load the schemas
+        for ( Schema schema : schemas )
+        {
+            load( clonedRegistries, schema  );
+        }
+
+        // Swap the registries if it is consistent
+        return swapRegistries( clonedRegistries );
+        
+    }
+
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean load( String... schemas ) throws Exception
+    {
+        return load( toArray( schemas ) );
+    }
+
+    
+    
+    
+    private void registerSchemaObjects( Schema schema, Registries registries ) throws Exception
+    {
+        registerComparators( schema, registries );
+        registerNormalizers( schema, registries );
+        registerSyntaxCheckers( schema, registries );
+        registerSyntaxes( schema, registries );
+        registerMatchingRules( schema, registries );
+        registerAttributeTypes( schema, registries );
+        registerObjectClasses( schema, registries );
+        registerMatchingRuleUses( schema, registries );
+        registerDitContentRules( schema, registries );
+        registerNameForms( schema, registries );
+        registerDitStructureRules( schema, registries );
+
+        //notifyListenerOrRegistries( schema, registries );
+    }
+    
+    /**
+     * Load the schema in the registries. We will load everything accordingly to the two flags :
+     * - isRelaxed
+     * - disabledAccepted
+     *
+     * @param registries
+     * @param schemas
+     * @return
+     * @throws Exception
+     */
+    private boolean load( Registries registries, Schema schema ) throws Exception
+    {
+        // First avoid loading twice the same schema
+        if ( registries.isSchemaLoaded( schema.getSchemaName() ) )
+        {
+            return true;
+        }
+        
+        if ( schema.isDisabled() )
+        {
+            if ( registries.isDisabledAccepted() )
+            {
+                LOG.info( "Loading {} schema: \n{}", schema.getSchemaName(), schema );
+                
+                registries.schemaLoaded( schema );
+                
+                registerSchemaObjects( schema, registries );
+            }
+            else
+            {
+                return false;
+            }
+        }
+        else
+        {
+            LOG.info( "Loading {} schema: \n{}", schema.getSchemaName(), schema );
+            
+            registries.schemaLoaded( schema );
+            registerSchemaObjects( schema, registries );
+        }
+        
+        return true;
+    }
+
+    
+    /**
+     * Register all the Schema's AttributeTypes
+     */
+    private void registerAttributeTypes( Schema schema, Registries registries ) throws Exception
+    {
+        for ( Entry entry : loader.loadAttributeTypes( schema ) )
+        {
+            registerAttributeType( registries, entry, schema );
+        }
+    }
+
+    
+    /**
+     * Register all the Schema's comparators
+     */
+    private void registerComparators( Schema schema, Registries registries ) throws Exception
+    {
+        for ( Entry entry : loader.loadComparators( schema ) )
+        {
+            registerComparator( registries, entry, schema );
+        }
+    }
+
+    
+    /**
+     * Register all the Schema's DitContentRules
+     */
+    private void registerDitContentRules( Schema schema, Registries registries ) throws Exception
+    {
+        for ( Entry entry : loader.loadDitContentRules( schema ) )
+        {
+            registerDitContentRule( registries, entry, schema );
+        }
+    }
+
+    
+    /**
+     * Register all the Schema's DitStructureRules
+     */
+    private void registerDitStructureRules( Schema schema, Registries registries ) throws Exception
+    {
+        for ( Entry entry : loader.loadDitStructureRules( schema ) )
+        {
+            registerDitStructureRule( registries, entry, schema );
+        }
+    }
+
+    
+    /**
+     * Register all the Schema's MatchingRules
+     */
+    private void registerMatchingRules( Schema schema, Registries registries ) throws Exception
+    {
+        for ( Entry entry : loader.loadMatchingRules( schema ) )
+        {
+            registerMatchingRule( registries, entry, schema );
+        }
+    }
+
+    
+    /**
+     * Register all the Schema's MatchingRuleUses
+     */
+    private void registerMatchingRuleUses( Schema schema, Registries registries ) throws Exception
+    {
+        for ( Entry entry : loader.loadMatchingRuleUses( schema ) )
+        {
+            registerMatchingRuleUse( registries, entry, schema );
+        }
+    }
+
+    
+    /**
+     * Register all the Schema's NameForms
+     */
+    private void registerNameForms( Schema schema, Registries registries ) throws Exception
+    {
+        for ( Entry entry : loader.loadNameForms( schema ) )
+        {
+            registerNameForm( registries, entry, schema );
+        }
+    }
+
+    
+    /**
+     * Register all the Schema's Normalizers
+     */
+    private void registerNormalizers( Schema schema, Registries registries ) throws Exception
+    {
+        for ( Entry entry : loader.loadNormalizers( schema ) )
+        {
+            registerNormalizer( registries, entry, schema );
+        }
+    }
+
+    
+    /**
+     * Register all the Schema's ObjectClasses
+     */
+    private void registerObjectClasses( Schema schema, Registries registries ) throws Exception
+    {
+        for ( Entry entry : loader.loadObjectClasses( schema ) )
+        {
+            registerObjectClass( registries, entry, schema );
+        }
+    }
+
+    
+    /**
+     * Register all the Schema's Syntaxes
+     */
+    private void registerSyntaxes( Schema schema, Registries registries ) throws Exception
+    {
+        for ( Entry entry : loader.loadSyntaxes( schema ) )
+        {
+            registerSyntax( registries, entry, schema );
+        }
+    }
+
+    
+    /**
+     * Register all the Schema's SyntaxCheckers
+     */
+    private void registerSyntaxCheckers( Schema schema, Registries registries ) throws Exception
+    {
+        for ( Entry entry : loader.loadSyntaxCheckers( schema ) )
+        {
+            registerSyntaxChecker( registries, entry, schema );
+        }
+    }
+
+    
+    /**
+     * Register the AttributeType contained in the given Entry into the registries. 
+     *
+     * @param registries The Registries
+     * @param entry The Entry containing the AttributeType description
+     * @param schema The associated schema
+     * @return the created AttributeType instance
+     * @throws Exception If the registering failed
+     */
+    private AttributeType registerAttributeType( Registries registries, Entry entry, Schema schema ) 
+        throws Exception
+    {
+        AttributeType attributeType = factory.getAttributeType( entry, registries, schema.getSchemaName() );
+        
+        if ( registries.isRelaxed() )
+        {
+            if ( registries.isDisabledAccepted() )
+            {
+                registries.register( attributeType );
+            }
+            else if ( schema.isEnabled() && attributeType.isEnabled() )
+            {
+                registries.register( attributeType );
+            }
+            else
+            {
+                errors.add( new Throwable() );
+            }
+        }
+        else
+        {
+            if ( schema.isEnabled() && attributeType.isEnabled() )
+            {
+                registries.register( attributeType );
+            }
+            else
+            {
+                errors.add( new Throwable() );
+            }
+        }
+        
+        // And register the AT in the OidRegister
+        registries.getOidRegistry().register( attributeType );
+        
+        return attributeType;
+    }
+
+    
+    /**
+     * Register the comparator contained in the given Entry into the registries. 
+     *
+     * @param registries The Registries
+     * @param entry The Entry containing the comparator description
+     * @param schema The associated schema
+     * @throws Exception If the registering failed
+     */
+    private LdapComparator<?> registerComparator( Registries registries, Entry entry, Schema schema ) 
+        throws Exception
+    {
+        LdapComparator<?> comparator = 
+            factory.getLdapComparator( entry, registries, schema.getSchemaName() );
+        
+        comparator.setOid( entry.get( MetaSchemaConstants.M_OID_AT ).getString() );
+
+        if ( registries.isRelaxed() )
+        {
+            if ( registries.isDisabledAccepted() )
+            {
+                registries.register( comparator );
+            }
+            else if ( schema.isEnabled() && comparator.isEnabled() )
+            {
+                registries.register( comparator );
+            }
+            else
+            {
+                errors.add( new Throwable() );
+            }
+        }
+        else
+        {
+            if ( schema.isEnabled() && comparator.isEnabled() )
+            {
+                registries.register( comparator );
+            }
+            else
+            {
+                errors.add( new Throwable() );
+            }
+        }
+        
+        return comparator;
+    }
+    
+    
+    /**
+     * Register the DitContentRule contained in the given Entry into the registries. 
+     *
+     * @param registries The Registries
+     * @param entry The Entry containing the DitContentRule description
+     * @param schema The associated schema
+     * @return the created DitContentRule instance
+     * @throws Exception If the registering failed
+     */
+    private DITContentRule registerDitContentRule( Registries registries, Entry entry, Schema schema) 
+        throws Exception
+    {
+        throw new NotImplementedException( "Need to implement factory " +
+                "method for creating a DitContentRule" );
+    }
+    
+    
+    /**
+     * Register the DitStructureRule contained in the given Entry into the registries. 
+     *
+     * @param registries The Registries
+     * @param entry The Entry containing the DitStructureRule description
+     * @param schema The associated schema
+     * @return the created DitStructureRule instance
+     * @throws Exception If the registering failed
+     */
+    private DITStructureRule registerDitStructureRule( Registries registries, Entry entry, Schema schema) 
+        throws Exception
+    {
+        throw new NotImplementedException( "Need to implement factory " +
+                "method for creating a DitStructureRule" );
+    }
+
+    
+    /**
+     * Register the MatchingRule contained in the given Entry into the registries. 
+     *
+     * @param registries The Registries
+     * @param entry The Entry containing the MatchingRule description
+     * @param schema The associated schema
+     * @return the created MatchingRule instance
+     * @throws Exception If the registering failed
+     */
+    private MatchingRule registerMatchingRule( Registries registries, Entry entry, Schema schema) 
+        throws Exception
+    {
+        MatchingRule matchingRule = factory.getMatchingRule( 
+            entry, registries, schema.getSchemaName() );
+
+        if ( registries.isRelaxed() )
+        {
+            if ( registries.isDisabledAccepted() )
+            {
+                registries.register( matchingRule );
+            }
+            else if ( schema.isEnabled() && matchingRule.isEnabled() )
+            {
+                registries.register( matchingRule );
+            }
+            else
+            {
+                errors.add( new Throwable() );
+            }
+        }
+        else
+        {
+            if ( schema.isEnabled() && matchingRule.isEnabled() )
+            {
+                registries.register( matchingRule );
+            }
+            else
+            {
+                errors.add( new Throwable() );
+            }
+        }
+        
+        
+        // And register the MR in the OidRegister
+        registries.getOidRegistry().register( matchingRule );
+        
+        return matchingRule;
+    }
+    
+    
+    /**
+     * Register the MatchingRuleUse contained in the given Entry into the registries. 
+     *
+     * @param registries The Registries
+     * @param entry The Entry containing the MatchingRuleUse description
+     * @param schema The associated schema
+     * @return the created MatchingRuleUse instance
+     * @throws Exception If the registering failed
+     */
+    private MatchingRuleUse registerMatchingRuleUse( Registries registries, Entry entry, Schema schema) 
+        throws Exception
+    {
+        throw new NotImplementedException( "Need to implement factory " +
+                "method for creating a MatchingRuleUse" );
+    }
+    
+    
+    /**
+     * Register the NameForm contained in the given Entry into the registries. 
+     *
+     * @param registries The Registries
+     * @param entry The Entry containing the NameForm description
+     * @param schema The associated schema
+     * @return the created NameForm instance
+     * @throws Exception If the registering failed
+     */
+    private NameForm registerNameForm( Registries registries, Entry entry, Schema schema) 
+        throws Exception
+    {
+        throw new NotImplementedException( "Need to implement factory " +
+                "method for creating a NameForm" );
+    }
+
+    
+    /**
+     * Register the Normalizer contained in the given Entry into the registries. 
+     *
+     * @param registries The Registries
+     * @param entry The Entry containing the Normalizer description
+     * @param schema The associated schema
+     * @return the created Normalizer instance
+     * @throws Exception If the registering failed
+     */
+    private Normalizer registerNormalizer( Registries registries, Entry entry, Schema schema) 
+        throws Exception
+    {
+        Normalizer normalizer =
+            factory.getNormalizer( entry, registries, schema.getSchemaName() );
+        
+        if ( registries.isRelaxed() )
+        {
+            if ( registries.isDisabledAccepted() )
+            {
+                registries.register( normalizer );
+            }
+            else if ( schema.isEnabled() && normalizer.isEnabled() )
+            {
+                registries.register( normalizer );
+            }
+            else
+            {
+                errors.add( new Throwable() );
+            }
+        }
+        else
+        {
+            if ( schema.isEnabled() && normalizer.isEnabled() )
+            {
+                registries.register( normalizer );
+            }
+            else
+            {
+                errors.add( new Throwable() );
+            }
+        }
+        
+        return normalizer;
+    }
+    
+    
+    /**
+     * Register the ObjectClass contained in the given Entry into the registries. 
+     *
+     * @param registries The Registries
+     * @param entry The Entry containing the ObjectClass description
+     * @param schema The associated schema
+     * @return the created ObjectClass instance
+     * @throws Exception If the registering failed
+     */
+    private ObjectClass registerObjectClass( Registries registries, Entry entry, Schema schema) 
+        throws Exception
+    {
+        ObjectClass objectClass = factory.getObjectClass( entry, registries, schema.getSchemaName() );
+
+        if ( registries.isRelaxed() )
+        {
+            if ( registries.isDisabledAccepted() )
+            {
+                registries.register( objectClass );
+            }
+            else if ( schema.isEnabled() && objectClass.isEnabled() )
+            {
+                registries.register( objectClass );
+            }
+            else
+            {
+                errors.add( new Throwable() );
+            }
+        }
+        else
+        {
+            if ( schema.isEnabled() && objectClass.isEnabled() )
+            {
+                registries.register( objectClass );
+            }
+            else
+            {
+                errors.add( new Throwable() );
+            }
+        }
+        
+        // And register the OC in the OidRegister
+        registries.getOidRegistry().register( objectClass );
+        
+        return objectClass;
+    }
+
+    
+    /**
+     * Register the SyntaxChecker contained in the given Entry into the registries. 
+     *
+     * @param registries The Registries
+     * @param entry The Entry containing the SyntaxChecker description
+     * @param schema The associated schema
+     * @return the created SyntaxChecker instance
+     * @throws Exception If the registering failed
+     */
+    private SyntaxChecker registerSyntaxChecker( Registries registries, Entry entry, Schema schema) 
+        throws Exception
+    {
+        SyntaxChecker syntaxChecker = 
+            factory.getSyntaxChecker( entry, registries, schema.getSchemaName() );
+        syntaxChecker.setOid( entry.get( MetaSchemaConstants.M_OID_AT ).getString() );
+
+        if ( registries.isRelaxed() )
+        {
+            if ( registries.isDisabledAccepted() )
+            {
+                registries.register( syntaxChecker );
+            }
+            else if ( schema.isEnabled() && syntaxChecker.isEnabled() )
+            {
+                registries.register( syntaxChecker );
+            }
+            else
+            {
+                errors.add( new Throwable() );
+            }
+        }
+        else
+        {
+            if ( schema.isEnabled() && syntaxChecker.isEnabled() )
+            {
+                registries.register( syntaxChecker );
+            }
+            else
+            {
+                errors.add( new Throwable() );
+            }
+        }
+        
+        return syntaxChecker;
+    }
+    
+    
+
+    /**
+     * Register the Syntax contained in the given Entry into the registries. 
+     *
+     * @param registries The Registries
+     * @param entry The Entry containing the Syntax description
+     * @param schema The associated schema
+     * @return the created Syntax instance
+     * @throws Exception If the registering failed
+     */
+    private LdapSyntax registerSyntax( Registries registries, Entry entry, Schema schema) 
+        throws Exception
+    {
+        LdapSyntax syntax = factory.getSyntax( 
+            entry, registries, schema.getSchemaName() );
+
+        if ( registries.isRelaxed() )
+        {
+            if ( registries.isDisabledAccepted() )
+            {
+                registries.register( syntax );
+            }
+            else if ( schema.isEnabled() && syntax.isEnabled() )
+            {
+                registries.register( syntax );
+            }
+            else
+            {
+                errors.add( new Throwable() );
+            }
+        }
+        else
+        {
+            if ( schema.isEnabled() && syntax.isEnabled() )
+            {
+                registries.register( syntax );
+            }
+            else
+            {
+                errors.add( new Throwable() );
+            }
+        }
+        
+        // And register the Syntax in the OidRegister
+        registries.getOidRegistry().register( syntax );
+        
+        return syntax;
+    }
+
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean loadAllEnabled() throws Exception
+    {
+        Schema[] schemas = loader.getAllEnabled().toArray( new Schema[0] );
+        
+        return loadWithDeps( schemas );
+    }
+
+    public boolean loadAllEnabledRelaxed() throws Exception
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public boolean loadDisabled( Schema... schemas ) throws Exception
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public boolean loadDisabled( String... schemas ) throws Exception
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public boolean loadRelaxed( Schema... schemas ) throws Exception
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public boolean loadRelaxed( String... schemas ) throws Exception
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+    
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean loadWithDeps( Schema... schemas ) throws Exception
+    {
+        // Work on a cloned and relaxed registries
+        Registries clonedRegistries = cloneRegistries();
+
+        //Load the schemas
+        for ( Schema schema : schemas )
+        {
+            loadDepsFirst( schema, clonedRegistries );
+        }
+        
+        // Swap the registries if it is consistent
+        return swapRegistries( clonedRegistries );
+    }
+    
+    
+    /**
+     * {@inheritDoc}
+     */
+    public boolean loadWithDeps( String... schemas ) throws Exception
+    {
+        return loadWithDeps( toArray( schemas ) );
+    }
+
+    
+    /**
+     * Recursive method which loads schema's with their dependent schemas first
+     * and tracks what schemas it has seen so the recursion does not go out of
+     * control with dependency cycle detection.
+     *
+     * @param schema the current schema we are attempting to load
+     * @param registries The Registries in which the schemas will be loaded
+     * @throws Exception if there is a cycle detected and/or another
+     * failure results while loading, producing and or registering schema objects
+     */
+    private final void loadDepsFirst( Schema schema, Registries registries ) throws Exception
+    {
+        if ( schema.isDisabled() && !registries.isDisabledAccepted() )
+        {
+            LOG.info( "The schema is disabled and the registries does not accepted disabled schema" );
+            return;
+        }
+        
+        String schemaName = schema.getSchemaName();
+        
+        if ( registries.isSchemaLoaded( schemaName ) )
+        {
+            LOG.info( "{} schema has already been loaded" + schema.getSchemaName() );
+            return;
+        }
+        
+        String[] deps = schema.getDependencies();
+
+        // if no deps then load this guy and return
+        if ( ( deps == null ) || ( deps.length == 0 ) )
+        {
+            load( registries, schema );
+            
+            return;
+        }
+
+        /*
+         * We got deps and need to load them before this schema.  We go through
+         * all deps loading them with their deps first if they have not been
+         * loaded.
+         */
+        for ( String depName : deps )
+        {
+            if ( registries.isSchemaLoaded( schemaName ) )
+            {
+                // The schema is already loaded. Loop on the next schema
+                continue;
+            }
+            else
+            {
+                // Call recursively this method
+                Schema schemaDep = loader.getSchema( depName );
+                loadDepsFirst( schemaDep, registries );
+            }
+        }
+
+        // Now load the current schema
+        load( registries, schema );
+    }
+
+    
+    public boolean loadWithDepsRelaxed( Schema... schemas ) throws Exception
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public boolean loadWithDepsRelaxed( String... schemas ) throws Exception
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public void setRegistries( Registries registries )
+    {
+        // TODO Auto-generated method stub
+        
+    }
+
+    public boolean unload( Schema... schemas )
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public boolean unload( String... schemas )
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public boolean verify( Schema... schemas )
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public boolean verify( String... schemas )
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    public void setSchemaLoader( SchemaLoader schemaLoader )
+    {
+        // TODO Auto-generated method stub
+        
+    }
+
+
+    /**
+     * @return the namingContext
+     */
+    public LdapDN getNamingContext()
+    {
+        return namingContext;
+    }
+
+
+    /**
+     * Initializes the SchemaService
+     *
+     * @throws Exception If the initialization fails
+     */
+    public void initialize() throws Exception
+    {
+        try
+        {
+            schemaModificationAttributesDN = new LdapDN( SchemaConstants.SCHEMA_MODIFICATIONS_DN );
+            schemaModificationAttributesDN.normalize( 
+                getRegistries().getAttributeTypeRegistry().getNormalizerMapping() );
+        }
+        catch ( NamingException e )
+        {
+            throw new RuntimeException( e );
+        }
+    }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public SchemaLoader getLoader()
+    {
+        return loader;
+    }
+}

Added: directory/shared/branches/shared-schema/ldap-schema-loader/src/test/java/org/apache/directory/server/schema/SchemaManagerTest.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap-schema-loader/src/test/java/org/apache/directory/server/schema/SchemaManagerTest.java?rev=831341&view=auto
==============================================================================
--- directory/shared/branches/shared-schema/ldap-schema-loader/src/test/java/org/apache/directory/server/schema/SchemaManagerTest.java (added)
+++ directory/shared/branches/shared-schema/ldap-schema-loader/src/test/java/org/apache/directory/server/schema/SchemaManagerTest.java Fri Oct 30 15:42:39 2009
@@ -0,0 +1,38 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.server.schema;
+
+import org.apache.directory.shared.ldap.schema.SchemaManager;
+import org.apache.directory.shared.schema.DefaultSchemaManager;
+import org.apache.directory.shared.schema.loader.ldif.JarLdifSchemaLoader;
+import org.junit.Test;
+
+
+public class SchemaManagerTest
+{
+    @Test
+    public void testSchemaManager() throws Exception
+    {
+        JarLdifSchemaLoader loader = new JarLdifSchemaLoader();
+        SchemaManager sm = new DefaultSchemaManager( loader );
+
+        sm.loadWithDeps( /*"system", */"apachemeta" );
+    }
+}

Added: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SchemaManager.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SchemaManager.java?rev=831341&view=auto
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SchemaManager.java (added)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SchemaManager.java Fri Oct 30 15:42:39 2009
@@ -0,0 +1,304 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.shared.ldap.schema;
+
+import java.util.List;
+
+import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.schema.registries.Registries;
+import org.apache.directory.shared.ldap.schema.registries.Schema;
+import org.apache.directory.shared.ldap.schema.registries.SchemaLoader;
+
+/**
+ * A class used to manage access to the Schemas and Registries. It's associated 
+ * with a SchemaLoader, in charge of loading the schemas from the disk.
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public interface SchemaManager
+{
+    //---------------------------------------------------------------------------------
+    // Schema loading methods
+    //---------------------------------------------------------------------------------
+    /**
+     * Load some Schemas into the registries. The Registries is checked after the 
+     * schemas have been loaded, and if there is an error, the method returns false
+     * and the registries is kept intact.
+     * <br>
+     * The Schemas must be enabled, and only enabled SchemaObject will be loaded.
+     * <br>
+     * If any error was met, the {@link #getErrors} method will contain them
+     * 
+     * @param schemas the Schemas to load
+     * @return true if the schemas have been loaded and the registries is consistent
+     * @throws Exception @TODO 
+     */
+    boolean load( Schema... schemas ) throws Exception;
+
+    
+    /**
+     * Load some Schemas into the registries. The Registries is checked after the 
+     * schemas have been loaded, and if there is an error, the method returns false
+     * and the registries is kept intact.
+     * <br>
+     * The Schemas must be enabled, and only enabled SchemaObject will be loaded.
+     * <br>
+     * If any error was met, the {@link #getErrors} method will contain them
+     * 
+     * @param schemas the Schemas' name to load
+     * @return true if the schemas have been loaded and the registries is consistent
+     * @throws Exception @TODO 
+     */
+    boolean load( String... schemas ) throws Exception;
+
+
+    /**
+     * Load some Schemas into the registries, and loads all of the schemas they depend
+     * on. The Registries is checked after the schemas have been loaded, and if there 
+     * is an error, the method returns false and the registries is kept intact.
+     * <br>
+     * The Schemas must be enabled, and only enabled SchemaObject will be loaded.
+     * <br>
+     * If any error was met, the {@link #getErrors} method will contain them
+     * 
+     * @param schemas the Schemas to load
+     * @return true if the schemas have been loaded and the registries is consistent
+     * @throws Exception @TODO 
+     */
+    boolean loadWithDeps( Schema... schemas ) throws Exception;
+
+
+    /**
+     * Load some Schemas into the registries, and loads all of the schemas they depend
+     * on. The Registries is checked after the schemas have been loaded, and if there 
+     * is an error, the method returns false and the registries is kept intact.
+     * <br>
+     * The Schemas must be enabled, and only enabled SchemaObject will be loaded.
+     * <br>
+     * If any error was met, the {@link #getErrors} method will contain them
+     * 
+     * @param schemas the Schemas' name to load
+     * @return true if the schemas have been loaded and the registries is consistent
+     * @throws Exception @TODO 
+     */
+    boolean loadWithDeps( String... schemas ) throws Exception;
+    
+    
+    /**
+     * Load Schemas into the registries, even if there are some errors in the schemas. 
+     * The Registries is checked after the schemas have been loaded. Even if we have 
+     * errors, the registries will be updated.
+     * <br>
+     * The Schemas must be enabled, and only enabled SchemaObject will be loaded.
+     * <br>
+     * If any error was met, the {@link #getErrors} method will contain them
+     * 
+     * @param schemas the Schemas to load, if enabled
+     * @return true if the schemas have been loaded
+     * @throws Exception @TODO 
+     */
+    boolean loadRelaxed( Schema... schemas ) throws Exception;
+    
+    
+    /**
+     * Load Schemas into the registries, even if there are some errors in the schemas. 
+     * The Registries is checked after the schemas have been loaded. Even if we have 
+     * errors, the registries will be updated.
+     * <br>
+     * The Schemas must be enabled, and only enabled SchemaObject will be loaded.
+     * <br>
+     * If any error was met, the {@link #getErrors} method will contain them
+     * 
+     * @param schemas the Schemas' name to load, if enabled
+     * @return true if the schemas have been loaded and the registries is consistent
+     * @throws Exception @TODO 
+     */
+    boolean loadRelaxed( String... schemas ) throws Exception;
+
+
+    /**
+     * Load some Schemas into the registries, and loads all of the schemas they depend
+     * on. The Registries is checked after the schemas have been loaded. Even if we have 
+     * errors, the registries will be updated.
+     * <br>
+     * The Schemas must be enabled, and only enabled SchemaObject will be loaded.
+     * <br>
+     * If any error was met, the {@link #getErrors} method will contain them
+     * 
+     * @param schemas the Schemas to load
+     * @return true if the schemas have been loaded
+     * @throws Exception @TODO 
+     */
+    boolean loadWithDepsRelaxed( Schema... schemas ) throws Exception;
+
+
+    /**
+     * Load some Schemas into the registries, and loads all of the schemas they depend
+     * on. The Registries is checked after the schemas have been loaded. Even if we have 
+     * errors, the registries will be updated.
+     * <br>
+     * The Schemas must be enabled, and only enabled SchemaObject will be loaded.
+     * <br>
+     * If any error was met, the {@link #getErrors} method will contain them
+     * 
+     * @param schemas the Schemas' name to load
+     * @return true if the schemas have been loaded
+     * @throws Exception @TODO 
+     */
+    boolean loadWithDepsRelaxed( String... schemas ) throws Exception;
+    
+    
+    /**
+     * Load Schemas into the Registries, even if they are disabled. The disabled
+     * SchemaObject from an enabled schema will also be loaded. The Registries will
+     * be checked after the schemas have been loaded. Even if we have errors, the
+     * Registries will be updated.
+     * <br>
+     * If any error was met, the {@link #getErrors} method will contain them
+     *
+     * @param schemas The Schemas to load
+     * @return true if the schemas have been loaded
+     * @throws Exception @TODO 
+     */
+    boolean loadDisabled( Schema... schemas ) throws Exception;
+    
+    
+    /**
+     * Load Schemas into the Registries, even if they are disabled. The disabled
+     * SchemaObject from an enabled schema will also be loaded. The Registries will
+     * be checked after the schemas have been loaded. Even if we have errors, the
+     * Registries will be updated.
+     * <br>
+     * If any error was met, the {@link #getErrors} method will contain them
+     *
+     * @param schemas The Schemas' name to load
+     * @return true if the schemas have been loaded
+     * @throws Exception @TODO 
+     */
+    boolean loadDisabled( String... schemas ) throws Exception;
+    
+    
+    /**
+     * Load all the enabled schema into the Registries. The Registries is strict,
+     * any inconsistent schema will be rejected. 
+     *
+     * @return true if the schemas have been loaded
+     * @throws Exception @TODO
+     */
+    boolean loadAllEnabled() throws Exception;
+    
+    
+    /**
+     * Load all the enabled schema into the Registries. The Registries is relaxed,
+     * even inconsistent schema will be loaded. 
+     *
+     * @return true if the schemas have been loaded
+     * @throws Exception @TODO
+     */
+    boolean loadAllEnabledRelaxed() throws Exception;
+    
+    boolean unload( Schema... schemas );
+    boolean unload( String... schemas );
+    
+    //---------------------------------------------------------------------------------
+    // Other Schema methods
+    //---------------------------------------------------------------------------------
+    /**
+     * Enables a set of Schemas, and returns true if all the schema have been
+     * enabled, with all the dependent schemas, and if the registries is 
+     * still consistent.
+     * 
+     * If the modification is ok, the Registries will be updated. 
+     * 
+     *  @param schemas The list of schemas to enable
+     *  @return true if the Registries is still consistent, false otherwise.
+     */
+    boolean enable( Schema... schemas ) throws Exception;
+    
+
+    /**
+     * Enables a set of Schemas, and returns true if all the schema have been
+     * enabled, with all the dependent schemas, and if the registries is 
+     * still consistent.
+     * 
+     * If the modification is ok, the Registries will be updated.
+     *  
+     *  @param schemas The list of schemas to enable
+     *  @return true if the Registries is still consistent, false otherwise.
+     */
+    boolean enable( String... schemas ) throws Exception;
+
+    boolean enableRelaxed( Schema... schemas );
+    boolean enableRelaxed( String... schemas );
+    
+    
+    boolean disable( Schema... schemas );
+    boolean disable( String... schemas );
+
+    boolean disabledRelaxed( Schema... schemas );
+    boolean disabledRelaxed( String... schemas );
+
+
+    /**
+     * Check that the Schemas are consistent regarding the current Registries.
+     * 
+     * @param schemas The schemas to check
+     * @return true if the schemas can be loaded in the registries
+     */
+    boolean verify( Schema... schemas );
+    boolean verify( String... schemas );
+    
+    
+    /**
+     * @return The Registries
+     */
+    Registries getRegistries();
+    void setRegistries( Registries registries );
+    
+    
+    /**
+     * @return The errors obtained when checking the registries
+     */
+    List<Throwable> getErrors();
+    
+    
+    void setSchemaLoader( SchemaLoader schemaLoader );
+
+
+    /**
+     * @return the namingContext
+     */
+    LdapDN getNamingContext();
+
+
+    /**
+     * Initializes the SchemaService
+     *
+     * @throws Exception If the initialization fails
+     */
+    void initialize() throws Exception;
+    
+    
+    /**
+     * @return The used loader
+     */
+    SchemaLoader getLoader();
+}

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SchemaObject.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SchemaObject.java?rev=831341&r1=831340&r2=831341&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SchemaObject.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SchemaObject.java Fri Oct 30 15:42:39 2009
@@ -214,7 +214,7 @@
      */
     public void applyRegistries( Registries registries ) throws NamingException
     {
-        // Do nothing
+        // do nothing
     }