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/09 02:03:51 UTC

svn commit: r823360 [5/6] - in /directory: apacheds/branches/apacheds-schema/core-api/src/main/java/org/apache/directory/server/core/schema/ apacheds/branches/apacheds-schema/core-api/src/main/java/org/apache/directory/server/core/schema/registries/syn...

Modified: directory/shared/branches/shared-schema/ldap-schema-loader/src/main/java/org/apache/directory/shared/schema/loader/ldif/SchemaEntityFactory.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap-schema-loader/src/main/java/org/apache/directory/shared/schema/loader/ldif/SchemaEntityFactory.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap-schema-loader/src/main/java/org/apache/directory/shared/schema/loader/ldif/SchemaEntityFactory.java (original)
+++ directory/shared/branches/shared-schema/ldap-schema-loader/src/main/java/org/apache/directory/shared/schema/loader/ldif/SchemaEntityFactory.java Fri Oct  9 00:03:45 2009
@@ -28,15 +28,19 @@
 
 import javax.naming.NamingException;
 
+import org.apache.directory.shared.asn1.primitives.OID;
 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.entry.EntryAttribute;
 import org.apache.directory.shared.ldap.entry.Value;
 import org.apache.directory.shared.ldap.entry.client.DefaultClientAttribute;
+import org.apache.directory.shared.ldap.exception.LdapInvalidAttributeValueException;
+import org.apache.directory.shared.ldap.message.ResultCodeEnum;
 import org.apache.directory.shared.ldap.schema.AttributeType;
 import org.apache.directory.shared.ldap.schema.LdapComparator;
 import org.apache.directory.shared.ldap.schema.LdapSyntax;
+import org.apache.directory.shared.ldap.schema.LoadableSchemaObject;
 import org.apache.directory.shared.ldap.schema.MatchingRule;
 import org.apache.directory.shared.ldap.schema.Normalizer;
 import org.apache.directory.shared.ldap.schema.ObjectClass;
@@ -51,6 +55,7 @@
 import org.apache.directory.shared.ldap.schema.registries.Registries;
 import org.apache.directory.shared.ldap.schema.registries.Schema;
 import org.apache.directory.shared.ldap.util.Base64;
+import org.apache.directory.shared.ldap.util.StringTools;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -83,6 +88,118 @@
     {
         this.classLoader = new AttributeClassLoader();
     }
+    
+    
+    /**
+     * Get an OID from an entry. Handles the bad cases (null OID, 
+     * not a valid OID, ...)
+     */
+    private String getOid( Entry entry, String objectType ) throws NamingException
+    {
+        // The OID
+        EntryAttribute mOid = entry.get( MetaSchemaConstants.M_OID_AT );
+        
+        if ( mOid == null )
+        {
+            String msg = objectType + " entry must have a valid " 
+                + MetaSchemaConstants.M_OID_AT + " attribute, it's null";
+            LOG.warn( msg );
+            throw new NullPointerException( msg );
+        }
+
+        String oid = mOid.getString();
+        
+        if ( !OID.isOID( oid ) )
+        {
+            String msg = "Comparator OID " + oid + " is not a valid OID "; 
+            LOG.warn( msg );
+            throw new LdapInvalidAttributeValueException( msg,
+                ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
+        }
+        
+        return oid;
+    }
+    
+    
+    /**
+     * Get an OID from an entry. Handles the bad cases (null OID, 
+     * not a valid OID, ...)
+     */
+    private String getOid( SchemaObject description, String objectType ) throws NamingException
+    {
+        // The OID
+        String oid = description.getOid();
+        
+        if ( oid == null )
+        {
+            String msg = objectType + " entry must have a valid " 
+                + MetaSchemaConstants.M_OID_AT + " attribute, it's null";
+            LOG.warn( msg );
+            throw new NullPointerException( msg );
+        }
+
+        if ( !OID.isOID( oid ) )
+        {
+            String msg = "Comparator OID " + oid + " is not a valid OID "; 
+            LOG.warn( msg );
+            throw new LdapInvalidAttributeValueException( msg,
+                ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
+        }
+        
+        return oid;
+    }
+
+    
+    /**
+     * Check that the Entry is not null
+     */
+    private void checkEntry( Entry entry, String schemaEntity )
+    {
+        if ( entry == null )
+        {
+            String msg = schemaEntity + " entry cannot be null";
+            LOG.warn( msg );
+            throw new NullPointerException( msg );
+        }
+    }
+
+    
+    /**
+     * Check that the Description is not null
+     */
+    private void checkDescription( SchemaObject description, String schemaEntity )
+    {
+        if ( description == null )
+        {
+            String msg = schemaEntity + " Schema description cannot be null";
+            LOG.warn( msg );
+            throw new NullPointerException( msg );
+        }
+    }
+
+    
+    /**
+     * Get the schema from its name. Return the Other reference if there
+     * is no schema name. Throws a NPE if the schema is not loaded.
+     */
+    private Schema getSchema( String schemaName, Registries registries )
+    {
+        if ( StringTools.isEmpty( schemaName ) )
+        {
+            schemaName = MetaSchemaConstants.SCHEMA_OTHER;
+        }
+
+        Schema schema = registries.getLoadedSchema( schemaName );
+        
+        if ( schema == null )
+        {
+            String msg = "The schema " + schemaName + " does not exists or is not loaded";
+            LOG.error( msg );
+            throw new NullPointerException( msg );
+        }
+        
+        return schema;
+    }
 
     
     public Schema getSchema( Entry entry ) throws Exception
@@ -136,28 +253,38 @@
     }
     
     
-    private SyntaxChecker getSyntaxChecker( String syntaxOid, String className, 
-        EntryAttribute bytecode, Registries targetRegistries ) throws Exception
+    /**
+     * Class load a syntaxChecker instance
+     */
+    private SyntaxChecker classLoadSyntaxChecker( String oid, String className, 
+        EntryAttribute byteCode, Registries targetRegistries ) throws Exception
     {
+        // Try to class load the syntaxChecker
         Class<?> clazz = null;
         SyntaxChecker syntaxChecker = null;
-        
-        if ( bytecode == null )
+        String byteCodeStr = StringTools.EMPTY;
+
+        if ( byteCode == null )
         {
             clazz = Class.forName( className );
         }
         else
         {
-            classLoader.setAttribute( bytecode );
+            classLoader.setAttribute( byteCode );
             clazz = classLoader.loadClass( className );
+            byteCodeStr = new String( Base64.encode( byteCode.getBytes() ) );
         }
         
+        // Create the syntaxChecker instance
         syntaxChecker = ( SyntaxChecker ) clazz.newInstance();
 
-        // try now before returning to check if we can inject a Registries object
-        syntaxChecker.setOid( syntaxOid );
-        injectRegistries( syntaxChecker, targetRegistries );
+        // Update the common fields
+        syntaxChecker.setBytecode( byteCodeStr );
         syntaxChecker.setFqcn( className );
+        
+        // Inject the new OID, as the loaded syntaxChecker might have its own
+        syntaxChecker.setOid( oid );
+
         return syntaxChecker;
     }
     
@@ -169,89 +296,141 @@
      * @return the loaded SyntaxChecker
      * @throws NamingException if anything fails during loading
      */
-    public SyntaxChecker getSyntaxChecker( Entry entry, Registries targetRegistries ) throws Exception
+    public SyntaxChecker getSyntaxChecker( Entry entry, Registries targetRegistries, String schemaName ) throws Exception
     {
-        if ( entry == null )
-        {
-            throw new NullPointerException( "entry cannot be null" );
-        }
+        checkEntry( entry, SchemaConstants.SYNTAX_CHECKER );
         
-        if ( entry.get( MetaSchemaConstants.M_FQCN_AT ) == null )
-        {
-            throw new NullPointerException( "entry must have a valid "
-                + MetaSchemaConstants.M_FQCN_AT + " attribute" );
-        }
+        // The SyntaxChecker OID
+        String oid = getOid( entry, SchemaConstants.SYNTAX_CHECKER );
+
+        // Get the schema
+        Schema schema = getSchema( schemaName, targetRegistries );
 
-        String className = entry.get( MetaSchemaConstants.M_FQCN_AT ).get().getString();
-        String syntaxOid = entry.get( MetaSchemaConstants.M_OID_AT ).get().getString();
+        // The FQCN
+        String className = getFqcn( entry, SchemaConstants.SYNTAX_CHECKER );
+        
+        // The ByteCode
         EntryAttribute byteCode = entry.get( MetaSchemaConstants.M_BYTECODE_AT );
+            
+        // Class load the syntaxChecker
+        SyntaxChecker syntaxChecker = classLoadSyntaxChecker( oid, className, byteCode, targetRegistries );
+        
+        // Update the common fields
+        setSchemaObjectProperties( syntaxChecker, entry, schema );
         
-        return getSyntaxChecker( syntaxOid, className, byteCode, targetRegistries );
+        // return the resulting syntaxChecker
+        return syntaxChecker;
     }
     
     
+    /**
+     * Create a new instance of a SyntaxChecker 
+     *
+     * @param syntaxCheckerDescription
+     * @param targetRegistries
+     * @param schemaName
+     * @return A new instance of a syntaxChecker
+     * @throws Exception If the creation has failed
+     */
     public SyntaxChecker getSyntaxChecker( SyntaxCheckerDescription syntaxCheckerDescription, 
-        Registries targetRegistries ) throws Exception
+        Registries targetRegistries, String schemaName ) throws Exception
     {
-        EntryAttribute attr = null;
+        checkDescription( syntaxCheckerDescription, SchemaConstants.SYNTAX_CHECKER );
         
-        if ( syntaxCheckerDescription.getBytecode() != null )
-        {
-            byte[] bytecode = Base64.decode( syntaxCheckerDescription.getBytecode().toCharArray() );
-            attr = new DefaultClientAttribute( MetaSchemaConstants.M_BYTECODE_AT, bytecode );
-        }
+        // The Comparator OID
+        String oid = getOid( syntaxCheckerDescription, SchemaConstants.SYNTAX_CHECKER );
+        
+        // Get the schema
+        Schema schema = getSchema( schemaName, targetRegistries );
+
+        // The FQCN
+        String fqcn = getFqcn( syntaxCheckerDescription, SchemaConstants.SYNTAX_CHECKER );
+        
+        // get the byteCode
+        EntryAttribute byteCode = getByteCode( syntaxCheckerDescription, SchemaConstants.SYNTAX_CHECKER );
+        
+        // Class load the SyntaxChecker
+        SyntaxChecker syntaxChecker = classLoadSyntaxChecker( oid, 
+            fqcn, byteCode, targetRegistries );
         
-        return getSyntaxChecker( syntaxCheckerDescription.getOid(), 
-            syntaxCheckerDescription.getFqcn(), attr, targetRegistries );
+        // Update the common fields
+        setSchemaObjectProperties( syntaxChecker, syntaxCheckerDescription, schema );
+        
+        return syntaxChecker;
     }
     
     
