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 2008/08/21 19:10:44 UTC

svn commit: r687803 - in /directory/apacheds/trunk: core-integ/src/test/java/org/apache/directory/server/core/schema/ core/src/main/java/org/apache/directory/server/core/schema/

Author: elecharny
Date: Thu Aug 21 10:10:43 2008
New Revision: 687803

URL: http://svn.apache.org/viewvc?rev=687803&view=rev
Log:
o Add a fix for DIRSERVER-851
o Added test cases to check the fix
o Modify the tests so that they don't call another tests themselves

Modified:
    directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/schema/MetaObjectClassHandlerIT.java
    directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/schema/ObjectClassCreateIT.java
    directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/schema/SchemaInterceptor.java

Modified: directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/schema/MetaObjectClassHandlerIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/schema/MetaObjectClassHandlerIT.java?rev=687803&r1=687802&r2=687803&view=diff
==============================================================================
--- directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/schema/MetaObjectClassHandlerIT.java (original)
+++ directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/schema/MetaObjectClassHandlerIT.java Thu Aug 21 10:10:43 2008
@@ -20,12 +20,10 @@
 package org.apache.directory.server.core.schema;
 
 
-import org.apache.directory.server.constants.MetaSchemaConstants;
 import org.apache.directory.server.core.DirectoryService;
 import org.apache.directory.server.core.integ.CiRunner;
 import static org.apache.directory.server.core.integ.IntegrationUtils.getSchemaContext;
 import org.apache.directory.server.schema.registries.ObjectClassRegistry;
-import org.apache.directory.shared.ldap.constants.SchemaConstants;
 import org.apache.directory.shared.ldap.exception.LdapInvalidNameException;
 import org.apache.directory.shared.ldap.exception.LdapOperationNotSupportedException;
 import org.apache.directory.shared.ldap.message.AttributeImpl;
@@ -89,6 +87,26 @@
     {
         return service.getRegistries().getObjectClassRegistry();
     }
+    
+    
+    private void addObjectClass() throws Exception
+    {
+        Attributes attrs = new AttributesImpl();
+        Attribute oc = new AttributeImpl( "objectClass", "top" );
+        oc.add( "metaTop" );
+        oc.add( "metaObjectClass" );
+        attrs.put( oc );
+        attrs.put( "m-oid", OID );
+        attrs.put( "m-name", NAME);
+        attrs.put( "m-description", DESCRIPTION0 );
+        attrs.put( "m-typeObjectClass", "AUXILIARY" );
+        attrs.put( "m-must", "cn" );
+        attrs.put( "m-may", "ou" );
+        
+        LdapDN dn = getObjectClassContainer( "apachemeta" );
+        dn.add( "m-oid" + "=" + OID );
+        getSchemaContext( service ).createSubcontext( dn, attrs );
+    }
 
     
     // ----------------------------------------------------------------------
