blob: c9d5c78f757a1e4d666cd8289c9abd0e12567c2b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
package org.apache.directory.api.ldap.model.schema.parsers;
import java.util.List;
import org.apache.directory.api.ldap.model.schema.AttributeType;
import org.apache.directory.api.ldap.model.schema.LdapSyntax;
import org.apache.directory.api.ldap.model.schema.MatchingRule;
import org.apache.directory.api.ldap.model.schema.ObjectClass;
import org.apache.directory.api.ldap.model.schema.SchemaObject;
/**
* Utilities for dealing with various schema descriptions.
*
* @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
*/
public final class ParserDescriptionUtils
{
/**
* Private constructor.
*/
private ParserDescriptionUtils()
{
}
/**
* Checks two schema objectClasses for an exact match.
*
* @param oc0 the first objectClass to compare
* @param oc1 the second objectClass to compare
* @return true if both objectClasses match exactly, false otherwise
*/
public static boolean objectClassesMatch( ObjectClass oc0, ObjectClass oc1 )
{
// compare all common description parameters
if ( !descriptionsMatch( oc0, oc1 ) )
{
return false;
}
// compare the objectClass type (AUXILIARY, STRUCTURAL, ABSTRACT)
if ( oc0.getType() != oc1.getType() )
{
return false;
}
// compare the superior objectClasses (sizes must match)
if ( oc0.getSuperiorOids().size() != oc1.getSuperiorOids().size() )
{
return false;
}
// compare the superior objectClasses (sizes must match)
for ( int i = 0; i < oc0.getSuperiorOids().size(); i++ )
{
if ( !oc0.getSuperiorOids().get( i ).equals( oc1.getSuperiorOids().get( i ) ) )
{
return false;
}
}
// compare the must attributes (sizes must match)
for ( int i = 0; i < oc0.getMustAttributeTypeOids().size(); i++ )
{
if ( !oc0.getMustAttributeTypeOids().get( i ).equals( oc1.getMustAttributeTypeOids().get( i ) ) )
{
return false;
}
}
// compare the may attributes (sizes must match)
for ( int i = 0; i < oc0.getMayAttributeTypeOids().size(); i++ )
{
if ( !oc0.getMayAttributeTypeOids().get( i ).equals( oc1.getMayAttributeTypeOids().get( i ) ) )
{
return false;
}
}
return true;
}
/**
* Checks two schema attributeTypes for an exact match.
*
* @param at0 the first attributeType to compare
* @param at1 the second attributeType to compare
* @return true if both attributeTypes match exactly, false otherwise
*/
public static boolean attributeTypesMatch( AttributeType at0, AttributeType at1 )
{
// compare all common description parameters
if ( !descriptionsMatch( at0, at1 ) )
{
return false;
}
// check that the same super type is being used for both attributes
if ( !at0.getSuperiorOid().equals( at1.getSuperiorOid() ) )
{
return false;
}
// check that the same matchingRule is used by both ATs for EQUALITY
if ( !at0.getEqualityOid().equals( at1.getEqualityOid() ) )
{
return false;
}
// check that the same matchingRule is used by both ATs for SUBSTRING
if ( !at0.getSubstringOid().equals( at1.getSubstringOid() ) )
{
return false;
}
// check that the same matchingRule is used by both ATs for ORDERING
if ( !at0.getOrderingOid().equals( at1.getOrderingOid() ) )
{
return false;
}
// check that the same syntax is used by both ATs
if ( !at0.getSyntaxOid().equals( at1.getSyntaxOid() ) )
{
return false;
}
// check that the syntax length constraint is the same for both
if ( at0.getSyntaxLength() != at1.getSyntaxLength() )
{
return false;
}
// check that the ATs have the same single valued flag value
if ( at0.isSingleValued() != at1.isSingleValued() )
{
return false;
}
// check that the ATs have the same collective flag value
if ( at0.isCollective() != at1.isCollective() )
{
return false;
}
// check that the ATs have the same user modifiable flag value
if ( at0.isUserModifiable() != at1.isUserModifiable() )
{
return false;
}
// check that the ATs have the same USAGE
if ( at0.getUsage() != at1.getUsage() )
{
return false;
}
return true;
}
/**
* Checks to see if two matchingRule match exactly.
*
* @param matchingRule0 the first matchingRule to compare
* @param matchingRule1 the second matchingRule to compare
* @return true if the matchingRules match exactly, false otherwise
*/
public static boolean matchingRulesMatch( MatchingRule matchingRule0, MatchingRule matchingRule1 )
{
// compare all common description parameters
if ( !descriptionsMatch( matchingRule0, matchingRule1 ) )
{
return false;
}
// check that the syntaxes of the matchingRules match
if ( !matchingRule0.getSyntaxOid().equals( matchingRule1.getSyntaxOid() ) )
{
return false;
}
return true;
}
/**
* Checks to see if two syntax match exactly.
*
* @param ldapSyntax0 the first ldapSyntax to compare
* @param ldapSyntax1 the second ldapSyntax to compare
* @return true if the syntaxes match exactly, false otherwise
*/
public static boolean syntaxesMatch( LdapSyntax ldapSyntax0, LdapSyntax ldapSyntax1 )
{
return descriptionsMatch( ldapSyntax0, ldapSyntax1 );
}
/**
* Checks if two base schema descriptions match for the common components
* in every schema description. NOTE: for syntaxes the obsolete flag is
* not compared because doing so would raise an exception since syntax
* descriptions do not support the OBSOLETE flag.
*
* @param so0 the first schema description to compare
* @param so1 the second schema description to compare
* @return true if the descriptions match exactly, false otherwise
*/
public static boolean descriptionsMatch( SchemaObject so0, SchemaObject so1 )
{
// check that the OID matches
if ( !so0.getOid().equals( so1.getOid() ) )
{
return false;
}
// check that the obsolete flag is equal but not for syntaxes
if ( ( ( so0 instanceof LdapSyntax ) || ( so1 instanceof LdapSyntax ) ) && so0.isObsolete() != so1.isObsolete() )
{
return false;
}
// check that the description matches
if ( !so0.getDescription().equals( so1.getDescription() ) )
{
return false;
}
// check alias names for exact match
if ( !aliasNamesMatch( so0, so1 ) )
{
return false;
}
// check extensions for exact match
if ( !extensionsMatch( so0, so1 ) )
{
return false;
}
return true;
}
/**
* Checks to see if the extensions of a schema description match another
* description. The order of the extension values must match for a true
* return.
*
* @param lsd0 the first schema description to compare the extensions of
* @param lsd1 the second schema description to compare the extensions of
* @return true if the extensions match exactly, false otherwise
*/
public static boolean extensionsMatch( SchemaObject lsd0, SchemaObject lsd1 )
{
// check sizes first
if ( lsd0.getExtensions().size() != lsd1.getExtensions().size() )
{
return false;
}
// check contents and order of extension values must match
for ( String key : lsd0.getExtensions().keySet() )
{
List<String> values0 = lsd0.getExtension( key );
List<String> values1 = lsd1.getExtension( key );
// if the key is not present in asd1
if ( values1 == null )
{
return false;
}
for ( int i = 0; i < values0.size(); i++ )
{
if ( !values0.get( i ).equals( values1.get( i ) ) )
{
return false;
}
}
}
return true;
}
/**
* Checks to see if the alias names of a schema description match another
* description. The order of the alias names do matter.
*
* @param so0 the schema description to compare
* @param so1 the schema description to compare
* @return true if alias names match exactly, false otherwise
*/
public static boolean aliasNamesMatch( SchemaObject so0, SchemaObject so1 )
{
// check sizes first
if ( so0.getNames().size() != so1.getNames().size() )
{
return false;
}
// check contents and order must match too
for ( int i = 0; i < so0.getNames().size(); i++ )
{
if ( !so0.getNames().get( i ).equals( so1.getNames().get( i ) ) )
{
return false;
}
}
return true;
}
}