-    private LdapComparator<?> getLdapComparator( String oid, String className, 
-        EntryAttribute bytecode, Registries targetRegistries ) throws Exception
+    /**
+     * Class load a comparator instances
+     */
+    private LdapComparator<?> classLoadComparator( String oid, String className, 
+        EntryAttribute byteCode, Registries targetRegistries ) throws Exception
     {
+        // Try to class load the comparator
         LdapComparator<?> comparator = null;
         Class<?> clazz = null;
-         
-        try
+        String byteCodeStr = StringTools.EMPTY;
+
+        if ( byteCode == null ) 
         {
-	        if ( bytecode == null ) 
-	        {
-	            clazz = Class.forName( className );
-	        }
-	        else
-	        {
-	            classLoader.setAttribute( bytecode );
-	            clazz = classLoader.loadClass( className );
-	        }
+            clazz = Class.forName( className );
         }
-        catch ( Exception e )
+        else
         {
-        	LOG.error( "Failed to load class from LDIF bytecode from schemaObject {}", oid, e );
-        	throw e;
+            classLoader.setAttribute( byteCode );
+            clazz = classLoader.loadClass( className );
+            byteCodeStr = new String( Base64.encode( byteCode.getBytes() ) );
         }
         
+        // Create the comparator instance
         comparator = ( LdapComparator<?> ) clazz.newInstance();
-        comparator.setOid( oid );
-        injectRegistries( comparator, targetRegistries );
+
+        // Update the loadable fields
+        comparator.setBytecode( byteCodeStr );
         comparator.setFqcn( className );
+        
+        // Inject the new OID, as the loaded comparator might have its own
+        comparator.setOid( oid );
+        
         return comparator;
     }
     
     
+    /**
+     * Create a new instance of a LdapComparator 
+     *
+     * @param comparatorDescription
+     * @param targetRegistries
+     * @param schemaName
+     * @return A new instance of a LdapComparator
+     * @throws Exception If the creation has failed
+     */
     public LdapComparator<?> getLdapComparator( 
         LdapComparatorDescription comparatorDescription, 
-        Registries targetRegistries ) throws Exception
+        Registries targetRegistries, String schemaName ) throws Exception
     {
-        EntryAttribute attr = null;
+        checkDescription( comparatorDescription, SchemaConstants.COMPARATOR );
         
-        if ( comparatorDescription.getBytecode() != null )
-        { 
-            byte[] bytecode = Base64.decode( comparatorDescription.getBytecode().toCharArray() );
-            attr = new DefaultClientAttribute( MetaSchemaConstants.M_BYTECODE_AT, bytecode );
-        }
+        // The Comparator OID
+        String oid = getOid( comparatorDescription, SchemaConstants.COMPARATOR );
+        
+        // Get the schema
+        Schema schema = getSchema( schemaName, targetRegistries );
+
+        // The FQCN
+        String fqcn = getFqcn( comparatorDescription, SchemaConstants.COMPARATOR );
         
-        return getLdapComparator( comparatorDescription.getOid(), 
-            comparatorDescription.getFqcn(), attr, targetRegistries );
+        // get the byteCode
+        EntryAttribute byteCode = getByteCode( comparatorDescription, SchemaConstants.COMPARATOR );
+        
+        // Class load the comparator
+        LdapComparator<?> comparator = classLoadComparator( oid, 
+            fqcn, byteCode, targetRegistries );
+        
+        // Update the common fields
+        setSchemaObjectProperties( comparator, comparatorDescription, schema );
+        
+        return comparator;
     }
     
     
@@ -259,68 +438,108 @@
      * Retrieve and load a Comparator class from the DIT.
      * 
      * @param entry the entry to load the Comparator from
+     * @param targetRegistries The registries
+     * @param schemaName The schema this SchemaObject will be part of
      * @return the loaded Comparator
      * @throws NamingException if anything fails during loading
      */
     public LdapComparator<?> getLdapComparator( Entry entry, 
-        Registries targetRegistries ) throws Exception
+        Registries targetRegistries, String schemaName ) throws Exception
     {
-        if ( entry == null )
-        {
-            throw new NullPointerException( "entry cannot be null" );
-        }
+        checkEntry( entry, SchemaConstants.COMPARATOR );
         
-        if ( entry.get( MetaSchemaConstants.M_FQCN_AT ) == null )
-        {
-            throw new NullPointerException( "entry must have a valid " 
-                + MetaSchemaConstants.M_FQCN_AT + " attribute" );
-        }
+        // The Comparator OID
+        String oid = getOid( entry, SchemaConstants.COMPARATOR );
+        
+        // Get the schema
+        Schema schema = getSchema( schemaName, targetRegistries );
+
+        // The FQCN
+        String fqcn = getFqcn( entry, SchemaConstants.COMPARATOR );
         
-        String className = entry.get( MetaSchemaConstants.M_FQCN_AT ).get().getString();
-        String oid = entry.get( MetaSchemaConstants.M_OID_AT ).getString();
-        EntryAttribute byteCode = entry.get( MetaSchemaConstants.M_BYTECODE_AT ); 
-        return getLdapComparator( oid, className, byteCode, targetRegistries );
+        // The ByteCode
+        EntryAttribute byteCode = entry.get( MetaSchemaConstants.M_BYTECODE_AT );
+            
+        // Class load the comparator
+        LdapComparator<?> comparator = classLoadComparator( oid, fqcn, byteCode, targetRegistries );
+        
+        // Update the common fields
+        setSchemaObjectProperties( comparator, entry, schema );
+        
+        // return the resulting comparator
+        return comparator;
     }
     
     
-    private Normalizer getNormalizer( String oid, String className, 
-        EntryAttribute bytecode, Registries targetRegistries ) throws Exception
+    /**
+     * Class load a normalizer instances
+     */
+    private Normalizer classLoadNormalizer( String oid, String className, 
+        EntryAttribute byteCode, Registries targetRegistries ) throws Exception
     {
+        // Try to class load the normalizer
         Class<?> clazz = null;
         Normalizer normalizer = null;
+        String byteCodeStr = StringTools.EMPTY;
         
-        if ( bytecode == null )
+        if ( byteCode == null )
         {
             clazz = Class.forName( className );
         }
         else
         {
-            classLoader.setAttribute( bytecode );
+            classLoader.setAttribute( byteCode );
             clazz = classLoader.loadClass( className );
+            byteCodeStr = new String( Base64.encode( byteCode.getBytes() ) );
         }
 
+        // Create the normalizer instance
         normalizer = ( Normalizer ) clazz.newInstance();
-        normalizer.setOid( oid );
-        injectRegistries( normalizer, targetRegistries );
+
+        // Update the common fields
+        normalizer.setBytecode( byteCodeStr );
         normalizer.setFqcn( className );
         
+        // Inject the new OID, as the loaded normalizer might have its own
+        normalizer.setOid( oid );
+        
         return normalizer;
     }
 
     
+    /**
+     * Create a new instance of a Normalizer 
+     *
+     * @param normalizerDescription
+     * @param targetRegistries
+     * @param schemaName
+     * @return A new instance of a normalizer
+     * @throws Exception If the creation has failed
+     */
     public Normalizer getNormalizer( NormalizerDescription normalizerDescription, 
-        Registries targetRegistries ) throws Exception
+        Registries targetRegistries, String schemaName ) throws Exception
     {
-        EntryAttribute attr = null;
+        checkDescription( normalizerDescription, SchemaConstants.NORMALIZER );
         
-        if ( normalizerDescription.getBytecode() != null )
-        {
-            byte[] bytecode = Base64.decode( normalizerDescription.getBytecode().toCharArray() );
-            attr = new DefaultClientAttribute( MetaSchemaConstants.M_BYTECODE_AT, bytecode );
-        }
+        // The Comparator OID
+        String oid = getOid( normalizerDescription, SchemaConstants.NORMALIZER );
+        
+        // Get the schema
+        Schema schema = getSchema( schemaName, targetRegistries );
+
+        // The FQCN
+        String fqcn = getFqcn( normalizerDescription, SchemaConstants.NORMALIZER );
         
-        return getNormalizer( normalizerDescription.getOid(), 
-            normalizerDescription.getFqcn(), attr, targetRegistries );
+        // get the byteCode
+        EntryAttribute byteCode = getByteCode( normalizerDescription, SchemaConstants.NORMALIZER );
+
+        // Class load the normalizer
+        Normalizer normalizer = classLoadNormalizer( oid, fqcn, byteCode, targetRegistries );
+        
+        // Update the common fields
+        setSchemaObjectProperties( normalizer, normalizerDescription, schema );
+        
+        return normalizer;
     }
     
     