@@ -99,21 +117,7 @@
     @Test
     public void testAddObjectClass() throws Exception
     {
-        Attributes attrs = new AttributesImpl();
-        Attribute oc = new AttributeImpl( SchemaConstants.OBJECT_CLASS_AT, "top" );
-        oc.add( MetaSchemaConstants.META_TOP_OC );
-        oc.add( MetaSchemaConstants.META_OBJECT_CLASS_OC );
-        attrs.put( oc );
-        attrs.put( MetaSchemaConstants.M_OID_AT, OID );
-        attrs.put( MetaSchemaConstants.M_NAME_AT, NAME);
-        attrs.put( MetaSchemaConstants.M_DESCRIPTION_AT, DESCRIPTION0 );
-        attrs.put( MetaSchemaConstants.M_TYPE_OBJECT_CLASS_AT, "AUXILIARY" );
-        attrs.put( MetaSchemaConstants.M_MUST_AT, "cn" );
-        attrs.put( MetaSchemaConstants.M_MAY_AT, "ou" );
-        
-        LdapDN dn = getObjectClassContainer( "apachemeta" );
-        dn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
-        getSchemaContext( service ).createSubcontext( dn, attrs );
+        addObjectClass();
         
         assertTrue( getObjectClassRegistry().hasObjectClass( OID ) );
         assertEquals( getObjectClassRegistry().getSchemaName( OID ), "apachemeta" );
@@ -124,8 +128,8 @@
     public void testDeleteAttributeType() throws Exception
     {
         LdapDN dn = getObjectClassContainer( "apachemeta" );
-        dn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
-        testAddObjectClass();
+        dn.add( "m-oid" + "=" + OID );
+        addObjectClass();
         
         getSchemaContext( service ).destroySubcontext( dn );
 
@@ -148,11 +152,11 @@
     public void testRenameAttributeType() throws Exception
     {
         LdapDN dn = getObjectClassContainer( "apachemeta" );
-        dn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
-        testAddObjectClass();
+        dn.add( "m-oid" + "=" + OID );
+        addObjectClass();
         
         LdapDN newdn = getObjectClassContainer( "apachemeta" );
-        newdn.add( MetaSchemaConstants.M_OID_AT + "=" + NEW_OID );
+        newdn.add( "m-oid" + "=" + NEW_OID );
         getSchemaContext( service ).rename( dn, newdn );
 
         assertFalse( "old objectClass OID should be removed from the registry after being renamed", 
@@ -175,13 +179,13 @@
     @Test
     public void testMoveAttributeType() throws Exception
     {
-        testAddObjectClass();
+        addObjectClass();
         
         LdapDN dn = getObjectClassContainer( "apachemeta" );
-        dn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
+        dn.add( "m-oid" + "=" + OID );
 
         LdapDN newdn = getObjectClassContainer( "apache" );
-        newdn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
+        newdn.add( "m-oid" + "=" + OID );
         
         getSchemaContext( service ).rename( dn, newdn );
 
@@ -196,13 +200,13 @@
     @Test
     public void testMoveObjectClassAndChangeRdn() throws Exception
     {
-        testAddObjectClass();
+        addObjectClass();
         
         LdapDN dn = getObjectClassContainer( "apachemeta" );
-        dn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
+        dn.add( "m-oid" + "=" + OID );
 
         LdapDN newdn = getObjectClassContainer( "apache" );
-        newdn.add( MetaSchemaConstants.M_OID_AT + "=" + NEW_OID );
+        newdn.add( "m-oid" + "=" + NEW_OID );
         
         getSchemaContext( service ).rename( dn, newdn );
 
@@ -220,19 +224,19 @@
     @Test
     public void testModifyAttributeTypeWithModificationItems() throws Exception
     {
-        testAddObjectClass();
+        addObjectClass();
         
         ObjectClass oc = getObjectClassRegistry().lookup( OID );
         assertEquals( oc.getDescription(), DESCRIPTION0 );
         assertEquals( oc.getName(), NAME );
 
         LdapDN dn = getObjectClassContainer( "apachemeta" );
-        dn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
+        dn.add( "m-oid" + "=" + OID );
         
         ModificationItemImpl[] mods = new ModificationItemImpl[2];
-        Attribute attr = new AttributeImpl( MetaSchemaConstants.M_DESCRIPTION_AT, DESCRIPTION1 );
+        Attribute attr = new AttributeImpl( "m-description", DESCRIPTION1 );
         mods[0] = new ModificationItemImpl( DirContext.REPLACE_ATTRIBUTE, attr );
-        attr = new AttributeImpl( MetaSchemaConstants.M_NAME_AT, NEW_NAME );
+        attr = new AttributeImpl( "m-name", NEW_NAME );
         mods[1] = new ModificationItemImpl( DirContext.REPLACE_ATTRIBUTE, attr );
         getSchemaContext( service ).modifyAttributes( dn, mods );
 
@@ -251,18 +255,18 @@
     @Test
     public void testModifyAttributeTypeWithAttributes() throws Exception
     {
-        testAddObjectClass();
+        addObjectClass();
         
         ObjectClass oc = getObjectClassRegistry().lookup( OID );
         assertEquals( oc.getDescription(), DESCRIPTION0 );
         assertEquals( oc.getName(), NAME );
 
         LdapDN dn = getObjectClassContainer( "apachemeta" );
-        dn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
+        dn.add( "m-oid" + "=" + OID );
         
         Attributes mods = new AttributesImpl();
-        mods.put( MetaSchemaConstants.M_DESCRIPTION_AT, DESCRIPTION1 );
-        mods.put( MetaSchemaConstants.M_NAME_AT, NEW_NAME );
+        mods.put( "m-description", DESCRIPTION1 );
+        mods.put( "m-name", NEW_NAME );
         getSchemaContext( service ).modifyAttributes( dn, DirContext.REPLACE_ATTRIBUTE, mods );
 
         assertTrue( "objectClass OID should still be present", 
@@ -280,25 +284,23 @@
     // ----------------------------------------------------------------------
     // Test move, rename, and delete when a OC exists and uses the OC as sup
     // ----------------------------------------------------------------------
-
-    
     private void addDependeeObjectClass() throws Exception
     {
         Attributes attrs = new AttributesImpl();
-        Attribute oc = new AttributeImpl( SchemaConstants.OBJECT_CLASS_AT, "top" );
-        oc.add( MetaSchemaConstants.META_TOP_OC );
-        oc.add( MetaSchemaConstants.META_OBJECT_CLASS_OC );
-        attrs.put( oc );
-        attrs.put( MetaSchemaConstants.M_OID_AT, DEPENDEE_OID );
-        attrs.put( MetaSchemaConstants.M_NAME_AT, DEPENDEE_NAME );
-        attrs.put( MetaSchemaConstants.M_DESCRIPTION_AT, DESCRIPTION0 );
-        attrs.put( MetaSchemaConstants.M_TYPE_OBJECT_CLASS_AT, "AUXILIARY" );
-        attrs.put( MetaSchemaConstants.M_MUST_AT, "cn" );
-        attrs.put( MetaSchemaConstants.M_MAY_AT, "ou" );
-        attrs.put( MetaSchemaConstants.M_SUP_OBJECT_CLASS_AT, OID );
+        Attribute oc = new AttributeImpl( "objectClass", "top" );
+        oc.add( "metaTop" );
+        oc.add( "metaObjectClass" );
+        attrs.put( oc );
+        attrs.put( "m-oid", DEPENDEE_OID );
+        attrs.put( "m-name", DEPENDEE_NAME );
+        attrs.put( "m-description", DESCRIPTION0 );
+        attrs.put( "m-typeObjectClass", "AUXILIARY" );
+        attrs.put( "m-must", "cn" );
+        attrs.put( "m-may", "ou" );
+        attrs.put( "m-supObjectClass", OID );
         
         LdapDN dn = getObjectClassContainer( "apachemeta" );
-        dn.add( MetaSchemaConstants.M_OID_AT + "=" + DEPENDEE_OID );
+        dn.add( "m-oid" + "=" + DEPENDEE_OID );
         getSchemaContext( service ).createSubcontext( dn, attrs );
         
         assertTrue( getObjectClassRegistry().hasObjectClass( DEPENDEE_OID ) );
@@ -310,8 +312,8 @@
     public void testDeleteObjectClassWhenInUse() throws Exception
     {
         LdapDN dn = getObjectClassContainer( "apachemeta" );
-        dn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
-        testAddObjectClass();
+        dn.add( "m-oid" + "=" + OID );
+        addObjectClass();
         addDependeeObjectClass();
         
         try
@@ -332,14 +334,14 @@
     @Test
     public void testMoveObjectClassWhenInUse() throws Exception
     {
-        testAddObjectClass();
+        addObjectClass();
         addDependeeObjectClass();
         
         LdapDN dn = getObjectClassContainer( "apachemeta" );
-        dn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
+        dn.add( "m-oid" + "=" + OID );
 
         LdapDN newdn = getObjectClassContainer( "apache" );
-        newdn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
+        newdn.add( "m-oid" + "=" + OID );
         
         try
         {
@@ -359,14 +361,14 @@
     @Test
     public void testMoveObjectClassAndChangeRdnWhenInUse() throws Exception
     {
-        testAddObjectClass();
+        addObjectClass();
         addDependeeObjectClass();
         
         LdapDN dn = getObjectClassContainer( "apachemeta" );
-        dn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
+        dn.add( "m-oid" + "=" + OID );
 
         LdapDN newdn = getObjectClassContainer( "apache" );
-        newdn.add( MetaSchemaConstants.M_OID_AT + "=" + NEW_OID );
+        newdn.add( "m-oid" + "=" + NEW_OID );
         
         try
         {
@@ -387,12 +389,12 @@
     public void testRenameObjectClassWhenInUse() throws Exception
     {
         LdapDN dn = getObjectClassContainer( "apachemeta" );
-        dn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
-        testAddObjectClass();
+        dn.add( "m-oid" + "=" + OID );
+        addObjectClass();
         addDependeeObjectClass();
         
         LdapDN newdn = getObjectClassContainer( "apachemeta" );
-        newdn.add( MetaSchemaConstants.M_OID_AT + "=" + NEW_OID );
+        newdn.add( "m-oid" + "=" + NEW_OID );
         
         try
         {
@@ -412,18 +414,16 @@
     // ----------------------------------------------------------------------
     // Let's try some freaky stuff
     // ----------------------------------------------------------------------
-
-
     @Test
     public void testMoveObjectClassToTop() throws Exception
     {
-        testAddObjectClass();
+        addObjectClass();
         
         LdapDN dn = getObjectClassContainer( "apachemeta" );
-        dn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
+        dn.add( "m-oid" + "=" + OID );
 
         LdapDN top = new LdapDN();
-        top.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
+        top.add( "m-oid" + "=" + OID );
         
         try
         {
@@ -443,13 +443,13 @@
     @Test
     public void testMoveObjectClassToComparatorContainer() throws Exception
     {
-        testAddObjectClass();
+        addObjectClass();
         
         LdapDN dn = getObjectClassContainer( "apachemeta" );
-        dn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
+        dn.add( "m-oid" + "=" + OID );
 
         LdapDN newdn = new LdapDN( "ou=comparators,cn=apachemeta" );
-        newdn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
+        newdn.add( "m-oid" + "=" + OID );
         
         try
         {
@@ -464,26 +464,31 @@
         assertTrue( "objectClass should still be in the registry after move failure", 
             getObjectClassRegistry().hasObjectClass( OID ) );
     }
+
     
-    
-    @Test
-    public void testAddObjectClassToDisabledSchema() throws Exception
+    private void addObjectClassToDisabledSchema() throws Exception
     {
         Attributes attrs = new AttributesImpl();
-        Attribute oc = new AttributeImpl( SchemaConstants.OBJECT_CLASS_AT, "top" );
-        oc.add( MetaSchemaConstants.META_TOP_OC );
-        oc.add( MetaSchemaConstants.META_OBJECT_CLASS_OC );
-        attrs.put( oc );
-        attrs.put( MetaSchemaConstants.M_OID_AT, OID );
-        attrs.put( MetaSchemaConstants.M_NAME_AT, NAME);
-        attrs.put( MetaSchemaConstants.M_DESCRIPTION_AT, DESCRIPTION0 );
-        attrs.put( MetaSchemaConstants.M_TYPE_OBJECT_CLASS_AT, "AUXILIARY" );
-        attrs.put( MetaSchemaConstants.M_MUST_AT, "cn" );
-        attrs.put( MetaSchemaConstants.M_MAY_AT, "ou" );
+        Attribute oc = new AttributeImpl( "objectClass", "top" );
+        oc.add( "metaTop" );
+        oc.add( "metaObjectClass" );
+        attrs.put( oc );
+        attrs.put( "m-oid", OID );
+        attrs.put( "m-name", NAME);
+        attrs.put( "m-description", DESCRIPTION0 );
+        attrs.put( "m-typeObjectClass", "AUXILIARY" );
+        attrs.put( "m-must", "cn" );
+        attrs.put( "m-may", "ou" );
         
         LdapDN dn = getObjectClassContainer( "nis" );
-        dn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
+        dn.add( "m-oid" + "=" + OID );
         getSchemaContext( service ).createSubcontext( dn, attrs );
+    }
+    
+    @Test
+    public void testAddObjectClassToDisabledSchema1() throws Exception
+    {
+        addObjectClassToDisabledSchema();
         
         assertFalse( "adding new objectClass to disabled schema should not register it into the registries", 
             getObjectClassRegistry().hasObjectClass( OID ) );
@@ -493,14 +498,14 @@
     @Test
     public void testMoveObjectClassToDisabledSchema() throws Exception
     {
-        testAddObjectClass();
+        addObjectClass();
         
         LdapDN dn = getObjectClassContainer( "apachemeta" );
-        dn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
+        dn.add( "m-oid" + "=" + OID );
 
         // nis is inactive by default
         LdapDN newdn = getObjectClassContainer( "nis" );
-        newdn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
+        newdn.add( "m-oid" + "=" + OID );
         
         getSchemaContext( service ).rename( dn, newdn );
 
@@ -512,17 +517,17 @@
     @Test
     public void testMoveObjectClassToEnabledSchema() throws Exception
     {
-        testAddObjectClassToDisabledSchema();
+        addObjectClassToDisabledSchema();
         
         // nis is inactive by default
         LdapDN dn = getObjectClassContainer( "nis" );
-        dn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
+        dn.add( "m-oid" + "=" + OID );
 
         assertFalse( "objectClass OID should NOT be present when added to disabled nis schema", 
             getObjectClassRegistry().hasObjectClass( OID ) );
 
         LdapDN newdn = getObjectClassContainer( "apachemeta" );
-        newdn.add( MetaSchemaConstants.M_OID_AT + "=" + OID );
+        newdn.add( "m-oid" + "=" + OID );
         
         getSchemaContext( service ).rename( dn, newdn );
 
@@ -532,4 +537,310 @@
         assertEquals( "objectClass should be in apachemeta schema after move", 
             getObjectClassRegistry().getSchemaName( OID ), "apachemeta" );
     }
+    
+    // ----------------------------------------------------------------------
+    // Let's test the Abstract, Auiliary and Structural inheritence enforcement
+    // ----------------------------------------------------------------------
+    /**
+     * Check that we can create an ABSTRACT OC which inherit from an ABSTRACT OC
+     */
+    @Test
+    public void testAddAbstractOCinheritingFromAbstractOC() throws Exception
+    {
+        Attributes attrs = new AttributesImpl();
+        Attribute oc = new AttributeImpl( "objectClass", "top" );
+        oc.add( "metaTop" );
+        oc.add( "metaObjectClass" );
+        attrs.put( oc );
+        
+        attrs.put( "m-oid", OID );
+        attrs.put( "m-name", "abstractOCtest");
+        attrs.put( "m-description", "An abstract oC inheriting from top" );
+        attrs.put( "m-typeObjectClass", "ABSTRACT" );
+        attrs.put( "m-supObjectClass", "top" );
+        attrs.put( "m-must", "cn" );
+        attrs.put( "m-may", "ou" );
+        
+        LdapDN dn = getObjectClassContainer( "apachemeta" );
+        dn.add( "m-oid" + "=" + OID );
+        getSchemaContext( service ).createSubcontext( dn, attrs );
+        
+        assertTrue( getObjectClassRegistry().hasObjectClass( OID ) );
+        assertEquals( getObjectClassRegistry().getSchemaName( OID ), "apachemeta" );
+    }
+
+    
+    /**
+     * Check that we can't create an ABSTRACT OC which inherit from an AUXILIARY OC
+     */
+    @Test
+    public void testAddAbstractOCinheritingFromAuxiliaryOC() throws Exception
+    {
+        Attributes attrs = new AttributesImpl();
+        Attribute oc = new AttributeImpl( "objectClass", "top" );
+        oc.add( "metaTop" );
+        oc.add( "metaObjectClass" );
+        attrs.put( oc );
+        
+        attrs.put( "m-oid", OID );
+        attrs.put( "m-name", "abstractOCtest");
+        attrs.put( "m-description", "An abstract oC inheriting from top" );
+        attrs.put( "m-typeObjectClass", "ABSTRACT" );
+        attrs.put( "m-must", "cn" );
+        attrs.put( "m-may", "ou" );
+        
+        Attribute sup = new AttributeImpl( "m-supObjectClass" );
+        sup.add( "top" );
+        sup.add( "javaSerializedObject");
+        attrs.put( sup );
+        
+        LdapDN dn = getObjectClassContainer( "apachemeta" );
+        dn.add( "m-oid" + "=" + OID );
+        
+        try
+        {
+        	getSchemaContext( service ).createSubcontext( dn, attrs );
+        	fail();
+        }
+        catch ( NamingException ne )
+        {
+        	assertTrue( true );
+        }
+    }
+    
+    
+    /**
+     * Check that we can't create an ABSTRACT OC which inherit from an STRUCTURAL OC
+     */
+    @Test
+    public void testAddAbstractOCinheritingFromStructuralOC() throws Exception
+    {
+        Attributes attrs = new AttributesImpl();
+        Attribute oc = new AttributeImpl( "objectClass", "top" );
+        oc.add( "metaTop" );
+        oc.add( "metaObjectClass" );
+        attrs.put( oc );
+        
+        attrs.put( "m-oid", OID );
+        attrs.put( "m-name", "abstractOCtest");
+        attrs.put( "m-description", "An abstract oC inheriting from top" );
+        attrs.put( "m-typeObjectClass", "ABSTRACT" );
+        attrs.put( "m-must", "cn" );
+        attrs.put( "m-may", "ou" );
+        
+        Attribute sup = new AttributeImpl( "m-supObjectClass" );
+        sup.add( "top" );
+        sup.add( "person");
+        attrs.put( sup );
+        
+        LdapDN dn = getObjectClassContainer( "apachemeta" );
+        dn.add( "m-oid" + "=" + OID );
+        
+        try
+        {
+        	getSchemaContext( service ).createSubcontext( dn, attrs );
+        	fail();
+        }
+        catch ( NamingException ne )
+        {
+        	assertTrue( true );
+        }
+    }
+    
+    
+    /**
+     * Check that we can create an AUXILIARY OC which inherit from an ABSTRACT OC
+     */
+    @Test
+    public void testAddAuxiliaryOCinheritingFromAbstractOC() throws Exception
+    {
+        Attributes attrs = new AttributesImpl();
+        Attribute oc = new AttributeImpl( "objectClass", "top" );
+        oc.add( "metaTop" );
+        oc.add( "metaObjectClass" );
+        attrs.put( oc );
+        
+        attrs.put( "m-oid", NEW_OID );
+        attrs.put( "m-name", "abstractOCtest");
+        attrs.put( "m-description", "An abstract oC inheriting from top" );
+        attrs.put( "m-typeObjectClass", "AUXILIARY" );
+        attrs.put( "m-supObjectClass", "top" );
+        attrs.put( "m-must", "cn" );
+        attrs.put( "m-may", "ou" );
+        
+        LdapDN dn = getObjectClassContainer( "apachemeta" );
+        dn.add( "m-oid" + "=" + NEW_OID );
+        getSchemaContext( service ).createSubcontext( dn, attrs );
+        
+        assertTrue( getObjectClassRegistry().hasObjectClass( NEW_OID ) );
+        assertEquals( getObjectClassRegistry().getSchemaName( NEW_OID ), "apachemeta" );
+    }
+
+    
+    /**
+     * Check that we can create an AUXILIARY OC which inherit from an AUXILIARY OC
+     */
+    @Test
+    public void testAddAuxiliaryOCinheritingFromAuxiliaryOC() throws Exception
+    {
+        Attributes attrs = new AttributesImpl();
+        Attribute oc = new AttributeImpl( "objectClass", "top" );
+        oc.add( "metaTop" );
+        oc.add( "metaObjectClass" );
+        attrs.put( oc );
+        
+        attrs.put( "m-oid", NEW_OID );
+        attrs.put( "m-name", "abstractOCtest");
+        attrs.put( "m-description", "An abstract oC inheriting from top" );
+        attrs.put( "m-typeObjectClass", "AUXILIARY" );
+        attrs.put( "m-supObjectClass", "javaNamingReference" );
+        attrs.put( "m-must", "cn" );
+        attrs.put( "m-may", "ou" );
+        
+        Attribute sup = new AttributeImpl( "m-supObjectClass" );
+        sup.add( "top" );
+        sup.add( "javaNamingReference");
+        attrs.put( sup );
+
+        LdapDN dn = getObjectClassContainer( "apachemeta" );
+        dn.add( "m-oid" + "=" + NEW_OID );
+        getSchemaContext( service ).createSubcontext( dn, attrs );
+        
+        assertTrue( getObjectClassRegistry().hasObjectClass( NEW_OID ) );
+        assertEquals( getObjectClassRegistry().getSchemaName( NEW_OID ), "apachemeta" );
+    }
+
+    
+    /**
+     * Check that we can't create an Auxiliary OC which inherit from an STRUCTURAL OC
+     */
+    @Test
+    public void testAddAuxiliaryOCinheritingFromStructuralOC() throws Exception
+    {
+        Attributes attrs = new AttributesImpl();
+        Attribute oc = new AttributeImpl( "objectClass", "top" );
+        oc.add( "metaTop" );
+        oc.add( "metaObjectClass" );
+        attrs.put( oc );
+        
+        attrs.put( "m-oid", OID );
+        attrs.put( "m-name", "abstractOCtest");
+        attrs.put( "m-description", "An abstract oC inheriting from top" );
+        attrs.put( "m-typeObjectClass", "ABSTRACT" );
+        attrs.put( "m-must", "cn" );
+        attrs.put( "m-may", "ou" );
+        
+        Attribute sup = new AttributeImpl( "m-supObjectClass" );
+        sup.add( "top" );
+        sup.add( "person");
+        attrs.put( sup );
+        
+        LdapDN dn = getObjectClassContainer( "apachemeta" );
+        dn.add( "m-oid" + "=" + OID );
+        
+        try
+        {
+        	getSchemaContext( service ).createSubcontext( dn, attrs );
+        	fail();
+        }
+        catch ( NamingException ne )
+        {
+        	assertTrue( true );
+        }
+    }
+
+    
+    /**
+     * Check that we can create a STRUCTURAL OC which inherit from an ABSTRACT OC
+     */
+    @Test
+    public void testAddStructuralOCinheritingFromAbstractOC() throws Exception
+    {
+        Attributes attrs = new AttributesImpl();
+        Attribute oc = new AttributeImpl( "objectClass", "top" );
+        oc.add( "metaTop" );
+        oc.add( "metaObjectClass" );
+        attrs.put( oc );
+        
+        attrs.put( "m-oid", NEW_OID );
+        attrs.put( "m-name", "abstractOCtest");
+        attrs.put( "m-description", "An abstract oC inheriting from top" );
+        attrs.put( "m-typeObjectClass", "STRUCTURAL" );
+        attrs.put( "m-supObjectClass", "top" );
+        attrs.put( "m-must", "cn" );
+        attrs.put( "m-may", "ou" );
+        
+        LdapDN dn = getObjectClassContainer( "apachemeta" );
+        dn.add( "m-oid" + "=" + NEW_OID );
+        getSchemaContext( service ).createSubcontext( dn, attrs );
+        
+        assertTrue( getObjectClassRegistry().hasObjectClass( NEW_OID ) );
+        assertEquals( getObjectClassRegistry().getSchemaName( NEW_OID ), "apachemeta" );
+    }
+
+    
+    /**
+     * Check that we can create a STRUCTURAL OC which inherit from an AUXILIARY OC
+     */
+    @Test
+    public void testAddStructuralOCinheritingFromAuxiliaryOC() throws Exception
+    {
+        Attributes attrs = new AttributesImpl();
+        Attribute oc = new AttributeImpl( "objectClass", "top" );
+        oc.add( "metaTop" );
+        oc.add( "metaObjectClass" );
+        attrs.put( oc );
+        
+        attrs.put( "m-oid", NEW_OID );
+        attrs.put( "m-name", "abstractOCtest");
+        attrs.put( "m-description", "An abstract oC inheriting from top" );
+        attrs.put( "m-typeObjectClass", "STRUCTURAL" );
+        attrs.put( "m-must", "cn" );
+        attrs.put( "m-may", "ou" );
+        
+        Attribute sup = new AttributeImpl( "m-supObjectClass" );
+        sup.add( "top" );
+        sup.add( "javaNamingReference");
+        attrs.put( sup );
+
+        LdapDN dn = getObjectClassContainer( "apachemeta" );
+        dn.add( "m-oid" + "=" + NEW_OID );
+        getSchemaContext( service ).createSubcontext( dn, attrs );
+        
+        assertTrue( getObjectClassRegistry().hasObjectClass( NEW_OID ) );
+        assertEquals( getObjectClassRegistry().getSchemaName( NEW_OID ), "apachemeta" );
+    }
+
+    
+    /**
+     * Check that we can create a STRUCTURAL OC which inherit from an STRUCTURAL OC
+     */
+    @Test
+    public void testAddStructuralOCinheritingFromStructuralOC() throws Exception
+    {
+        Attributes attrs = new AttributesImpl();
+        Attribute oc = new AttributeImpl( "objectClass", "top" );
+        oc.add( "metaTop" );
+        oc.add( "metaObjectClass" );
+        attrs.put( oc );
+        
+        attrs.put( "m-oid", NEW_OID );
+        attrs.put( "m-name", "abstractOCtest");
+        attrs.put( "m-description", "An abstract oC inheriting from top" );
+        attrs.put( "m-typeObjectClass", "STRUCTURAL" );
+        attrs.put( "m-must", "cn" );
+        attrs.put( "m-may", "ou" );
+        
+        Attribute sup = new AttributeImpl( "m-supObjectClass" );
+        sup.add( "top" );
+        sup.add( "person");
+        attrs.put( sup );
+
+        LdapDN dn = getObjectClassContainer( "apachemeta" );
+        dn.add( "m-oid" + "=" + NEW_OID );
+        getSchemaContext( service ).createSubcontext( dn, attrs );
+        
+        assertTrue( getObjectClassRegistry().hasObjectClass( NEW_OID ) );
+        assertEquals( getObjectClassRegistry().getSchemaName( NEW_OID ), "apachemeta" );
+    }
 }

Modified: directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/schema/ObjectClassCreateIT.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/schema/ObjectClassCreateIT.java?rev=687803&r1=687802&r2=687803&view=diff
==============================================================================
--- directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/schema/ObjectClassCreateIT.java (original)
+++ directory/apacheds/trunk/core-integ/src/test/java/org/apache/directory/server/core/schema/ObjectClassCreateIT.java Thu Aug 21 10:10:43 2008
@@ -94,7 +94,7 @@
     }
 
     /*
-     * Test that I can create an ObjectClass entry with an invalid
+     * Test that I can create an ObjectClass entry with an invalid name
      */
     @Test
     public void testCreateObjectClassWithNoObjectClass() throws Exception

Modified: directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/schema/SchemaInterceptor.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/schema/SchemaInterceptor.java?rev=687803&r1=687802&r2=687803&view=diff
==============================================================================
--- directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/schema/SchemaInterceptor.java (original)
+++ directory/apacheds/trunk/core/src/main/java/org/apache/directory/server/core/schema/SchemaInterceptor.java Thu Aug 21 10:10:43 2008
@@ -34,6 +34,7 @@
 import javax.naming.directory.InvalidAttributeValueException;
 import javax.naming.directory.SearchControls;
 
+import org.apache.directory.server.constants.MetaSchemaConstants;
 import org.apache.directory.server.constants.ServerDNConstants;
 import org.apache.directory.server.core.DirectoryService;
 import org.apache.directory.server.core.cursor.EmptyCursor;
@@ -99,6 +100,7 @@
 import org.apache.directory.shared.ldap.schema.AttributeType;
 import org.apache.directory.shared.ldap.schema.AttributeTypeOptions;
 import org.apache.directory.shared.ldap.schema.ObjectClass;
+import org.apache.directory.shared.ldap.schema.ObjectClassTypeEnum;
 import org.apache.directory.shared.ldap.schema.SchemaUtils;
 import org.apache.directory.shared.ldap.schema.UsageEnum;
 import org.apache.directory.shared.ldap.schema.syntax.AcceptAllSyntaxChecker;
@@ -1708,6 +1710,71 @@
             }
         }
     }
+    
+    
+    private void checkOcSuperior( ServerEntry entry ) throws Exception
+    {
+    	ObjectClassRegistry ocRegistry = registries.getObjectClassRegistry();
+    	
+        // handle the m-supObjectClass meta attribute
+        EntryAttribute supOC = entry.get( MetaSchemaConstants.M_SUP_OBJECT_CLASS_AT );
+        
+        if ( supOC != null )
+        {
+        	ObjectClassTypeEnum ocType = ObjectClassTypeEnum.STRUCTURAL;
+        	
+            if ( entry.get( MetaSchemaConstants.M_TYPE_OBJECT_CLASS_AT ) != null )
+            {
+                String type = entry.get( MetaSchemaConstants.M_TYPE_OBJECT_CLASS_AT ).getString();
+                ocType = ObjectClassTypeEnum.getClassType( type );
+            }
+        	
+        	// First check that the inheritence scheme is correct.
+        	// 1) If the ocType is ABSTRACT, it should not have any other SUP not ABSTRACT
+        	for ( Value<?> sup:supOC )
+        	{
+        		try
+        		{
+        			String supName = (String)sup.get();
+        			
+            		ObjectClass superior = ocRegistry.lookup( supName );
+
+            		switch ( ocType )
+            		{
+	            		case ABSTRACT :
+	                		if ( !superior.isAbstract() )
+	                		{
+	                			String message = "An ABSTRACT ObjectClass cannot inherit from an objectClass which is not ABSTRACT";
+	                			LOG.error( message );
+	                			throw new LdapSchemaViolationException( message, ResultCodeEnum.OBJECT_CLASS_VIOLATION );
+	                		}
+	                		
+	                		break;
+	
+	            		case AUXILIARY :
+	                		if ( !superior.isAbstract() && ! superior.isAuxiliary() )
+	                		{
+	                			String message = "An AUXILiARY ObjectClass cannot inherit from an objectClass which is not ABSTRACT or AUXILIARY";
+	                			LOG.error( message );
+	                			throw new LdapSchemaViolationException( message, ResultCodeEnum.OBJECT_CLASS_VIOLATION );
+	                		}
+	                		
+	                		break;
+
+	            		case STRUCTURAL :
+	                		break;
+            		}
+        		}
+        		catch ( NamingException ne )
+        		{
+        			// The superior OC does not exist : this is an error
+        			String message = "Cannot have a superior which does not exist";
+        			LOG.error( message );
+        			throw new LdapSchemaViolationException( message, ResultCodeEnum.OBJECT_CLASS_VIOLATION );
+        		}
+        	}
+        }
+    }
 
 
     /**
@@ -1720,9 +1787,12 @@
 
         check( name, entry );
 
+        // Special checks for the MetaSchema branch
         if ( name.startsWith( schemaBaseDN ) )
         {
             schemaManager.add( addContext );
+            
+            checkOcSuperior( addContext.getEntry() );
         }
 
         next.add( addContext );