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/11/30 12:41:08 UTC
svn commit: r885381 [2/2] - in /directory:
apacheds/branches/apacheds-schema/core-api/src/main/java/org/apache/directory/server/core/schema/registries/synchronizers/
apacheds/branches/apacheds-schema/core-integ/src/test/java/org/apache/directory/server...
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=885381&r1=885380&r2=885381&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 Mon Nov 30 11:41:06 2009
@@ -47,9 +47,6 @@
import org.apache.directory.shared.ldap.schema.SchemaObject;
import org.apache.directory.shared.ldap.schema.SchemaObjectWrapper;
import org.apache.directory.shared.ldap.schema.SyntaxChecker;
-import org.apache.directory.shared.ldap.schema.UsageEnum;
-import org.apache.directory.shared.ldap.schema.normalizers.NoOpNormalizer;
-import org.apache.directory.shared.ldap.schema.syntaxCheckers.OctetStringSyntaxChecker;
import org.apache.directory.shared.ldap.util.StringTools;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -109,7 +106,7 @@
protected LdapSyntaxRegistry ldapSyntaxRegistry;
/** A map storing all the schema objects associated with a schema */
- private Map<String, Set<SchemaObjectWrapper>> schemaObjectsBySchemaName;
+ private Map<String, Set<SchemaObjectWrapper>> schemaObjects;
/** A flag indicating that the Registries is relaxed or not */
private boolean isRelaxed;
@@ -155,7 +152,7 @@
normalizerRegistry = new DefaultNormalizerRegistry();
objectClassRegistry = new DefaultObjectClassRegistry();
syntaxCheckerRegistry = new DefaultSyntaxCheckerRegistry();
- schemaObjectsBySchemaName = new HashMap<String, Set<SchemaObjectWrapper>>();
+ schemaObjects = new HashMap<String, Set<SchemaObjectWrapper>>();
usedBy = new HashMap<SchemaObjectWrapper, Set<SchemaObjectWrapper>>();
using = new HashMap<SchemaObjectWrapper, Set<SchemaObjectWrapper>>();
@@ -512,37 +509,13 @@
/**
- * Add the AT references (using and usedBy) :
- * AT -> MR (for EQUALITY, ORDERING and SUBSTR)
- * AT -> S
- * AT -> AT
- */
- public void addCrossReferences( AttributeType attributeType )
+ * Add the SchemaObjectReferences. This method does nothing, it's just
+ * a catch all. The other methods will be called for each specific
+ * schemaObject
+ *
+ public void addCrossReferences( SchemaObject schemaObject )
{
- if ( attributeType.getEquality() != null )
- {
- addReference( attributeType, attributeType.getEquality() );
- }
-
- if ( attributeType.getOrdering() != null )
- {
- addReference( attributeType, attributeType.getOrdering() );
- }
-
- if ( attributeType.getSubstring() != null )
- {
- addReference( attributeType, attributeType.getSubstring() );
- }
-
- if ( attributeType.getSyntax() != null )
- {
- addReference( attributeType, attributeType.getSyntax() );
- }
-
- if ( attributeType.getSuperior() != null )
- {
- addReference( attributeType, attributeType.getSuperior() );
- }
+ // Do nothing : it's a catch all method.
}
@@ -582,385 +555,6 @@
/**
- * Build the Superior AttributeType reference for an AttributeType
- */
- private void buildSuperior(List<Throwable> errors, Set<String> done, AttributeType attributeType )
- {
- AttributeType superior = null;
-
- if ( attributeType.getSuperiorOid() != null )
- {
- // This AT has a superior
- try
- {
- superior = attributeTypeRegistry.lookup( attributeType.getSuperiorOid() );
- }
- catch ( Exception e )
- {
- // Not allowed.
- String msg = "Cannot find a Superior object for " + attributeType.getSyntaxOid() +
- " while building cross-references for the " + attributeType.getName() +
- " attributeType.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
-
- // Get out now
- return;
- }
-
- if ( superior != null )
- {
- // Check if this superior has already be processed
- if ( !done.contains( superior.getOid() ) )
- {
- done.add( superior.getOid() );
-
- // Recursively process the superior, and continue
- buildRecursiveAttributeTypeReferences( errors, done, superior );
- }
-
- attributeType.updateSuperior( superior );
-
- // Update the descendant MAP
- try
- {
- attributeTypeRegistry.registerDescendants( attributeType, superior );
- }
- catch ( NamingException ne )
- {
- errors.add( ne );
- LOG.info( ne.getMessage() );
- }
-
- return;
- }
- else
- {
- // Not allowed.
- String msg = "Cannot find a SUPERIOR AttributeType object " + attributeType.getOid() +
- " while building cross-references for the " + attributeType.getName() +
- " matchingRule.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
-
- // Get out and return
- return;
- }
- }
- else
- {
- // No superior, just return
- return;
- }
- }
-
-
- /**
- * Build the SYNTAX reference for an AttributeType
- */
- private void buildSyntax( List<Throwable> errors, AttributeType attributeType )
- {
- if ( attributeType.getSyntaxOid() != null )
- {
- LdapSyntax syntax = null;
-
- try
- {
- syntax = ldapSyntaxRegistry.lookup( attributeType.getSyntaxOid() );
- }
- catch ( NamingException ne )
- {
- // Not allowed.
- String msg = "Cannot find a Syntax object for " + attributeType.getSyntaxOid() +
- " while building cross-references for the " + attributeType.getName() +
- " attributeType.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- return;
- }
-
- if ( syntax != null )
- {
- // Update the Syntax reference
- attributeType.updateSyntax( syntax );
- }
- else
- {
- // Not allowed.
- String msg = "Cannot find a Syntax instance for " + attributeType.getSyntaxOid() +
- " while building cross-references for the " + attributeType.getName() +
- " matchingRule.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- return;
- }
- }
- else
- {
- // We inherit from the superior's syntax, if any
- if ( attributeType.getSuperior() != null )
- {
- attributeType.updateSyntax( attributeType.getSuperior().getSyntax() );
- }
- else
- {
- // Not allowed.
- String msg = "The AttributeType " + attributeType.getName() + " must have " +
- "a syntax OID or a superior, it does not have any.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- return;
- }
- }
- }
-
-
- /**
- * Build the EQUALITY MR reference for an AttributeType
- */
- private void buildEquality( List<Throwable> errors, AttributeType attributeType )
- {
- // The equality MR. It can be null
- if ( attributeType.getEqualityOid() != null )
- {
- MatchingRule equality = null;
-
- try
- {
- equality = matchingRuleRegistry.lookup( attributeType.getEqualityOid() );
- }
- catch ( NamingException ne )
- {
- // Not allowed.
- String msg = "Cannot find an Equality MatchingRule object for " + attributeType.getEqualityOid() +
- " while building cross-references for the " + attributeType.getName() +
- " attributeType.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- return;
- }
-
- if ( equality != null )
- {
- attributeType.updateEquality( equality );
- }
- else
- {
- // Not allowed.
- String msg = "Cannot find an EQUALITY MatchingRule instance for " + attributeType.getEqualityOid() +
- " while building cross-references for the " + attributeType.getName() +
- " matchingRule.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- }
- }
- else
- {
- // If the AT has a superior, take its Equality MR if any
- if ( ( attributeType.getSuperior() != null ) && ( attributeType.getSuperior().getEquality() != null ) )
- {
- attributeType.updateEquality( attributeType.getSuperior().getEquality() );
- }
- }
- }
-
-
- /**
- * Build the ORDERING MR reference for an AttributeType
- */
- private void buildOrdering( List<Throwable> errors, AttributeType attributeType )
- {
- if ( attributeType.getOrderingOid() != null )
- {
- MatchingRule ordering = null;
-
- try
- {
- ordering = matchingRuleRegistry.lookup( attributeType.getOrderingOid() );
- }
- catch ( NamingException ne )
- {
- // Not allowed.
- String msg = "Cannot find a Ordering MatchingRule object for " + attributeType.getSyntaxOid() +
- " while building cross-references for the " + attributeType.getName() +
- " attributeType.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- return;
- }
-
- if ( ordering != null )
- {
- attributeType.updateOrdering( ordering );
- }
- else
- {
- // Not allowed.
- String msg = "Cannot find an ORDERING MatchingRule instance for " + attributeType.getOid() +
- " while building cross-references for the " + attributeType.getName() +
- " matchingRule.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- }
- }
- else
- {
- // If the AT has a superior, take its Ordering MR if any
- if ( ( attributeType.getSuperior() != null ) && ( attributeType.getSuperior().getOrdering() != null ) )
- {
- attributeType.updateOrdering( attributeType.getSuperior().getOrdering() );
- }
- }
- }
-
-
- /**
- * Build the SUBSTR MR reference for an AttributeType
- */
- private void buildSubstring( List<Throwable> errors, AttributeType attributeType )
- {
- // The Substring MR. It can be null
- if ( attributeType.getSubstringOid() != null )
- {
- MatchingRule substring = null;
-
- try
- {
- substring = matchingRuleRegistry.lookup( attributeType.getSubstringOid() );
- }
- catch ( NamingException ne )
- {
- // Not allowed.
- String msg = "Cannot find a Substring MatchingRule object for " + attributeType.getSyntaxOid() +
- " while building cross-references for the " + attributeType.getName() +
- " attributeType.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- return;
- }
-
- if ( substring != null )
- {
- attributeType.updateSubstring( substring );
- }
- else
- {
- // Not allowed.
- String msg = "Cannot find a SUBSTR MatchingRule instance for " + attributeType.getOid() +
- " while building cross-references for the " + attributeType.getName() +
- " matchingRule.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- return;
- }
- }
- else
- {
- // If the AT has a superior, take its Substring MR if any
- if ( ( attributeType.getSuperior() != null ) && ( attributeType.getSuperior().getSubstring() != null ) )
- {
- attributeType.updateSubstring( attributeType.getSuperior().getSubstring() );
- }
- }
- }
-
-
- /**
- * Check the constraints for the Usage field.
- */
- private void checkUsage( List<Throwable> errors, AttributeType attributeType )
- {
- // Check that the AT usage is the same that its superior
- if ( ( attributeType.getSuperior() != null ) &&
- ( attributeType.getUsage() != attributeType.getSuperior().getUsage() ) )
- {
- // This is an error
- String msg = "The attributeType " + attributeType.getName() + " must have the same USAGE than its superior";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- return;
- }
-
- // Now, check that the AttributeType's USAGE does not conflict
- if ( !attributeType.isUserModifiable() && ( attributeType.getUsage() == UsageEnum.USER_APPLICATIONS ) )
- {
- // Cannot have a not user modifiable AT whoch is not an operational AT
- String msg = "The attributeType " + attributeType.getName() + " is a USER-APPLICATION attribute, " +
- "it must be USER-MODIFIABLE";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- }
- }
-
-
- /**
- * Check the constraints for the Collective field.
- */
- private void checkCollective( List<Throwable> errors, AttributeType attributeType )
- {
- if ( attributeType.getSuperior() != null )
- {
- if ( attributeType.getSuperior().isCollective() )
- {
- // An AttributeType will be collective if its superior is collective
- attributeType.updateCollective( true );
- }
- }
-
- if ( attributeType.isCollective() && ( attributeType.getUsage() != UsageEnum.USER_APPLICATIONS ) )
- {
- // An AttributeType which is collective must be a USER attributeType
- String msg = "The attributeType " + attributeType.getName() + " is a COLLECTIVE AttributeType, " +
- ", it must be a USER-APPLICATION attributeType too.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- }
- }
-
-
- /**
* Some specific controls must be checked :
* - an AT must have either a SYNTAX or a SUP. If there is no SYNTAX, then
* the AT will take it's superior SYNTAX;
@@ -974,32 +568,47 @@
* - if an AT has a superior, and if its superior is COLLECTIVE, then
* the AT will be COLLECTIVE too
*
- */
+ *
private void buildRecursiveAttributeTypeReferences( List<Throwable> errors, Set<String> done, AttributeType attributeType )
{
+ buildReference( errors, attributeType );
// An attributeType has references on Syntax, MatchingRule and itself
-
+ try
+ {
+ attributeType.applyRegistries( this );
+ }
+ catch ( NamingException ne )
+ {
+ String msg = "Cannot build the AttributeType references for the object " + attributeType.getName() +
+ ", error : " + ne.getMessage();
+
+ Throwable error = new LdapSchemaViolationException(
+ msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
+ errors.add( error );
+ LOG.info( msg );
+ }
+
// First, check if the AT has a superior
- buildSuperior( errors, done, attributeType );
+ //buildSuperior( errors, done, attributeType );
// The LdapSyntax (cannot be null)
- buildSyntax( errors, attributeType );
+ //buildSyntax( errors, attributeType );
// The equality MR.
- buildEquality( errors, attributeType );
+ //buildEquality( errors, attributeType );
// The ORDERING MR.
- buildOrdering( errors, attributeType );
+ //buildOrdering( errors, attributeType );
// The SUBSTR MR.
- buildSubstring( errors, attributeType );
+ //buildSubstring( errors, attributeType );
// Last, not least, check some of the other constraints
- checkUsage( errors, attributeType );
- checkCollective( errors, attributeType );
+ //checkUsage( errors, attributeType );
+ //checkCollective( errors, attributeType );
// Update the dedicated fields
- try
+ /*try
{
attributeTypeRegistry.addMappingFor( attributeType );
}
@@ -1026,24 +635,13 @@
*/
private void buildAttributeTypeReferences( List<Throwable> errors )
{
- // Remember the AT we have already processed
- Set<String> done = new HashSet<String>();
-
for ( AttributeType attributeType : attributeTypeRegistry )
{
- if ( done.contains( attributeType.getOid() ) )
- {
- continue;
- }
- else
+ if ( ( getUsing( attributeType ) == null ) || getUsing( attributeType ).isEmpty() )
{
- done.add( attributeType.getOid() );
+ buildReference( errors, attributeType );
}
-
- buildRecursiveAttributeTypeReferences( errors, done, attributeType );
}
-
- done.clear();
}
@@ -1054,17 +652,7 @@
{
for ( LdapComparator<?> comparator : comparatorRegistry )
{
- try
- {
- comparator.applyRegistries( this );
-
- // Set the SchemaManager for those Comparators which need it
- comparator.setSchemaManager( schemaManager );
- }
- catch ( NamingException ne )
- {
- errors.add( ne );
- }
+ buildReference( errors, comparator );
}
}
@@ -1094,55 +682,52 @@
/**
- * Add the MR references (using and usedBy) :
+ * Delete the MR references (using and usedBy) :
* MR -> C
* MR -> N
* MR -> S
*/
- public void addCrossReferences( MatchingRule matchingRule )
+ public void delCrossReferences( MatchingRule matchingRule )
{
if ( matchingRule.getLdapComparator() != null )
{
- addReference( matchingRule, matchingRule.getLdapComparator() );
+ delReference( matchingRule, matchingRule.getLdapComparator() );
}
if ( matchingRule.getNormalizer() != null )
{
- addReference( matchingRule, matchingRule.getNormalizer() );
+ delReference( matchingRule, matchingRule.getNormalizer() );
}
if ( matchingRule.getSyntax() != null )
{
- addReference( matchingRule, matchingRule.getSyntax() );
+ delReference( matchingRule, matchingRule.getSyntax() );
}
}
-
-
+
/**
- * Delete the MR references (using and usedBy) :
- * MR -> C
- * MR -> N
- * MR -> S
+ * Build the SchemaObject references
*/
- public void delCrossReferences( MatchingRule matchingRule )
+ public void buildReference( List<Throwable> errors, SchemaObject schemaObject )
{
- if ( matchingRule.getLdapComparator() != null )
+ try
{
- delReference( matchingRule, matchingRule.getLdapComparator() );
+ schemaObject.applyRegistries( errors, this );
}
-
- if ( matchingRule.getNormalizer() != null )
- {
- delReference( matchingRule, matchingRule.getNormalizer() );
- }
-
- if ( matchingRule.getSyntax() != null )
+ catch ( NamingException ne )
{
- delReference( matchingRule, matchingRule.getSyntax() );
+ // Not allowed.
+ String msg = "Cannot build the references for " + schemaObject.getName() +
+ ", error : " + ne.getMessage();
+
+ Throwable error = new LdapSchemaViolationException(
+ msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
+ errors.add( error );
+ LOG.info( msg );
}
}
-
+
/**
* Build the MatchingRule references
@@ -1151,122 +736,7 @@
{
for ( MatchingRule matchingRule : matchingRuleRegistry )
{
- // each matching rule references a Syntax, a Comparator and a Normalizer
- // If we don't have a Syntax, this is an error
- if ( matchingRule.getSyntaxOid() != null )
- {
- LdapSyntax syntax = null;
-
- try
- {
- syntax = ldapSyntaxRegistry.lookup( matchingRule.getSyntaxOid() );
- }
- catch ( NamingException ne )
- {
- // Not allowed.
- String msg = "Cannot find a Syntax object " + matchingRule.getSyntaxOid() +
- " while building cross-references for the " + matchingRule.getName() +
- " matchingRule.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- }
-
- if ( syntax != null )
- {
- // Update the Syntax reference
- matchingRule.updateSyntax( syntax );
- }
- else
- {
- // Not allowed.
- String msg = "Cannot find a Syntax object " + matchingRule.getSyntaxOid() +
- " while building cross-references for the " + matchingRule.getName() +
- " matchingRule.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- }
- }
- else
- {
- // Not allowed.
- String msg = "The MatchingRule " + matchingRule.getName() + " must have " +
- "a syntax OID.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- }
-
- // Get the comparator. Must not be null
- LdapComparator<?> comparator = null;
-
- try
- {
- comparator = comparatorRegistry.lookup( matchingRule.getOid() );
- }
- catch ( Exception e )
- {
- // Not allowed.
- String msg = "Cannot find a Comparator object " + matchingRule.getSyntaxOid() +
- " while building cross-references for the " + matchingRule.getName() +
- " matchingRule.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- }
-
- if ( comparator != null )
- {
- // Update the Comparator reference
- matchingRule.updateLdapComparator( comparator );
- }
- else
- {
- // Not allowed.
- String msg = "Cannot find a Comparator object " + matchingRule.getOid() +
- " while building cross-references for the " + matchingRule.getName() +
- " matchingRule.";
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- }
-
- // Get the normalizer. May be null
- Normalizer normalizer = null;
-
- try
- {
- normalizer = normalizerRegistry.lookup( matchingRule.getOid() );
- }
- catch ( Exception e )
- {
- // Not found : get the default Normalizer
- normalizer = new NoOpNormalizer( matchingRule.getOid() );
- }
-
- if ( normalizer != null )
- {
- // Update the Normalizer reference
- matchingRule.updateNormalizer( normalizer );
- }
- else
- {
- // Set a default normalizer
- matchingRule.updateNormalizer( new NoOpNormalizer( matchingRule.getOid() ) );
- }
-
- // Update the MR cross references
- addCrossReferences( matchingRule );
+ buildReference( errors, matchingRule );
}
}
@@ -1278,7 +748,7 @@
{
for ( MatchingRuleUse matchingRuleUse : matchingRuleUseRegistry )
{
- // TODO
+ buildReference( errors, matchingRuleUse );
}
}
@@ -1302,153 +772,32 @@
{
for ( Normalizer normalizer : normalizerRegistry )
{
- try
- {
- normalizer.applyRegistries( this );
-
- // Set the SchemaManager for those Comparators which need it
- normalizer.setSchemaManager( schemaManager );
- }
- catch ( NamingException ne )
- {
- errors.add( ne );
- }
+ buildReference( errors, normalizer );
}
}
/**
- * Add the OC references (using and usedBy) :
- * OC -> AT (MAY and MUST)
- * OC -> OC (SUPERIORS)
- */
- public void addCrossReferences( ObjectClass objectClass )
- {
- for ( AttributeType mayAttributeType : objectClass.getMayAttributeTypes() )
- {
- addReference( objectClass, mayAttributeType );
- }
-
- for ( AttributeType mustAttributeType : objectClass.getMustAttributeTypes() )
- {
- addReference( objectClass, mustAttributeType );
- }
-
- for ( ObjectClass superiorObjectClass : objectClass.getSuperiors() )
- {
- addReference( objectClass, superiorObjectClass );
- }
- }
-
- /**
* Build the ObjectClasses references
*/
private void buildObjectClassReferences( List<Throwable> errors )
{
+ // Remember the OC we have already processed
+ Set<String> done = new HashSet<String>();
+
// The ObjectClass
for ( ObjectClass objectClass : objectClassRegistry )
{
- // An ObjectClass has references on AttributeType May and Must,
- // and its superiors
- // The MAY attributeTypes
- AttributeType may = null;
- List<AttributeType> mayList = new ArrayList<AttributeType>();
-
- for ( String mayOid : objectClass.getMayAttributeTypeOids() )
+ if ( done.contains( objectClass.getOid() ) )
{
- try
- {
- may = attributeTypeRegistry.lookup( mayOid );
- mayList.add( may );
- }
- catch ( NamingException ne )
- {
- // Not allowed.
- String msg = "Cannot find a AttributeType MAY object for " + mayOid +
- " while building cross-references for the " + objectClass.getName() +
- " objectClass.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- }
+ continue;
}
-
- // Update the MAY references
- objectClass.updateMayAttributeTypes( mayList );
-
- // The MUST attributeTypes
- AttributeType must = null;
- List<AttributeType> mustList = new ArrayList<AttributeType>();
-
- for ( String mustOid : objectClass.getMustAttributeTypeOids() )
+ else
{
- try
- {
- must = attributeTypeRegistry.lookup( mustOid );
- mustList.add( must );
- }
- catch ( NamingException ne )
- {
- // Not allowed.
- String msg = "Cannot find a AttributeType MUST object for " + mustOid +
- " while building cross-references for the " + objectClass.getName() +
- " objectClass.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- }
+ done.add( objectClass.getOid() );
}
-
- // Update the MUST references
- objectClass.updateMustAttributeTypes( mustList );
- // The SUPERIORS objectClasses
- ObjectClass superior = null;
- List<ObjectClass> superiorList = new ArrayList<ObjectClass>();
-
- for ( String superiorOid : objectClass.getSuperiorOids() )
- {
- try
- {
- superior = objectClassRegistry.lookup( superiorOid );
- superiorList.add( superior );
- }
- catch ( NamingException ne )
- {
- // Not allowed.
- String msg = "Cannot find an ObjectClass SUPERIOR object for " + superiorOid +
- " while building cross-references for the " + objectClass.getName() +
- " objectClass.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- }
- }
-
- // Update the SUPERIOR references
- objectClass.updateSuperiors( superiorList );
-
- // Update the ObjectClass cross references
- addCrossReferences( objectClass );
- }
- }
-
-
- /**
- * Add the references for S :
- * S -> SC
- */
- public void addCrossReferences( LdapSyntax syntax )
- {
- if ( syntax.getSyntaxChecker() != null )
- {
- addReference( syntax, syntax.getSyntaxChecker() );
+ buildReference( errors, objectClass );
}
}
@@ -1460,39 +809,7 @@
{
for ( LdapSyntax syntax : ldapSyntaxRegistry )
{
- SyntaxChecker syntaxChecker = null;
-
- // Each syntax should reference a SyntaxChecker with the same OID
- try
- {
- syntaxChecker = syntaxCheckerRegistry.lookup( syntax.getOid() );
- }
- catch ( NamingException ne )
- {
- // There is no SyntaxChecker : default to the OctetString SyntaxChecker
- syntaxChecker = new OctetStringSyntaxChecker( syntax.getOid() );
- }
-
- if ( syntaxChecker != null )
- {
- // Set the SyntaxChecker reference
- syntax.updateSyntaxChecker( syntaxChecker );
- }
- else
- {
- // Not allowed.
- String msg = "Cannot find a SyntaxChecker object " + syntax.getOid() +
- " while building cross-references for the " + syntax.getName() +
- " matchingRule.";
-
- Throwable error = new LdapSchemaViolationException(
- msg, ResultCodeEnum.INVALID_ATTRIBUTE_SYNTAX );
- errors.add( error );
- LOG.info( msg );
- }
-
- // Update the using and usedBy references
- addCrossReferences( syntax );
+ buildReference( errors, syntax );
}
}
@@ -1504,14 +821,7 @@
{
for ( SyntaxChecker syntaxChecker : syntaxCheckerRegistry )
{
- try
- {
- syntaxChecker.applyRegistries( this );
- }
- catch ( NamingException ne )
- {
- errors.add( ne );
- }
+ buildReference( errors, syntaxChecker );
}
}
@@ -1574,7 +884,7 @@
// or to the OctetString SyntaxChecker
try
{
- syntax.applyRegistries( this );
+ syntax.applyRegistries( errors, this );
}
catch ( NamingException e )
{
@@ -1594,7 +904,7 @@
// This is currently doing nothing.
try
{
- normalizer.applyRegistries( this );
+ normalizer.applyRegistries( errors, this );
}
catch ( NamingException e )
{
@@ -1614,7 +924,7 @@
// This is currently doing nothing.
try
{
- comparator.applyRegistries( this );
+ comparator.applyRegistries( errors, this );
}
catch ( NamingException e )
{
@@ -1634,7 +944,7 @@
// This is currently doing nothing.
try
{
- syntaxChecker.applyRegistries( this );
+ syntaxChecker.applyRegistries( errors, this );
}
catch ( NamingException e )
{
@@ -1946,7 +1256,7 @@
// All is done for this ObjectClass, let's apply the registries
try
{
- objectClass.applyRegistries( this );
+ objectClass.applyRegistries( errors, this );
}
catch ( NamingException ne )
{
@@ -1997,7 +1307,7 @@
*/
public Map<String, Set<SchemaObjectWrapper>> getObjectBySchemaName()
{
- return schemaObjectsBySchemaName;
+ return schemaObjects;
}
@@ -2012,7 +1322,7 @@
{
String schemaName = schemaObject.getSchemaName();
- Set<SchemaObjectWrapper> setSchemaObjects = schemaObjectsBySchemaName.get( schemaName );
+ Set<SchemaObjectWrapper> setSchemaObjects = schemaObjects.get( schemaName );
if ( ( setSchemaObjects == null ) || setSchemaObjects.isEmpty() )
{
@@ -2033,11 +1343,24 @@
public Set<SchemaObjectWrapper> addSchema( String schemaName )
{
Set<SchemaObjectWrapper> content = new HashSet<SchemaObjectWrapper>();
- schemaObjectsBySchemaName.put( schemaName, content );
+ schemaObjects.put( schemaName, content );
return content;
}
+
+ /**
+ * Applies the added SchemaObject to the given register
+ */
+ public void add( SchemaObject schemaObject ) throws NamingException
+ {
+ // Register the SchemaObject in the registries
+ register( schemaObject );
+
+ // Associate the SchemaObject with its schema
+ associateWithSchema( schemaObject );
+ }
+
public void register( SchemaObject schemaObject ) throws NamingException
{
@@ -2128,12 +1451,12 @@
String schemaName = StringTools.toLowerCase( schemaObject.getSchemaName() );
// And register the schemaObject within its schema
- Set<SchemaObjectWrapper> content = schemaObjectsBySchemaName.get( schemaName );
+ Set<SchemaObjectWrapper> content = schemaObjects.get( schemaName );
if ( content == null )
{
content = new HashSet<SchemaObjectWrapper>();
- schemaObjectsBySchemaName.put( StringTools.toLowerCase( schemaName ), content );
+ schemaObjects.put( StringTools.toLowerCase( schemaName ), content );
}
SchemaObjectWrapper schemaObjectWrapper = new SchemaObjectWrapper( schemaObject );
@@ -2237,7 +1560,7 @@
public void dissociateFromSchema( SchemaObject schemaObject ) throws NamingException
{
// And unregister the schemaObject within its schema
- Set<SchemaObjectWrapper> content = schemaObjectsBySchemaName.get( StringTools.toLowerCase( schemaObject.getSchemaName() ) );
+ Set<SchemaObjectWrapper> content = schemaObjects.get( StringTools.toLowerCase( schemaObject.getSchemaName() ) );
SchemaObjectWrapper schemaObjectWrapper = new SchemaObjectWrapper( schemaObject );
@@ -3105,15 +2428,15 @@
syntaxCheckerRegistry.clear();
}
- // Clear the schemaObjectsBySchemaName map
- for ( String schemaName : schemaObjectsBySchemaName.keySet() )
+ // Clear the schemaObjects map
+ for ( String schemaName : schemaObjects.keySet() )
{
- Set<SchemaObjectWrapper> wrapperSet = schemaObjectsBySchemaName.get( schemaName );
+ Set<SchemaObjectWrapper> wrapperSet = schemaObjects.get( schemaName );
wrapperSet.clear();
}
- schemaObjectsBySchemaName.clear();
+ schemaObjects.clear();
// Clear the usedBy map
for ( SchemaObjectWrapper wrapper : usedBy.keySet() )