@@ -331,24 +550,31 @@
      * @return the loaded Normalizer
      * @throws NamingException if anything fails during loading
      */
-    public Normalizer getNormalizer( Entry entry, Registries targetRegistries ) 
+    public Normalizer getNormalizer( Entry entry, Registries targetRegistries, String schemaName ) 
         throws Exception
     {
-        if ( entry == null )
-        {
-            throw new NullPointerException( "entry cannot be null" );
-        }
+        checkEntry( entry, SchemaConstants.NORMALIZER );
         
-        if ( entry.get( MetaSchemaConstants.M_FQCN_AT ) == null )
-        {
-            throw new NullPointerException( "entry must have a valid " 
-                + MetaSchemaConstants.M_FQCN_AT + " attribute" );
-        }
+        // The Normalizer OID
+        String oid = getOid( entry, SchemaConstants.NORMALIZER );
+
+        // Get the schema
+        Schema schema = getSchema( schemaName, targetRegistries );
+
+        // The FQCN
+        String className = getFqcn( entry, SchemaConstants.NORMALIZER );
+        
+        // The ByteCode
+        EntryAttribute byteCode = entry.get( MetaSchemaConstants.M_BYTECODE_AT );
+            
+        // Class load the Normalizer
+        Normalizer normalizer = classLoadNormalizer( oid, className, byteCode, targetRegistries );
+        
+        // Update the common fields
+        setSchemaObjectProperties( normalizer, entry, schema );
         
-        String className = entry.get( MetaSchemaConstants.M_FQCN_AT ).getString();
-        String oid = entry.get( MetaSchemaConstants.M_OID_AT ).getString();
-        EntryAttribute bytecode = entry.get( MetaSchemaConstants.M_BYTECODE_AT );
-        return getNormalizer( oid, className, bytecode, targetRegistries );
+        // return the resulting Normalizer
+        return normalizer;
     }
     
     
@@ -387,41 +613,77 @@
     }
 
 
-    public LdapSyntax getSyntax( Entry entry, Registries targetRegistries, String schema ) throws NamingException
+    public LdapSyntax getSyntax( Entry entry, Registries targetRegistries, String schemaName ) throws NamingException
     {
-        String oid = entry.get( MetaSchemaConstants.M_OID_AT ).getString();
+        checkEntry( entry, SchemaConstants.SYNTAX );
+
+        // The Syntax OID
+        String oid = getOid( entry, SchemaConstants.SYNTAX );
+
+        // Get the schema
+        Schema schema = getSchema( schemaName, targetRegistries );
+
+        // Create the new LdapSyntax instance
         LdapSyntax syntax = new LdapSyntax( oid );
-        syntax.setSchemaName( schema );
-        syntax.applyRegistries( targetRegistries );
         
-        if ( entry.get( MetaSchemaConstants.X_HUMAN_READABLE_AT ) != null )
-        {
-            String val = entry.get( MetaSchemaConstants.X_HUMAN_READABLE_AT ).getString();
-            syntax.setHumanReadable( val.toUpperCase().equals( "TRUE" ) );
-        }
+        // The isHumanReadable field
+        EntryAttribute mHumanReadable = entry.get( MetaSchemaConstants.X_HUMAN_READABLE_AT );
         
-        if ( entry.get( MetaSchemaConstants.M_DESCRIPTION_AT ) != null )
+        if ( mHumanReadable != null )
         {
-            syntax.setDescription( entry.get( MetaSchemaConstants.M_DESCRIPTION_AT ).getString() ); 
+            String val = mHumanReadable.getString();
+            syntax.setHumanReadable( val.toUpperCase().equals( "TRUE" ) );
         }
+
+        // Common properties
+        setSchemaObjectProperties( syntax, entry, schema );
         
         return syntax;
     }
 
     
-    public MatchingRule getMatchingRule( Entry entry, Registries targetRegistries, String schema ) throws NamingException
+    /**
+     * Construct an MatchingRule from an entry get from the Dit
+     *
+     * @param entry The entry containing all the informations to build a MatchingRule
+     * @param targetRegistries The registries containing all the enabled SchemaObjects
+     * @param schemaName The schema containing this MatchingRule
+     * @return A MatchingRule SchemaObject
+     * @throws NamingException If the MatchingRule is invalid
+     */
+    public MatchingRule getMatchingRule( Entry entry, Registries targetRegistries, String schemaName ) throws NamingException
     {
-        String oid = entry.get( MetaSchemaConstants.M_OID_AT ).getString();
-        String syntaxOid = entry.get( MetaSchemaConstants.M_SYNTAX_AT ).getString();
-        MatchingRule mr = new MatchingRule( oid );
-        mr.setSyntaxOid( syntaxOid );
-        mr.setSchemaName( schema );
-        setSchemaObjectProperties( mr, entry );
-    	mr.applyRegistries( targetRegistries );
-        return mr;
+        checkEntry( entry, SchemaConstants.MATCHING_RULE );
+
+        // The MatchingRule OID
+        String oid = getOid( entry, SchemaConstants.MATCHING_RULE );
+
+        // Get the schema
+        Schema schema = getSchema( schemaName, targetRegistries );
+
+        MatchingRule matchingRule = new MatchingRule( oid );
+
+        // The syntax field
+        EntryAttribute mSyntax = entry.get( MetaSchemaConstants.M_SYNTAX_AT );
+        
+        if ( mSyntax != null )
+        {
+            matchingRule.setSyntaxOid( mSyntax.getString() );
+        }
+
+        // The normalizer and comparator fields will be updated when we will
+        // apply the registry 
+
+        // Common properties
+        setSchemaObjectProperties( matchingRule, entry, schema );
+        
+        return matchingRule;
     }
     
     
+    /**
+     * Create a list of string from a multivalued attribute's values
+     */
     private List<String> getStrings( EntryAttribute attr ) throws NamingException
     {
         if ( attr == null )
@@ -440,126 +702,275 @@
     }
     
     
-    public ObjectClass getObjectClass( Entry entry, Registries targetRegistries, String schema ) throws Exception
+    public ObjectClass getObjectClass( Entry entry, Registries targetRegistries, String schemaName ) throws Exception
     {
-        String oid = entry.get( MetaSchemaConstants.M_OID_AT ).getString();
+        checkEntry( entry, SchemaConstants.OBJECT_CLASS );
+
+        // The ObjectClass OID
+        String oid = getOid( entry, SchemaConstants.OBJECT_CLASS );
+
+        // Get the schema
+        Schema schema = getSchema( schemaName, targetRegistries );
+
+        // Create the ObjectClass instance
         ObjectClass oc = new ObjectClass( oid );
-        oc.setSchemaName( schema );
         
-        if ( entry.get( MetaSchemaConstants.M_SUP_OBJECT_CLASS_AT ) != null )
+        // The Sup field
+        EntryAttribute mSuperiors = entry.get( MetaSchemaConstants.M_SUP_OBJECT_CLASS_AT );
+        
+        if ( mSuperiors != null )
         {
-            oc.setSuperiorOids( getStrings( entry.get( MetaSchemaConstants.M_SUP_OBJECT_CLASS_AT ) ) );
+            oc.setSuperiorOids( getStrings( mSuperiors ) );
         }
         
-        if ( entry.get( MetaSchemaConstants.M_MAY_AT ) != null )
+        // The May field
+        EntryAttribute mMay = entry.get( MetaSchemaConstants.M_MAY_AT );
+            
+        if ( mMay != null )
         {
-            oc.setMayAttributeTypeOids( getStrings( entry.get( MetaSchemaConstants.M_MAY_AT ) ) );
+            oc.setMayAttributeTypeOids( getStrings( mMay ) );
         }
         
-        if ( entry.get( MetaSchemaConstants.M_MUST_AT ) != null )
+        // The Must field
+        EntryAttribute mMust = entry.get( MetaSchemaConstants.M_MUST_AT );
+        
+        if ( mMust != null )
         {
-            oc.setMustAttributeTypeOids( getStrings( entry.get( MetaSchemaConstants.M_MUST_AT ) ) );
+            oc.setMustAttributeTypeOids( getStrings( mMust ) );
         }
         
-        if ( entry.get( MetaSchemaConstants.M_TYPE_OBJECT_CLASS_AT ) != null )
+        // The objectClassType field
+        EntryAttribute mTypeObjectClass = entry.get( MetaSchemaConstants.M_TYPE_OBJECT_CLASS_AT );
+            
+        if ( mTypeObjectClass != null )
         {
-            String type = entry.get( MetaSchemaConstants.M_TYPE_OBJECT_CLASS_AT ).getString();
+            String type = mTypeObjectClass.getString();
             oc.setType( ObjectClassTypeEnum.getClassType( type ) );
         }
-        else
-        {
-            oc.setType( ObjectClassTypeEnum.STRUCTURAL );
-        }
         
-        setSchemaObjectProperties( oc, entry );
-        oc.applyRegistries( targetRegistries );
+        // Common properties
+        setSchemaObjectProperties( oc, entry, schema );
         
         return oc;
     }
     
     
-    public AttributeType getAttributeType( Entry entry, Registries targetRegistries, String schema ) throws NamingException
+    /**
+     * Construct an AttributeType from an entry representing an AttributeType.
+     *
+     * @param entry The entry containing all the informations to build an AttributeType
+     * @param targetRegistries The registries containing all the enabled SchemaObjects
+     * @param schemaName The schema containing this AttributeType
+     * @return An AttributeType SchemaObject
+     * @throws NamingException If the AttributeType is invalid
+     */
+    public AttributeType getAttributeType( Entry entry, Registries targetRegistries, String schemaName ) throws NamingException
     {
-        String oid = entry.get( MetaSchemaConstants.M_OID_AT ).getString();
-        AttributeType at = new AttributeType( oid );
+        checkEntry( entry, SchemaConstants.ATTRIBUTE_TYPE );
+        
+        // The AttributeType OID
+        String oid = getOid( entry, SchemaConstants.ATTRIBUTE_TYPE );
+
+        // Get the schema
+        Schema schema = getSchema( schemaName, targetRegistries );
+
+        // Create the new AttributeType
+        AttributeType attributeType = new AttributeType( oid );
+        
+        // Syntax
+        EntryAttribute mSyntax = entry.get( MetaSchemaConstants.M_SYNTAX_AT );
+        
+        if ( mSyntax != null )
+        {
+            attributeType.setSyntaxOid( mSyntax.getString() );
+        }
+        
+        // Equality
+        EntryAttribute mEquality = entry.get( MetaSchemaConstants.M_EQUALITY_AT );
         
-        at.setSchemaName( schema );
-        setSchemaObjectProperties( at, entry );
+        if ( mEquality != null )
+        {
+        	attributeType.setEqualityOid( mEquality.getString() );
+        }
         
-        if ( entry.get( MetaSchemaConstants.M_SYNTAX_AT ) != null )
+        // Ordering
+        EntryAttribute mOrdering = entry.get( MetaSchemaConstants.M_ORDERING_AT ); 
+            
+        if ( mOrdering != null )
         {
-            at.setSyntaxOid( entry.get( MetaSchemaConstants.M_SYNTAX_AT ).getString() );
+            attributeType.setOrderingOid( mOrdering.getString() );
         }
         
-        if ( entry.get( MetaSchemaConstants.M_EQUALITY_AT ) != null )
+        // Substr
+        EntryAttribute mSubstr = entry.get( MetaSchemaConstants.M_SUBSTR_AT );
+        
+        if ( mSubstr != null )
         {
-        	String mrName = entry.get( MetaSchemaConstants.M_EQUALITY_AT ).getString();
-        	String mrOid = targetRegistries.getMatchingRuleRegistry().getOidByName( mrName );
-            at.setEqualityOid( mrOid );
+            attributeType.setSubstringOid( mSubstr.getString() );
         }
         
-        if ( entry.get( MetaSchemaConstants.M_ORDERING_AT ) != null )
+        EntryAttribute mSupAttributeType = entry.get( MetaSchemaConstants.M_SUP_ATTRIBUTE_TYPE_AT );
+        
+        // Sup
+        if ( mSupAttributeType != null )
         {
-        	String mrName = entry.get( MetaSchemaConstants.M_ORDERING_AT ).getString();
-        	String mrOid = targetRegistries.getMatchingRuleRegistry().getOidByName( mrName );
-            at.setOrderingOid( mrOid );
+        	attributeType.setSuperiorOid( mSupAttributeType.getString() );
         }
         
-        if ( entry.get( MetaSchemaConstants.M_SUBSTR_AT ) != null )
+        // isCollective
+        EntryAttribute mCollective = entry.get( MetaSchemaConstants.M_COLLECTIVE_AT );
+        
+        if ( mCollective != null )
         {
-        	String mrName = entry.get( MetaSchemaConstants.M_SUBSTR_AT ).getString();
-        	String mrOid = targetRegistries.getMatchingRuleRegistry().getOidByName( mrName );
-            at.setSubstringOid( mrOid );
+            String val = mCollective.getString();
+            attributeType.setCollective( val.equalsIgnoreCase( "TRUE" ) );
         }
         
-        if ( entry.get( MetaSchemaConstants.M_SUP_ATTRIBUTE_TYPE_AT ) != null )
+        // isSingleValued
+        EntryAttribute mSingleValued = entry.get( MetaSchemaConstants.M_SINGLE_VALUE_AT );
+        
+        if ( mSingleValued != null )
         {
-        	String supName = entry.get( MetaSchemaConstants.M_SUP_ATTRIBUTE_TYPE_AT ).getString();
-            String supOid = targetRegistries.getAttributeTypeRegistry().getOidByName( supName );
-        	at.setSuperiorOid( supOid );
+            String val = mSingleValued.getString();
+            attributeType.setSingleValued( val.equalsIgnoreCase( "TRUE" ) );
         }
         
-        if ( entry.get( MetaSchemaConstants.M_COLLECTIVE_AT ) != null )
+        // isReadOnly
+        EntryAttribute mNoUserModification = entry.get( MetaSchemaConstants.M_NO_USER_MODIFICATION_AT );
+        
+        if ( mNoUserModification != null )
+        {
+            String val = mNoUserModification.getString();
+            attributeType.setUserModifiable( ! val.equalsIgnoreCase( "TRUE" ) );
+        }
+        
+        // Usage
+        EntryAttribute mUsage = entry.get( MetaSchemaConstants.M_USAGE_AT );
+        
+        if ( mUsage != null )
+        {
+            attributeType.setUsage( UsageEnum.getUsage( mUsage.getString() ) );
+        }
+        
+        // Common properties
+        setSchemaObjectProperties( attributeType, entry, schema );
+        
+        return attributeType;
+    }
+    
+    
+    /**
+     * Process the FQCN attribute
+     */
+    private String getFqcn( Entry entry, String objectType ) throws NamingException
+    {
+        // The FQCN
+        EntryAttribute mFqcn = entry.get( MetaSchemaConstants.M_FQCN_AT );
+        
+        if ( mFqcn == null )
         {
-            String val = entry.get( MetaSchemaConstants.M_COLLECTIVE_AT ).getString();
-            at.setCollective( val.equalsIgnoreCase( "TRUE" ) );
+            String msg = objectType + " entry must have a valid " 
+                + MetaSchemaConstants.M_FQCN_AT + " attribute";
+            LOG.warn( msg );
+            throw new NullPointerException( msg );
         }
         
-        if ( entry.get( MetaSchemaConstants.M_SINGLE_VALUE_AT ) != null )
+        return mFqcn.getString();
+    }
+    
+    
+    /**
+     * Process the FQCN attribute
+     */
+    private String getFqcn( LoadableSchemaObject description, String objectType ) throws NamingException
+    {
+        // The FQCN
+        String mFqcn = description.getFqcn();
+        
+        if ( mFqcn == null )
         {
-            String val = entry.get( MetaSchemaConstants.M_SINGLE_VALUE_AT ).getString();
-            at.setSingleValued( val.equalsIgnoreCase( "TRUE" ) );
+            String msg = objectType + " entry must have a valid " 
+                + MetaSchemaConstants.M_FQCN_AT + " attribute";
+            LOG.warn( msg );
+            throw new NullPointerException( msg );
         }
         
-        if ( entry.get( MetaSchemaConstants.M_NO_USER_MODIFICATION_AT ) != null )
+        return mFqcn;
+    }
+    
+    
+    /**
+     * Process the ByteCode attribute
+     */
+    private EntryAttribute getByteCode( Entry entry, String objectType ) throws NamingException
+    {
+        EntryAttribute byteCode = entry.get( MetaSchemaConstants.M_BYTECODE_AT );
+        
+        if ( byteCode == null )
         {
-            String val = entry.get( MetaSchemaConstants.M_NO_USER_MODIFICATION_AT ).getString();
-            at.setUserModifiable( ! val.equalsIgnoreCase( "TRUE" ) );
+            String msg = objectType + " entry must have a valid " 
+                + MetaSchemaConstants.M_BYTECODE_AT + " attribute";
+            LOG.warn( msg );
+            throw new NullPointerException( msg );
         }
         
-        if ( entry.get( MetaSchemaConstants.M_USAGE_AT ) != null )
+        return byteCode;
+    }
+    
+
+    /**
+     * Process the ByteCode attribute
+     */
+    private EntryAttribute getByteCode( LoadableSchemaObject description, String objectType ) throws NamingException
+    {
+        String byteCodeString = description.getBytecode();
+        
+        if ( byteCodeString == null )
         {
-            at.setUsage( UsageEnum.getUsage( entry.get( MetaSchemaConstants.M_USAGE_AT ).getString() ) );
+            String msg = objectType + " entry must have a valid " 
+                + MetaSchemaConstants.M_BYTECODE_AT + " attribute";
+            LOG.warn( msg );
+            throw new NullPointerException( msg );
         }
+
+        byte[] bytecode = Base64.decode( byteCodeString.toCharArray() );
+        EntryAttribute attr = new DefaultClientAttribute( MetaSchemaConstants.M_BYTECODE_AT, bytecode );
         
-        at.applyRegistries( targetRegistries );
-        return at;
+        return attr;
     }
     
 
-    private void setSchemaObjectProperties( SchemaObject so, Entry entry ) throws NamingException
+    /**
+     * Process the common attributes to all SchemaObjects :
+     *  - obsolete
+     *  - description
+     *  - names
+     *  - schemaName
+     *  - specification (if any)
+     *  - extensions
+     *  - isReadOnly
+     *  - isEnabled
+     */
+    private void setSchemaObjectProperties( SchemaObject schemaObject, Entry entry, Schema schema ) throws NamingException
     {
-        if ( entry.get( MetaSchemaConstants.M_OBSOLETE_AT ) != null )
+        // The isObsolete field
+        EntryAttribute mObsolete = entry.get( MetaSchemaConstants.M_OBSOLETE_AT );
+        
+        if ( mObsolete != null )
         {
-            String val = entry.get( MetaSchemaConstants.M_OBSOLETE_AT ).getString();
-            so.setObsolete( val.equalsIgnoreCase( "TRUE" ) );
+            String val = mObsolete.getString();
+            schemaObject.setObsolete( val.equalsIgnoreCase( "TRUE" ) );
         }
         
-        if ( entry.get( MetaSchemaConstants.M_DESCRIPTION_AT ) != null )
+        // The description field
+        EntryAttribute mDescription = entry.get( MetaSchemaConstants.M_DESCRIPTION_AT );
+        
+        if ( mDescription != null )
         {
-            so.setDescription( entry.get( MetaSchemaConstants.M_DESCRIPTION_AT ).getString() ); 
+            schemaObject.setDescription( mDescription.getString() ); 
         }
 
+        // The names field
         EntryAttribute names = entry.get( MetaSchemaConstants.M_NAME_AT );
         
         if ( names != null )
@@ -571,7 +982,105 @@
                 values.add( name.getString() );
             }
             
-            so.setNames( values );
+            schemaObject.setNames( values );
         }
+        
+        // The isEnabled field
+        EntryAttribute mDisabled = entry.get( MetaSchemaConstants.M_DISABLED_AT );
+        
+        // If the SchemaObject has an explicit m-disabled attribute, then use it.
+        // Otherwise, inherit it from the schema
+        if ( mDisabled != null )
+        {
+            String val = mDisabled.getString();
+            schemaObject.setEnabled( ! val.equalsIgnoreCase( "TRUE" ) );
+        }
+        else
+        {
+            schemaObject.setEnabled( schema.isEnabled() );
+        }
+        
+        // The isReadOnly field
+        EntryAttribute mIsReadOnly = entry.get( MetaSchemaConstants.M_NO_USER_MODIFICATION_AT );
+
+        if ( mIsReadOnly != null )
+        {
+            String val = mIsReadOnly.getString();
+            schemaObject.setReadOnly( val.equalsIgnoreCase( "TRUE" ) );
+        }
+        
+        // The specification field
+        /*
+         * TODO : create the M_SPECIFICATION_ATAT
+        EntryAttribute mSpecification = entry.get( MetaSchemaConstants.M_SPECIFICATION_AT );
+        
+        if ( mSpecification != null )
+        {
+            so.setSpecification( mSpecification.getString() ); 
+        }
+        */
+        
+        // The schemaName field
+        schemaObject.setSchemaName( schema.getSchemaName() );
+        
+        // The extensions field
+        /*
+         * TODO create the M_EXTENSION_AT AT
+        EntryAttribute extensions = entry.get( MetaSchemaConstants.M_EXTENSION_AT );
+        
+        if ( extensions != null )
+        {
+            List<String> extensions = new ArrayList<String>();
+            
+            for ( Value<?> extension:extensions )
+            {
+                values.add( extension() );
+            }
+            
+            so.setExtensions( values );
+        }
+        */
+    }
+
+
+    /**
+     * Process the common attributes to all SchemaObjects :
+     *  - obsolete
+     *  - description
+     *  - names
+     *  - schemaName
+     *  - specification (if any)
+     *  - extensions
+     *  - isReadOnly
+     *  - isEnabled
+     */
+    private void setSchemaObjectProperties( SchemaObject schemaObject, SchemaObject description, Schema schema ) throws NamingException
+    {
+        // The isObsolete field
+        schemaObject.setObsolete( description.isObsolete() );
+        
+        // The description field
+        schemaObject.setDescription( description.getDescription() );
+
+        // The names field
+        schemaObject.setNames( description.getNames() );
+        
+        // The isEnabled field. Has the description does not hold a 
+        // Disable field, we will inherit from the schema enable field
+        schemaObject.setEnabled( schema.isEnabled() );
+        
+        // The isReadOnly field. We don't have this data in the description,
+        // so set it to false
+        // TODO : should it be a X-READONLY extension ?
+        schemaObject.setReadOnly( false );
+
+        // The specification field
+        schemaObject.setSpecification( description.getSpecification() );
+        
+        // The schemaName field
+        schemaObject.setSchemaName( schema.getSchemaName() );
+        
+        // The extensions field
+        schemaObject.setExtensions( description.getExtensions() );
     }
 }

Modified: directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou=schema/cn=nis/ou=syntaxcheckers/m-oid=1.3.6.1.1.1.0.0.ldif
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou%3Dschema/cn%3Dnis/ou%3Dsyntaxcheckers/m-oid%3D1.3.6.1.1.1.0.0.ldif?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou=schema/cn=nis/ou=syntaxcheckers/m-oid=1.3.6.1.1.1.0.0.ldif (original)
+++ directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou=schema/cn=nis/ou=syntaxcheckers/m-oid=1.3.6.1.1.1.0.0.ldif Fri Oct  9 00:03:45 2009
@@ -3,8 +3,8 @@
 entryuuid:: WoQyjBBbRF20wqCBTAvpiQ==
 m-oid: 1.3.6.1.1.1.0.0
 entrycsn: 20090818052726.864000Z#000000#000#000000
-m-fqcn: org.apache.directory.shared.ldap.schema.syntaxCheckers.AcceptAllSyntaxCh
- ecker
+m-fqcn: org.apache.directory.shared.ldap.schema.syntaxCheckers.OctetStringSyntax
+ Checker
 objectclass: metaSyntaxChecker
 objectclass: metaTop
 objectclass: top

Modified: directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou=schema/cn=nis/ou=syntaxcheckers/m-oid=1.3.6.1.1.1.0.1.ldif
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou%3Dschema/cn%3Dnis/ou%3Dsyntaxcheckers/m-oid%3D1.3.6.1.1.1.0.1.ldif?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou=schema/cn=nis/ou=syntaxcheckers/m-oid=1.3.6.1.1.1.0.1.ldif (original)
+++ directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou=schema/cn=nis/ou=syntaxcheckers/m-oid=1.3.6.1.1.1.0.1.ldif Fri Oct  9 00:03:45 2009
@@ -3,8 +3,8 @@
 entryuuid:: jSqpuKHcT6Stdr4GKEO5Fw==
 m-oid: 1.3.6.1.1.1.0.1
 entrycsn: 20090818052726.604000Z#000000#000#000000
-m-fqcn: org.apache.directory.shared.ldap.schema.syntaxCheckers.AcceptAllSyntaxCh
- ecker
+m-fqcn: org.apache.directory.shared.ldap.schema.syntaxCheckers.OctetStringSyntax
+ Checker
 objectclass: metaSyntaxChecker
 objectclass: metaTop
 objectclass: top

Modified: directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou=schema/cn=system/ou=syntaxcheckers/m-oid=1.3.6.1.4.1.1466.115.121.1.55.ldif
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou%3Dschema/cn%3Dsystem/ou%3Dsyntaxcheckers/m-oid%3D1.3.6.1.4.1.1466.115.121.1.55.ldif?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou=schema/cn=system/ou=syntaxcheckers/m-oid=1.3.6.1.4.1.1466.115.121.1.55.ldif (original)
+++ directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou=schema/cn=system/ou=syntaxcheckers/m-oid=1.3.6.1.4.1.1466.115.121.1.55.ldif Fri Oct  9 00:03:45 2009
@@ -3,8 +3,8 @@
 entryuuid:: BiVWTonXSvuB4A+EyFeK9g==
 m-oid: 1.3.6.1.4.1.1466.115.121.1.55
 entrycsn: 20090818052726.656000Z#000000#000#000000
-m-fqcn: org.apache.directory.shared.ldap.schema.syntaxCheckers.AcceptAllSyntaxCh
- ecker
+m-fqcn: org.apache.directory.shared.ldap.schema.syntaxCheckers.OctetStringSyntax
+ Checker
 objectclass: metaSyntaxChecker
 objectclass: metaTop
 objectclass: top

Modified: directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou=schema/cn=system/ou=syntaxcheckers/m-oid=1.3.6.1.4.1.1466.115.121.1.56.ldif
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou%3Dschema/cn%3Dsystem/ou%3Dsyntaxcheckers/m-oid%3D1.3.6.1.4.1.1466.115.121.1.56.ldif?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou=schema/cn=system/ou=syntaxcheckers/m-oid=1.3.6.1.4.1.1466.115.121.1.56.ldif (original)
+++ directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou=schema/cn=system/ou=syntaxcheckers/m-oid=1.3.6.1.4.1.1466.115.121.1.56.ldif Fri Oct  9 00:03:45 2009
@@ -3,8 +3,8 @@
 entryuuid:: 5rBWuVarSVy7ai0VcnqRDA==
 m-oid: 1.3.6.1.4.1.1466.115.121.1.56
 entrycsn: 20090818052726.587000Z#000000#000#000000
-m-fqcn: org.apache.directory.shared.ldap.schema.syntaxCheckers.AcceptAllSyntaxCh
- ecker
+m-fqcn: org.apache.directory.shared.ldap.schema.syntaxCheckers.OctetStringSyntax
+ Checker
 objectclass: metaSyntaxChecker
 objectclass: metaTop
 objectclass: top

Modified: directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou=schema/cn=system/ou=syntaxcheckers/m-oid=1.3.6.1.4.1.1466.115.121.1.57.ldif
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou%3Dschema/cn%3Dsystem/ou%3Dsyntaxcheckers/m-oid%3D1.3.6.1.4.1.1466.115.121.1.57.ldif?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou=schema/cn=system/ou=syntaxcheckers/m-oid=1.3.6.1.4.1.1466.115.121.1.57.ldif (original)
+++ directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou=schema/cn=system/ou=syntaxcheckers/m-oid=1.3.6.1.4.1.1466.115.121.1.57.ldif Fri Oct  9 00:03:45 2009
@@ -3,8 +3,8 @@
 entryuuid:: 6d22usemTou/+JkTfLkboA==
 m-oid: 1.3.6.1.4.1.1466.115.121.1.57
 entrycsn: 20090818052726.934000Z#000000#000#000000
-m-fqcn: org.apache.directory.shared.ldap.schema.syntaxCheckers.AcceptAllSyntaxCh
- ecker
+m-fqcn: org.apache.directory.shared.ldap.schema.syntaxCheckers.OctetStringSyntax
+ Checker
 objectclass: metaSyntaxChecker
 objectclass: metaTop
 objectclass: top

Modified: directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou=schema/cn=system/ou=syntaxcheckers/m-oid=1.3.6.1.4.1.1466.115.121.1.59.ldif
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou%3Dschema/cn%3Dsystem/ou%3Dsyntaxcheckers/m-oid%3D1.3.6.1.4.1.1466.115.121.1.59.ldif?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou=schema/cn=system/ou=syntaxcheckers/m-oid=1.3.6.1.4.1.1466.115.121.1.59.ldif (original)
+++ directory/shared/branches/shared-schema/ldap-schema/src/main/resources/schema/ou=schema/cn=system/ou=syntaxcheckers/m-oid=1.3.6.1.4.1.1466.115.121.1.59.ldif Fri Oct  9 00:03:45 2009
@@ -3,8 +3,8 @@
 entryuuid:: EgQD634PQWeT2ddb2c5RhA==
 m-oid: 1.3.6.1.4.1.1466.115.121.1.59
 entrycsn: 20090818052726.851000Z#000000#000#000000
-m-fqcn: org.apache.directory.shared.ldap.schema.syntaxCheckers.AcceptAllSyntaxCh
- ecker
+m-fqcn: org.apache.directory.shared.ldap.schema.syntaxCheckers.OctetStringSyntax
+ Checker
 objectclass: metaSyntaxChecker
 objectclass: metaTop
 objectclass: top

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/AttributeType.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/AttributeType.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/AttributeType.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/AttributeType.java Fri Oct  9 00:03:45 2009
@@ -22,6 +22,8 @@
 
 import javax.naming.NamingException;
 
+import org.apache.directory.shared.ldap.exception.LdapSchemaViolationException;
+import org.apache.directory.shared.ldap.message.ResultCodeEnum;
 import org.apache.directory.shared.ldap.schema.registries.AttributeTypeRegistry;
 import org.apache.directory.shared.ldap.schema.registries.LdapSyntaxRegistry;
 import org.apache.directory.shared.ldap.schema.registries.MatchingRuleRegistry;
@@ -197,9 +199,13 @@
     
     /**
      * Inject the registries into this Object, updating the references to
-     * other SchemaObject
+     * other SchemaObject.
+     * 
+     * If one of the referenced SchemaObject does not exist (SUP, EQUALITY, ORDERING, SUBSTR, SYNTAX), 
+     * an exception is thrown.
      *
      * @param registries The Registries
+     * @exception If the AttributeType is not valid 
      */
     public void applyRegistries( Registries registries ) throws NamingException
     {
@@ -218,20 +224,55 @@
             {
                 equality = mrRegistry.lookup( equalityOid );
             }
+            else if ( superior != null )
+            {
+                // We may have a superior with an EQUALITY MR 
+                equality = superior.getEquality();
+            }
             
             if ( orderingOid != null )
             {
                 ordering = mrRegistry.lookup( orderingOid );
             }
+            else if ( superior != null )
+            {
+                // We may have a superior with an ORDERING MR 
+                ordering = superior.getOrdering();
+            }
             
             if ( substringOid != null )
             {
                 substring = mrRegistry.lookup( substringOid );
             }
+            else if ( superior != null )
+            {
+                // We may have a superior with an SUBSTR MR 
+                substring = superior.getSubstring();
+            }
             
             LdapSyntaxRegistry lsRegistry = registries.getLdapSyntaxRegistry();
             
-            syntax = lsRegistry.lookup( syntaxOid );
+            if ( syntaxOid != null )
+            {
+                syntax = lsRegistry.lookup( syntaxOid );
+            }
+            else  if ( superior != null )
+            {
+                syntax = superior.getSyntax();
+            }
+            else
+            {
+                // This is an error: an AttributeType must have at least a SYNTAX or a SUP
+                throw new LdapSchemaViolationException( "The created AttributeType must have a SUP or a SYNTAX element", 
+                    ResultCodeEnum.UNWILLING_TO_PERFORM );
+            }
+            
+            // Inject the attributeType into the oid/normalizer map
+            atRegistry.addMappingFor( this );
+    
+            // Register this AttributeType into the Descendant map
+            atRegistry.registerDescendants( this, this.getSuperior() );
+            
         }
     }
     

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/LdapSyntax.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/LdapSyntax.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/LdapSyntax.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/LdapSyntax.java Fri Oct  9 00:03:45 2009
@@ -23,7 +23,7 @@
 import javax.naming.NamingException;
 
 import org.apache.directory.shared.ldap.schema.registries.Registries;
-import org.apache.directory.shared.ldap.schema.syntaxCheckers.AcceptAllSyntaxChecker;
+import org.apache.directory.shared.ldap.schema.syntaxCheckers.OctetStringSyntaxChecker;
 
 
 /**
@@ -193,7 +193,7 @@
             }
             catch ( NamingException ne )
             {
-                syntaxChecker = new  AcceptAllSyntaxChecker( oid );
+                syntaxChecker = new OctetStringSyntaxChecker();
             }
         }
     }

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/MatchingRule.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/MatchingRule.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/MatchingRule.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/MatchingRule.java Fri Oct  9 00:03:45 2009
@@ -22,6 +22,8 @@
 
 import javax.naming.NamingException;
 
+import org.apache.directory.shared.ldap.exception.LdapSchemaViolationException;
+import org.apache.directory.shared.ldap.message.ResultCodeEnum;
 import org.apache.directory.shared.ldap.schema.comparators.ComparableComparator;
 import org.apache.directory.shared.ldap.schema.normalizers.NoOpNormalizer;
 import org.apache.directory.shared.ldap.schema.registries.Registries;
@@ -144,7 +146,9 @@
             }
             catch ( NamingException ne )
             {
-                ldapSyntax = new LdapSyntax( oid );
+                // The Syntax is a mandatory element, it must exist.
+                throw new LdapSchemaViolationException( "The created MatchingRule must refers to an existing SYNTAX element", 
+                    ResultCodeEnum.UNWILLING_TO_PERFORM );
             }
         }
     }

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/Normalizer.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/Normalizer.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/Normalizer.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/Normalizer.java Fri Oct  9 00:03:45 2009
@@ -83,7 +83,7 @@
      *
      * @param registries The Registries
      */
-    public void setRegistries( Registries registries )
+    public void applyRegistries( Registries registries )
     {
         // Do nothing. The extended class will store the Registries if needed
     }

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/ObjectClass.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/ObjectClass.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/ObjectClass.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/ObjectClass.java Fri Oct  9 00:03:45 2009
@@ -115,6 +115,7 @@
         mayAttributeTypes = new ArrayList<AttributeType>();
         mustAttributeTypes = new ArrayList<AttributeType>();
         superiors = new ArrayList<ObjectClass>();
+        objectClassType = ObjectClassTypeEnum.STRUCTURAL;
     }
     
     
@@ -126,7 +127,7 @@
      * @throws Exception on failure
      *
      */
-    public void applyRegistries( Registries registries ) throws Exception
+    public void applyRegistries( Registries registries ) throws NamingException
     {
         if ( registries != null )
         {
@@ -143,6 +144,7 @@
                 	{
                 		continue;
                 	}
+                	
                     superiors.add( ocRegistry.lookup( ocRegistry.getOidByName( superiorName ) ) );
                 }
             }

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=823360&r1=823359&r2=823360&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  9 00:03:45 2009
@@ -28,6 +28,9 @@
 import java.util.Map;
 import java.util.Set;
 
+import javax.naming.NamingException;
+
+import org.apache.directory.shared.ldap.schema.registries.Registries;
 import org.apache.directory.shared.ldap.util.StringTools;
 
 
@@ -68,7 +71,7 @@
  * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
  * @version $Rev$
  */
-public class SchemaObject implements Serializable
+public abstract class SchemaObject implements Serializable
 {
     /** The serialVersionUID */
     public static final long serialVersionUID = 1L;
@@ -204,6 +207,18 @@
 
     
     /**
+     * Inject the registries into this Object, updating the references to
+     * other SchemaObject
+     *
+     * @param registries The Registries
+     */
+    public void applyRegistries( Registries registries ) throws NamingException
+    {
+        // Do nothing
+    }
+    
+    
+    /**
      * Add a new name to the list of names for this SchemaObject. The name
      * is lowercased and trimmed.
      *  
@@ -254,7 +269,7 @@
         if ( ! isReadOnly )
         {
             this.names = new ArrayList<String>( names.size() );
-            
+
             for ( String name:names )
             {
             	if ( name != null )
@@ -319,7 +334,9 @@
     /**
      * Tells if this SchemaObject is enabled.
      *  
-     * @return true if the SchemaObject is enabled
+     * @param schemaEnabled the associated schema status
+     * @return true if the SchemaObject is enabled, or if it depends on 
+     * an enabled schema
      */
     public boolean isEnabled()
     {
@@ -426,15 +443,29 @@
 
     
     /**
-     * Add an extensions with their values
+     * Add an extensions with their values. (Actually do a copy)
+     * 
      * @param key The extension key
      * @param values The associated values
      */
     public void setExtensions( Map<String, List<String>> extensions )
     {
-        if ( !isReadOnly )
+        if ( !isReadOnly && ( extensions != null ) )
         {
-            this.extensions = extensions;
+            this.extensions = new HashMap<String, List<String>>();
+
+            for ( String key : extensions.keySet() )
+            {
+                List<String> values = new ArrayList<String>();
+
+                for ( String value : extensions.get( key ) )
+                {
+                    values.add( value );
+                }
+
+                this.extensions.put( key, values );
+            }
+            
         }
     }
 

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SchemaObjectType.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SchemaObjectType.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SchemaObjectType.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/SchemaObjectType.java Fri Oct  9 00:03:45 2009
@@ -19,6 +19,8 @@
  */
 package org.apache.directory.shared.ldap.schema;
 
+import org.apache.directory.shared.ldap.constants.SchemaConstants;
+
 /**
  * The SchemaObject types
  *
@@ -57,4 +59,65 @@
     {
         return value;
     }
+    
+    
+    /**
+     * Get the RDN associated with a schemaObjectType
+     *
+     * @param schemaObjectType The type we want the RDN for
+     * @return The associated RDN
+     */
+    public String getRdn()
+    {
+        String schemaObjectPath = null;
+        
+        switch ( this )
+        {
+            case ATTRIBUTE_TYPE :
+                schemaObjectPath = SchemaConstants.ATTRIBUTES_TYPE_PATH;
+                break;
+                
+            case COMPARATOR :
+                schemaObjectPath = SchemaConstants.COMPARATORS_PATH;
+                break;
+                
+            case DIT_CONTENT_RULE :
+                schemaObjectPath = SchemaConstants.DIT_CONTENT_RULES_PATH;
+                break;
+                
+            case DIT_STRUCTURE_RULE :
+                schemaObjectPath = SchemaConstants.DIT_STRUCTURE_RULES_PATH;
+                break;
+                
+            case LDAP_SYNTAX :
+                schemaObjectPath = SchemaConstants.SYNTAXES_PATH;
+                break;
+                
+            case MATCHING_RULE :
+                schemaObjectPath = SchemaConstants.MATCHING_RULES_PATH;
+                break;
+                
+            case MATCHING_RULE_USE :
+                schemaObjectPath = SchemaConstants.MATCHING_RULE_USE_PATH;
+                break;
+                
+            case NAME_FORM :
+                schemaObjectPath = SchemaConstants.NAME_FORMS_PATH;
+                break;
+                
+            case NORMALIZER :
+                schemaObjectPath = SchemaConstants.NORMALIZERS_PATH;
+                break;
+                
+            case OBJECT_CLASS :
+                schemaObjectPath = SchemaConstants.OBJECT_CLASSES_PATH;
+                break;
+                
+            case SYNTAX_CHECKER :
+                schemaObjectPath = SchemaConstants.SYNTAX_CHECKERS_PATH;
+                break;
+        }
+        
+        return schemaObjectPath;
+    }
 }

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/comparators/DnComparator.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/comparators/DnComparator.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/comparators/DnComparator.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/comparators/DnComparator.java Fri Oct  9 00:03:45 2009
@@ -52,7 +52,10 @@
     }
 
     
-    public void setRegistries( Registries registries )
+    /**
+     * {@inheritDoc}
+     */
+    public void applyRegistries( Registries registries )
     {
         attrRegistry = registries.getAttributeTypeRegistry();
     }

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/CachingDeepTrimNormalizer.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/CachingDeepTrimNormalizer.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/CachingDeepTrimNormalizer.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/CachingDeepTrimNormalizer.java Fri Oct  9 00:03:45 2009
@@ -46,8 +46,8 @@
     /**
      * {@inheritDoc}
      */
-    public void setRegistries( Registries registries )
+    public void applyRegistries( Registries registries )
     {
-        super.setRegistries( registries );
+        super.applyRegistries( registries );
     }
 }

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/CachingDeepTrimToLowerNormalizer.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/CachingDeepTrimToLowerNormalizer.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/CachingDeepTrimToLowerNormalizer.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/CachingDeepTrimToLowerNormalizer.java Fri Oct  9 00:03:45 2009
@@ -46,8 +46,8 @@
     /**
      * {@inheritDoc}
      */
-    public void setRegistries( Registries registries )
+    public void applyRegistries( Registries registries )
     {
-        super.setRegistries( registries );
+        super.applyRegistries( registries );
     }
 }

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/CachingDnNormalizer.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/CachingDnNormalizer.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/CachingDnNormalizer.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/CachingDnNormalizer.java Fri Oct  9 00:03:45 2009
@@ -46,8 +46,8 @@
     /**
      * {@inheritDoc}
      */
-    public void setRegistries( Registries registries )
+    public void applyRegistries( Registries registries )
     {
-        super.setRegistries( registries );
+        super.applyRegistries( registries );
     }
 }

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/CachingNormalizer.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/CachingNormalizer.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/CachingNormalizer.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/CachingNormalizer.java Fri Oct  9 00:03:45 2009
@@ -154,8 +154,8 @@
     /**
      * {@inheritDoc}
      */
-    public void setRegistries( Registries registries )
+    public void applyRegistries( Registries registries )
     {
-        normalizer.setRegistries( registries );
+        normalizer.applyRegistries( registries );
     }
 }

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/DnNormalizer.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/DnNormalizer.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/DnNormalizer.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/DnNormalizer.java Fri Oct  9 00:03:45 2009
@@ -68,15 +68,6 @@
     /**
      * {@inheritDoc}
      */
-    public void setRegistries( Registries registries )
-    {
-        this.attrRegistry = registries.getAttributeTypeRegistry();
-    }
-    
-
-    /**
-     * {@inheritDoc}
-     */
     public Value<?> normalize( Value<?> value ) throws NamingException
     {
         LdapDN dn = null;
@@ -119,4 +110,13 @@
         dn.normalize( attrRegistry.getNormalizerMapping() );
         return dn.getNormName();
     }
+
+
+    /**
+     * {@inheritDoc}
+     */
+    public void applyRegistries( Registries registries )
+    {
+        attrRegistry = registries.getAttributeTypeRegistry();
+    }
 }

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/NameAndOptionalUIDNormalizer.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/NameAndOptionalUIDNormalizer.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/NameAndOptionalUIDNormalizer.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/NameAndOptionalUIDNormalizer.java Fri Oct  9 00:03:45 2009
@@ -20,6 +20,8 @@
 package org.apache.directory.shared.ldap.schema.normalizers;
 
 
+import javax.naming.NamingException;
+
 import org.apache.directory.shared.ldap.entry.Value;
 import org.apache.directory.shared.ldap.entry.client.ClientStringValue;
 import org.apache.directory.shared.ldap.name.LdapDN;
@@ -28,8 +30,6 @@
 import org.apache.directory.shared.ldap.schema.registries.Registries;
 import org.apache.directory.shared.ldap.util.StringTools;
 
-import javax.naming.NamingException;
-
 
 /**
  * A noirmalizer for UniqueMember
@@ -60,7 +60,10 @@
     }
     
     
-    public void setRegistries( Registries registries )
+    /**
+     * {@inheritDoc}
+     */
+    public void applyRegistries( Registries registries )
     {
         this.attrRegistry = registries.getAttributeTypeRegistry();
     }

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/NameOrNumericIdNormalizer.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/NameOrNumericIdNormalizer.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/NameOrNumericIdNormalizer.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/normalizers/NameOrNumericIdNormalizer.java Fri Oct  9 00:03:45 2009
@@ -143,7 +143,10 @@
     }
     
     
-    public void setRegistries( Registries registries )
+    /**
+     * {@inheritDoc}
+     */
+    public void applyRegistries( Registries registries )
     {
         this.registries = registries;
     }

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/registries/AttributeTypeRegistry.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/registries/AttributeTypeRegistry.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/registries/AttributeTypeRegistry.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/registries/AttributeTypeRegistry.java Fri Oct  9 00:03:45 2009
@@ -153,12 +153,6 @@
         {
             super.register( attributeType );
             
-            // Inject the attributeType into the oid/normalizer map
-            addMappingFor( attributeType );
-    
-            // Register this AttributeType into the Descendant map
-            registerDescendants( attributeType, attributeType.getSuperior() );
-            
             // Internally associate the OID to the registered AttributeType
             if ( IS_DEBUG )
             {
@@ -289,7 +283,7 @@
     /**
      * Add a new Oid/Normalizer couple in the OidNormalizer map
      */
-    private void addMappingFor( AttributeType attributeType ) throws NamingException
+    public void addMappingFor( AttributeType attributeType ) throws NamingException
     {
         MatchingRule matchingRule = attributeType.getEquality();
         OidNormalizer oidNormalizer;

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/registries/Registries.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/registries/Registries.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/registries/Registries.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/registries/Registries.java Fri Oct  9 00:03:45 2009
@@ -26,6 +26,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 
 import javax.naming.NamingException;
 
@@ -98,6 +99,18 @@
     /** A map storing all the schema objects associated with a schema */
     private Map<String, Set<SchemaWrapper>> schemaObjectsBySchemaName;
     
+    /**
+     *  A map storing a relation between a SchemaObject and all the 
+     *  referencing SchemaObjects.
+     */
+    protected Map<SchemaWrapper, Set<SchemaObject>> usedBy;
+    
+    /**
+     *  A map storing a relation between a SchemaObject and all the 
+     *  SchemaObjects it uses.
+     */
+    protected Map<SchemaWrapper, Set<SchemaObject>> using;
+    
 
     /**
      * Creates a new instance of Registries.
@@ -119,6 +132,8 @@
         objectClassRegistry = new ObjectClassRegistry( oidRegistry );
         syntaxCheckerRegistry = new SyntaxCheckerRegistry( oidRegistry );
         schemaObjectsBySchemaName = new HashMap<String, Set<SchemaWrapper>>();
+        usedBy = new ConcurrentHashMap<SchemaWrapper, Set<SchemaObject>>();
+        using = new ConcurrentHashMap<SchemaWrapper, Set<SchemaObject>>();
     }
 
     
@@ -433,7 +448,7 @@
 
 
     /**
-     * Check if the Normalizer and Comparator are existing for a matchingRule
+     * Check if the Comparator and the syntax are existing for a matchingRule
      */
     private boolean resolve( MatchingRule mr, List<Throwable> errors )
     {
@@ -462,22 +477,6 @@
 
         try
         {
-            if ( mr.getNormalizer() == null )
-            {
-                String schema = matchingRuleRegistry.getSchemaName( mr.getOid() );
-                errors.add( new NullPointerException( "matchingRule " + mr.getName() + " in schema " + schema
-                    + " with OID " + mr.getOid() + " has a null normalizer" ) );
-                isSuccess = false;
-            }
-        }
-        catch ( Exception e )
-        {
-            errors.add( e );
-            isSuccess = false;
-        }
-
-        try
-        {
             isSuccess &= resolve( mr.getSyntax(), errors );
 
             if ( mr.getSyntax() == null )
@@ -668,7 +667,7 @@
 	 * @return Gets a reference to the Map associating a schemaName to
 	 * its contained SchemaObjects
 	 */
-	public Map<String, Set<SchemaWrapper>> getObjectBySchemaname()
+	public Map<String, Set<SchemaWrapper>> getObjectBySchemaName()
 	{
 	    return schemaObjectsBySchemaName;
 	}
@@ -764,6 +763,12 @@
 	}
 
 
+	/**
+	 * Unregister a SchemaObject from the registries
+	 *
+	 * @param schemaObject The SchemaObject we want to deregister
+	 * @throws NamingException If the removal failed
+	 */
     public void unregister( SchemaObject schemaObject ) throws NamingException
     {
         String oid = schemaObject.getOid();
@@ -831,4 +836,193 @@
             // Not present !!
         }
     }
+    
+    
+    /**
+     * Checks if a specific SchemaObject is referenced by any other SchemaObject.
+     *
+     * @param schemaObject The SchemaObject we are looking for
+     * @return true if there is at least one SchemaObjetc referencing the given one
+     */
+    public boolean isReferenced( SchemaObject schemaObject )
+    {
+        SchemaWrapper wrapper = new SchemaWrapper( schemaObject );
+        
+        Set<SchemaObject> set = using.get( wrapper );
+        
+        return ( set != null ) && ( set.size() != 0 );
+    }
+
+    
+    /**
+     * Gets the Set of SchemaObjects referencing the given SchemaObject
+     *
+     * @param schemaObject The SchemaObject we are looking for
+     * @return The Set of referencing SchemaObject, or null 
+     */
+    public Set<SchemaObject> getUsedBy( SchemaObject schemaObject )
+    {
+        SchemaWrapper wrapper = new SchemaWrapper( schemaObject );
+        
+        return usedBy.get( wrapper );
+    }
+
+    
+    /**
+     * Gets the Set of SchemaObjects referenced by the given SchemaObject
+     *
+     * @param schemaObject The SchemaObject we are looking for
+     * @return The Set of referenced SchemaObject, or null 
+     */
+    public Set<SchemaObject> getUsing( SchemaObject schemaObject )
+    {
+        SchemaWrapper wrapper = new SchemaWrapper( schemaObject );
+        
+        return using.get( wrapper );
+    }
+    
+    
+    /**
+     * Add an association between a SchemaObject an the SchemaObject it refers
+     *
+     * @param reference The base SchemaObject
+     * @param referee The SchemaObject pointing on the reference
+     */
+    private void addUsing( SchemaObject reference, SchemaObject referee )
+    {
+        if ( ( reference == null ) || ( referee == null ) )
+        {
+            return;
+        }
+        
+        SchemaWrapper wrapper = new SchemaWrapper( reference );
+        
+        Set<SchemaObject> usedBy = getUsedBy( reference );
+        
+        if ( usedBy == null )
+        {
+            usedBy = new HashSet<SchemaObject>();
+            using.put( wrapper, usedBy );
+        }
+        
+        usedBy.add( referee );
+    }
+    
+    
+    /**
+     * Add an association between a SchemaObject an the SchemaObject it refers
+     *
+     * @param reference The base SchemaObject
+     * @param referee The SchemaObject pointing on the reference
+     */
+    public void addReference( SchemaObject reference, SchemaObject referee )
+    {
+        addUsing( reference, referee );
+        addUsedBy( referee, reference );
+    }
+
+
+    /**
+     * Add an association between a SchemaObject an the SchemaObject that refers it
+     *
+     * @param reference The base SchemaObject
+     * @param referee The SchemaObject pointing on the reference
+     */
+    private void addUsedBy( SchemaObject referee, SchemaObject reference )
+    {
+        if ( ( reference == null ) || ( referee == null ) )
+        {
+            return;
+        }
+        SchemaWrapper wrapper = new SchemaWrapper( referee );
+        
+        Set<SchemaObject> using = getUsing( referee );
+        
+        if ( using == null )
+        {
+            using = new HashSet<SchemaObject>();
+            usedBy.put( wrapper, using );
+        }
+        
+        using.add( reference );
+    }
+    
+    
+    /**
+     * Del an association between a SchemaObject an the SchemaObject it refers
+     *
+     * @param reference The base SchemaObject
+     * @param referee The SchemaObject pointing on the reference
+     */
+    private void delUsing( SchemaObject reference, SchemaObject referee )
+    {
+        if ( ( reference == null ) || ( referee == null ) )
+        {
+            return;
+        }
+        
+        Set<SchemaObject> usedBy = getUsedBy( reference );
+        
+        if ( usedBy == null )
+        {
+            return;
+        }
+        
+        usedBy.remove( referee );
+        
+        if ( usedBy.size() == 0 )
+        {
+            SchemaWrapper wrapper = new SchemaWrapper( reference );
+            
+            using.remove( wrapper );
+        }
+        
+        return;
+    }
+
+
+    /**
+     * Del an association between a SchemaObject an the SchemaObject that refers it
+     *
+     * @param reference The base SchemaObject
+     * @param referee The SchemaObject pointing on the reference
+     */
+    private void delUsedBy( SchemaObject referee, SchemaObject reference )
+    {
+        if ( ( reference == null ) || ( referee == null ) )
+        {
+            return;
+        }
+
+        Set<SchemaObject> using = getUsing( referee );
+        
+        if ( using == null )
+        {
+            return;
+        }
+        
+        using.remove( reference );
+        
+        if ( using.size() == 0 )
+        {
+            SchemaWrapper wrapper = new SchemaWrapper( referee );
+            
+            usedBy.remove( wrapper );
+        }
+        
+        return;
+    }
+    
+    
+    /**
+     * Delete an association between a SchemaObject an the SchemaObject it refers
+     *
+     * @param reference The base SchemaObject
+     * @param referee The SchemaObject pointing on the reference
+     */
+    public void delReference( SchemaObject reference, SchemaObject referee )
+    {
+        delUsing( reference, referee );
+        delUsedBy( referee, reference );
+    }
 }

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/registries/SchemaObjectRegistry.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/registries/SchemaObjectRegistry.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/registries/SchemaObjectRegistry.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/registries/SchemaObjectRegistry.java Fri Oct  9 00:03:45 2009
@@ -213,22 +213,25 @@
     {
         String oid = schemaObject.getOid();
         
-        if ( byName.containsKey( oid ) )
+        if ( schemaObject.isEnabled() )
         {
-            String msg = type.name() + " with OID " + oid + " already registered!";
-            LOG.warn( msg );
-            throw new NamingException( msg );
-        }
-
-        byName.put( oid, schemaObject );
-        
-        /*
-         * add the aliases/names to the name map along with their toLowerCase
-         * versions of the name: this is used to make sure name lookups work
-         */
-        for ( String name : schemaObject.getNames() )
-        {
-        	byName.put( StringTools.trim( StringTools.toLowerCase( name ) ), schemaObject );
+            if ( byName.containsKey( oid ) )
+            {
+                String msg = type.name() + " with OID " + oid + " already registered!";
+                LOG.warn( msg );
+                throw new NamingException( msg );
+            }
+    
+            byName.put( oid, schemaObject );
+            
+            /*
+             * add the aliases/names to the name map along with their toLowerCase
+             * versions of the name: this is used to make sure name lookups work
+             */
+            for ( String name : schemaObject.getNames() )
+            {
+            	byName.put( StringTools.trim( StringTools.toLowerCase( name ) ), schemaObject );
+            }
         }
         
         if ( LOG.isDebugEnabled() )

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/registries/SyntaxCheckerRegistry.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/registries/SyntaxCheckerRegistry.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/registries/SyntaxCheckerRegistry.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/registries/SyntaxCheckerRegistry.java Fri Oct  9 00:03:45 2009
@@ -71,7 +71,7 @@
         {
             String msg = type.name() + " with OID " + oid + " already registered!";
             LOG.warn( msg );
-            throw new NamingException( msg );
+            //throw new NamingException( msg );
         }
 
         byName.put( oid, syntaxChecker );

Modified: directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/syntaxCheckers/OctetStringSyntaxChecker.java
URL: http://svn.apache.org/viewvc/directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/syntaxCheckers/OctetStringSyntaxChecker.java?rev=823360&r1=823359&r2=823360&view=diff
==============================================================================
--- directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/syntaxCheckers/OctetStringSyntaxChecker.java (original)
+++ directory/shared/branches/shared-schema/ldap/src/main/java/org/apache/directory/shared/ldap/schema/syntaxCheckers/OctetStringSyntaxChecker.java Fri Oct  9 00:03:45 2009
@@ -59,18 +59,6 @@
      */
     public boolean isValidSyntax( Object value )
     {
-        // It must be a byte[]
-        boolean result = value instanceof byte[];
-        
-        if ( result )
-        {
-            LOG.debug( "Syntax valid for '{}'", value );
-        }
-        else
-        {
-            LOG.debug( "Syntax invalid for '{}'", value );
-        }
-        
-        return result;
+        return ( value != null );
     }
 }