You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by fe...@apache.org on 2007/11/05 17:52:07 UTC

svn commit: r592082 [16/20] - in /directory/sandbox/felixk/studio-ldapbrowser-core: ./ META-INF/ src/ src/main/ src/main/java/ src/main/java/org/ src/main/java/org/apache/ src/main/java/org/apache/directory/ src/main/java/org/apache/directory/studio/ s...

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/AttributeTypeDescription.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/AttributeTypeDescription.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/AttributeTypeDescription.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/AttributeTypeDescription.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,541 @@
+/*
+ *  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.studio.ldapbrowser.core.model.schema;
+
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.apache.directory.studio.ldapbrowser.core.BrowserCorePlugin;
+
+
+public class AttributeTypeDescription extends SchemaPart2
+{
+
+    private static final long serialVersionUID = 8023296692770420698L;
+
+    public static final String ATTRIBUTE_USAGE_USER_APPLICATIONS = "userApplications";
+
+    public static final String ATTRIBUTE_USAGE_DISTRIBUTED_OPERATION = "distributedOperation";
+
+    public static final String ATTRIBUTE_USAGE_DIRECTORY_OPERATION = "directoryOperation";
+
+    public static final String ATTRIBUTE_USAGE_DSA_OPERATION = "dSAOperation";
+
+    private String superiorAttributeTypeDescriptionName;
+
+    private String equalityMatchingRuleDescriptionOID;
+
+    private String orderingMatchingRuleDescriptionOID;
+
+    private String substringMatchingRuleDescriptionOID;
+
+    private String syntaxDescriptionNumericOIDPlusLength;
+
+    private boolean isSingleValued;
+
+    private boolean isCollective;
+
+    private boolean isNoUserModification;
+
+    private String usage;
+
+
+    public AttributeTypeDescription()
+    {
+        super();
+        this.superiorAttributeTypeDescriptionName = null;
+        this.equalityMatchingRuleDescriptionOID = null;
+        this.orderingMatchingRuleDescriptionOID = null;
+        this.substringMatchingRuleDescriptionOID = null;
+        this.syntaxDescriptionNumericOIDPlusLength = null;
+        this.isSingleValued = false;
+        this.isCollective = false;
+        this.isNoUserModification = false;
+        this.usage = ATTRIBUTE_USAGE_USER_APPLICATIONS;
+    }
+
+
+    public int compareTo( Object o )
+    {
+        if ( o instanceof AttributeTypeDescription )
+        {
+            return this.toString().compareTo( o.toString() );
+        }
+        else
+        {
+            throw new ClassCastException( "Object of type " + this.getClass().getName() + " required." );
+        }
+    }
+
+
+    /**
+     * 
+     * @return the equality matching rule OID, may be null
+     */
+    public String getEqualityMatchingRuleDescriptionOID()
+    {
+        return equalityMatchingRuleDescriptionOID;
+    }
+
+
+    public void setEqualityMatchingRuleDescriptionOID( String equalityMatchingRuleDescriptionOID )
+    {
+        this.equalityMatchingRuleDescriptionOID = equalityMatchingRuleDescriptionOID;
+    }
+
+
+    /**
+     * 
+     * @return the equality matching rule description OID of this or the
+     *         superior attribute type description, may be null
+     */
+    public String getEqualityMatchingRuleDescriptionOIDTransitive()
+    {
+        if ( this.equalityMatchingRuleDescriptionOID != null )
+        {
+            return this.equalityMatchingRuleDescriptionOID;
+        }
+        else if ( this.getExistingSuperiorAttributeTypeDescription() != null )
+        {
+            return this.getExistingSuperiorAttributeTypeDescription().getEqualityMatchingRuleDescriptionOIDTransitive();
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+
+    /**
+     * 
+     * @return the ordering matching rule OID, may be null
+     */
+    public String getOrderingMatchingRuleDescriptionOID()
+    {
+        return orderingMatchingRuleDescriptionOID;
+    }
+
+
+    public void setOrderingMatchingRuleDescriptionOID( String orderingMatchingRuleDescriptionOID )
+    {
+        this.orderingMatchingRuleDescriptionOID = orderingMatchingRuleDescriptionOID;
+    }
+
+
+    /**
+     * 
+     * @return the ordering matching rule description OID of this or the
+     *         superior attribute type description, may be null
+     */
+    public String getOrderingMatchingRuleDescriptionOIDTransitive()
+    {
+        if ( this.orderingMatchingRuleDescriptionOID != null )
+        {
+            return this.orderingMatchingRuleDescriptionOID;
+        }
+        else if ( this.getExistingSuperiorAttributeTypeDescription() != null )
+        {
+            return this.getExistingSuperiorAttributeTypeDescription().getOrderingMatchingRuleDescriptionOIDTransitive();
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+
+    /**
+     * 
+     * @return the substring matching rule OID, may be null
+     */
+    public String getSubstringMatchingRuleDescriptionOID()
+    {
+        return substringMatchingRuleDescriptionOID;
+    }
+
+
+    public void setSubstringMatchingRuleDescriptionOID( String substringMatchingRuleDescriptionOID )
+    {
+        this.substringMatchingRuleDescriptionOID = substringMatchingRuleDescriptionOID;
+    }
+
+
+    /**
+     * 
+     * @return the substring matching rule description OID of this or the
+     *         superior attribute type description, may be null
+     */
+    public String getSubstringMatchingRuleDescriptionOIDTransitive()
+    {
+        if ( this.substringMatchingRuleDescriptionOID != null )
+        {
+            return this.substringMatchingRuleDescriptionOID;
+        }
+        else if ( this.getExistingSuperiorAttributeTypeDescription() != null )
+        {
+            return this.getExistingSuperiorAttributeTypeDescription()
+                .getSubstringMatchingRuleDescriptionOIDTransitive();
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+
+    /**
+     * 
+     * @return the name of the superior (parent) attribute type description
+     *         or null
+     */
+    public String getSuperiorAttributeTypeDescriptionName()
+    {
+        return superiorAttributeTypeDescriptionName;
+    }
+
+
+    public void setSuperiorAttributeTypeDescriptionName( String superiorAttributeTypeDescriptionName )
+    {
+        this.superiorAttributeTypeDescriptionName = superiorAttributeTypeDescriptionName;
+    }
+
+
+    /**
+     * 
+     * @return the syntax description OID, may be null
+     */
+    public String getSyntaxDescriptionNumericOIDPlusLength()
+    {
+        return syntaxDescriptionNumericOIDPlusLength;
+    }
+
+
+    public void setSyntaxDescriptionNumericOIDPlusLength( String syntaxDescriptionNumericOIDPlusLength )
+    {
+        this.syntaxDescriptionNumericOIDPlusLength = syntaxDescriptionNumericOIDPlusLength;
+    }
+
+
+    /**
+     * 
+     * @return the syntax description OID of this or the superior attribute
+     *         type description, may be null
+     */
+    public String getSyntaxDescriptionNumericOIDTransitive()
+    {
+        if ( this.syntaxDescriptionNumericOIDPlusLength != null )
+        {
+            if ( this.syntaxDescriptionNumericOIDPlusLength.endsWith( "}" )
+                && this.syntaxDescriptionNumericOIDPlusLength.indexOf( "{" ) != -1 )
+            {
+                String syntaxOid = this.syntaxDescriptionNumericOIDPlusLength.substring( 0,
+                    this.syntaxDescriptionNumericOIDPlusLength.indexOf( "{" ) );
+                return syntaxOid;
+            }
+            else
+            {
+                return this.syntaxDescriptionNumericOIDPlusLength;
+            }
+        }
+        else if ( this.getExistingSuperiorAttributeTypeDescription() != null )
+        {
+            return this.getExistingSuperiorAttributeTypeDescription().getSyntaxDescriptionNumericOIDTransitive();
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+
+    /**
+     * 
+     * @return the syntax length of this or the superior attribute type
+     *         description, may be null
+     */
+    public String getSyntaxDescriptionLengthTransitive()
+    {
+        if ( this.syntaxDescriptionNumericOIDPlusLength != null
+            && this.syntaxDescriptionNumericOIDPlusLength.endsWith( "}" )
+            && this.syntaxDescriptionNumericOIDPlusLength.indexOf( "{" ) != -1 )
+        {
+            String length = this.syntaxDescriptionNumericOIDPlusLength.substring(
+                this.syntaxDescriptionNumericOIDPlusLength.indexOf( "{" ) + 1,
+                this.syntaxDescriptionNumericOIDPlusLength.indexOf( "}" ) );
+            return length;
+        }
+        else if ( this.getExistingSuperiorAttributeTypeDescription() != null )
+        {
+            return this.getExistingSuperiorAttributeTypeDescription().getSyntaxDescriptionLengthTransitive();
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+
+    /**
+     * 
+     * @return the usage, on of ATTRIBUTE_USAGE_...
+     */
+    public String getUsage()
+    {
+        return usage;
+    }
+
+
+    public void setUsage( String usage )
+    {
+        if ( usage == null )
+        {
+            this.usage = ATTRIBUTE_USAGE_USER_APPLICATIONS;
+        }
+        else
+        {
+            this.usage = usage;
+        }
+    }
+
+
+    /**
+     * 
+     * @return the single-valued flag
+     */
+    public boolean isSingleValued()
+    {
+        return isSingleValued;
+    }
+
+
+    public void setSingleValued( boolean isSingleValued )
+    {
+        this.isSingleValued = isSingleValued;
+    }
+
+
+    /**
+     * 
+     * @return the collective flag
+     */
+    public boolean isCollective()
+    {
+        return isCollective;
+    }
+
+
+    public void setCollective( boolean isCollective )
+    {
+        this.isCollective = isCollective;
+    }
+
+
+    /**
+     * 
+     * @return the no-user-modification flag
+     */
+    public boolean isNoUserModification()
+    {
+        return isNoUserModification;
+    }
+
+
+    public void setNoUserModification( boolean isNoUserModification )
+    {
+        this.isNoUserModification = isNoUserModification;
+    }
+
+
+    /**
+     * Convenience method to !isBinary().
+     * 
+     * @return true if this attribute type or its syntax is defined as
+     *         string
+     */
+    public boolean isString()
+    {
+        return !isBinary();
+    }
+
+
+    /**
+     * Checks the pre-defined and user-defined binary attribute types. If
+     * this attribute name or OID is defned as binary true is returned. Then
+     * the syntax is checked, see LdadSyntaxDescription#isBinary().
+     * 
+     * @return true if this attribute type or its syntax is defined as
+     *         binary
+     */
+    public boolean isBinary()
+    {
+        // check user-defined binary attributes
+        Set binaryAttributeOidsAndNames = BrowserCorePlugin.getDefault().getCorePreferences()
+            .getBinaryAttributeOidsAndNames();
+        if ( binaryAttributeOidsAndNames.contains( this.numericOID ) )
+        {
+            return true;
+        }
+        for ( int i = 0; i < names.length; i++ )
+        {
+            if ( binaryAttributeOidsAndNames.contains( names[i] ) )
+            {
+                return true;
+            }
+        }
+
+        // check syntax (includes user-defined binary syntaxes)
+        return this.getSyntaxDescription().isBinary();
+    }
+
+
+    /**
+     * 
+     * @return the syntax description of this or the superior attribute type
+     *         descripiton, may be the default or a dummy, never null
+     */
+    public LdapSyntaxDescription getSyntaxDescription()
+    {
+
+        String syntaxOid = this.getSyntaxDescriptionNumericOIDTransitive();
+        if ( syntaxOid != null )
+        {
+            return this.getSchema().getLdapSyntaxDescription( syntaxOid );
+        }
+        else
+        {
+            return LdapSyntaxDescription.DUMMY;
+        }
+    }
+
+
+    private AttributeTypeDescription getExistingSuperiorAttributeTypeDescription()
+    {
+        if ( this.superiorAttributeTypeDescriptionName != null
+            && this.schema.hasAttributeTypeDescription( this.superiorAttributeTypeDescriptionName ) )
+        {
+            return this.getSchema().getAttributeTypeDescription( this.superiorAttributeTypeDescriptionName );
+        }
+        else
+        {
+            return null;
+        }
+    }
+
+
+    /**
+     * 
+     * @return all attribute type description using this attribute type
+     *         description as superior
+     */
+    public AttributeTypeDescription[] getDerivedAttributeTypeDescriptions()
+    {
+        Set derivedATDSet = new HashSet();
+        for ( Iterator it = this.getSchema().getAtdMapByName().values().iterator(); it.hasNext(); )
+        {
+            AttributeTypeDescription atd = ( AttributeTypeDescription ) it.next();
+            String supName = atd.getSuperiorAttributeTypeDescriptionName();
+            if ( supName != null && this.getLowerCaseIdentifierSet().contains( supName.toLowerCase() ) )
+            {
+                derivedATDSet.add( atd );
+            }
+        }
+        AttributeTypeDescription[] derivedAtds = ( AttributeTypeDescription[] ) derivedATDSet
+            .toArray( new AttributeTypeDescription[0] );
+        Arrays.sort( derivedAtds );
+        return derivedAtds;
+    }
+
+
+    /**
+     * 
+     * @return all object class description using this attribute type
+     *         description as must attribute
+     */
+    public ObjectClassDescription[] getUsedAsMust()
+    {
+        Set usedAsMustSet = new HashSet();
+        for ( Iterator it = this.getSchema().getOcdMapByName().values().iterator(); it.hasNext(); )
+        {
+            ObjectClassDescription ocd = ( ObjectClassDescription ) it.next();
+            Set mustSet = toLowerCaseSet( ocd.getMustAttributeTypeDescriptionNamesTransitive() );
+            if ( mustSet.removeAll( this.getLowerCaseIdentifierSet() ) )
+            {
+                usedAsMustSet.add( ocd );
+            }
+        }
+        ObjectClassDescription[] ocds = ( ObjectClassDescription[] ) usedAsMustSet
+            .toArray( new ObjectClassDescription[0] );
+        Arrays.sort( ocds );
+        return ocds;
+    }
+
+
+    /**
+     * 
+     * @return all object class description using this attribute type
+     *         description as may attribute
+     */
+    public ObjectClassDescription[] getUsedAsMay()
+    {
+        Set usedAsMaySet = new HashSet();
+        for ( Iterator it = this.getSchema().getOcdMapByName().values().iterator(); it.hasNext(); )
+        {
+            ObjectClassDescription ocd = ( ObjectClassDescription ) it.next();
+            Set maySet = toLowerCaseSet( ocd.getMayAttributeTypeDescriptionNamesTransitive() );
+            if ( maySet.removeAll( this.getLowerCaseIdentifierSet() ) )
+            {
+                usedAsMaySet.add( ocd );
+            }
+        }
+        ObjectClassDescription[] ocds = ( ObjectClassDescription[] ) usedAsMaySet
+            .toArray( new ObjectClassDescription[0] );
+        Arrays.sort( ocds );
+        return ocds;
+    }
+
+
+    /**
+     * 
+     * @return all matching rule description names this attribute type
+     *         description applies to according to the schemas matching rule
+     *         use descriptions
+     */
+    public String[] getOtherMatchingRuleDescriptionNames()
+    {
+        Set otherMatchingRuleSet = new HashSet();
+        for ( Iterator it = this.getSchema().getMrudMapByName().values().iterator(); it.hasNext(); )
+        {
+            MatchingRuleUseDescription mrud = ( MatchingRuleUseDescription ) it.next();
+            Set atdSet = toLowerCaseSet( mrud.getAppliesAttributeTypeDescriptionOIDs() );
+            if ( atdSet.removeAll( this.getLowerCaseIdentifierSet() ) )
+            {
+                otherMatchingRuleSet.addAll( Arrays.asList( mrud.getNames() ) );
+            }
+        }
+        String[] mrds = ( String[] ) otherMatchingRuleSet.toArray( new String[0] );
+        Arrays.sort( mrds );
+        return mrds;
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/AttributeTypeDescription.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/AttributeValueProviderRelation.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/AttributeValueProviderRelation.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/AttributeValueProviderRelation.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/AttributeValueProviderRelation.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,67 @@
+/*
+ *  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.studio.ldapbrowser.core.model.schema;
+
+
+public class AttributeValueProviderRelation
+{
+
+    private String attributeNumericOidOrType;
+
+    private String valueProviderClassname;
+
+
+    public AttributeValueProviderRelation()
+    {
+    }
+
+
+    public AttributeValueProviderRelation( String attributeNumericOidOrName, String valueProviderClassname )
+    {
+        this.attributeNumericOidOrType = attributeNumericOidOrName;
+        this.valueProviderClassname = valueProviderClassname;
+    }
+
+
+    public String getAttributeNumericOidOrType()
+    {
+        return attributeNumericOidOrType;
+    }
+
+
+    public void setAttributeNumericOidOrType( String attributeNumericOidOrType )
+    {
+        this.attributeNumericOidOrType = attributeNumericOidOrType;
+    }
+
+
+    public String getValueProviderClassname()
+    {
+        return valueProviderClassname;
+    }
+
+
+    public void setValueProviderClassname( String valueProviderClassname )
+    {
+        this.valueProviderClassname = valueProviderClassname;
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/AttributeValueProviderRelation.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/BinaryAttribute.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/BinaryAttribute.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/BinaryAttribute.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/BinaryAttribute.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,52 @@
+/*
+ *  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.studio.ldapbrowser.core.model.schema;
+
+
+public class BinaryAttribute
+{
+
+    private String attributeNumericOidOrName;
+
+
+    public BinaryAttribute()
+    {
+    }
+
+
+    public BinaryAttribute( String attributeNumericOidOrName )
+    {
+        this.attributeNumericOidOrName = attributeNumericOidOrName;
+    }
+
+
+    public String getAttributeNumericOidOrName()
+    {
+        return attributeNumericOidOrName;
+    }
+
+
+    public void setAttributeNumericOidOrName( String attributeNumericOidOrName )
+    {
+        this.attributeNumericOidOrName = attributeNumericOidOrName;
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/BinaryAttribute.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/BinarySyntax.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/BinarySyntax.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/BinarySyntax.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/BinarySyntax.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,52 @@
+/*
+ *  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.studio.ldapbrowser.core.model.schema;
+
+
+public class BinarySyntax
+{
+
+    private String syntaxNumericOid;
+
+
+    public BinarySyntax()
+    {
+    }
+
+
+    public BinarySyntax( String syntaxNumericOid )
+    {
+        this.syntaxNumericOid = syntaxNumericOid;
+    }
+
+
+    public String getSyntaxNumericOid()
+    {
+        return syntaxNumericOid;
+    }
+
+
+    public void setSyntaxNumericOid( String syntaxNumericOid )
+    {
+        this.syntaxNumericOid = syntaxNumericOid;
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/BinarySyntax.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/LdapSyntaxDescription.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/LdapSyntaxDescription.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/LdapSyntaxDescription.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/LdapSyntaxDescription.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,193 @@
+/*
+ *  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.studio.ldapbrowser.core.model.schema;
+
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.apache.directory.studio.ldapbrowser.core.BrowserCorePlugin;
+
+
+/*
+ * Value being represented H-R OBJECT IDENTIFIER
+ * ================================================================= ACI Item N
+ * 1.3.6.1.4.1.1466.115.121.1.1 Access Point Y 1.3.6.1.4.1.1466.115.121.1.2
+ * Attribute Type Description Y 1.3.6.1.4.1.1466.115.121.1.3 Audio N
+ * 1.3.6.1.4.1.1466.115.121.1.4 Binary N 1.3.6.1.4.1.1466.115.121.1.5 Bit String
+ * Y 1.3.6.1.4.1.1466.115.121.1.6 Boolean Y 1.3.6.1.4.1.1466.115.121.1.7
+ * Certificate N 1.3.6.1.4.1.1466.115.121.1.8 Certificate List N
+ * 1.3.6.1.4.1.1466.115.121.1.9 Certificate Pair N 1.3.6.1.4.1.1466.115.121.1.10
+ * Country String Y 1.3.6.1.4.1.1466.115.121.1.11 DN Y
+ * 1.3.6.1.4.1.1466.115.121.1.12 Data Quality Syntax Y
+ * 1.3.6.1.4.1.1466.115.121.1.13 Delivery Method Y 1.3.6.1.4.1.1466.115.121.1.14
+ * Directory String Y 1.3.6.1.4.1.1466.115.121.1.15 DIT Content Rule Description
+ * Y 1.3.6.1.4.1.1466.115.121.1.16 DIT Structure Rule Description Y
+ * 1.3.6.1.4.1.1466.115.121.1.17 DL Submit Permission Y
+ * 1.3.6.1.4.1.1466.115.121.1.18 DSA Quality Syntax Y
+ * 1.3.6.1.4.1.1466.115.121.1.19 DSE Type Y 1.3.6.1.4.1.1466.115.121.1.20
+ * Enhanced Guide Y 1.3.6.1.4.1.1466.115.121.1.21 Facsimile Telephone Number Y
+ * 1.3.6.1.4.1.1466.115.121.1.22 Fax N 1.3.6.1.4.1.1466.115.121.1.23 Generalized
+ * Time Y 1.3.6.1.4.1.1466.115.121.1.24 Guide Y 1.3.6.1.4.1.1466.115.121.1.25
+ * IA5 String Y 1.3.6.1.4.1.1466.115.121.1.26 INTEGER Y
+ * 1.3.6.1.4.1.1466.115.121.1.27 JPEG N 1.3.6.1.4.1.1466.115.121.1.28 LDAP
+ * Syntax Description Y 1.3.6.1.4.1.1466.115.121.1.54 LDAP Schema Definition Y
+ * 1.3.6.1.4.1.1466.115.121.1.56 LDAP Schema Description Y
+ * 1.3.6.1.4.1.1466.115.121.1.57 Master And Shadow Access Points Y
+ * 1.3.6.1.4.1.1466.115.121.1.29 Matching Rule Description Y
+ * 1.3.6.1.4.1.1466.115.121.1.30 Matching Rule Use Description Y
+ * 1.3.6.1.4.1.1466.115.121.1.31 Mail Preference Y 1.3.6.1.4.1.1466.115.121.1.32
+ * MHS OR Address Y 1.3.6.1.4.1.1466.115.121.1.33 Modify Rights Y
+ * 1.3.6.1.4.1.1466.115.121.1.55 Name And Optional UID Y
+ * 1.3.6.1.4.1.1466.115.121.1.34 Name Form Description Y
+ * 1.3.6.1.4.1.1466.115.121.1.35 Numeric String Y 1.3.6.1.4.1.1466.115.121.1.36
+ * Object Class Description Y 1.3.6.1.4.1.1466.115.121.1.37 Octet String Y
+ * 1.3.6.1.4.1.1466.115.121.1.40 OID Y 1.3.6.1.4.1.1466.115.121.1.38 Other
+ * Mailbox Y 1.3.6.1.4.1.1466.115.121.1.39 Postal Address Y
+ * 1.3.6.1.4.1.1466.115.121.1.41 Protocol Information Y
+ * 1.3.6.1.4.1.1466.115.121.1.42 Presentation Address Y
+ * 1.3.6.1.4.1.1466.115.121.1.43 Printable String Y
+ * 1.3.6.1.4.1.1466.115.121.1.44 Substring Assertion Y
+ * 1.3.6.1.4.1.1466.115.121.1.58 Subtree Specification Y
+ * 1.3.6.1.4.1.1466.115.121.1.45 Supplier Information Y
+ * 1.3.6.1.4.1.1466.115.121.1.46 Supplier Or Consumer Y
+ * 1.3.6.1.4.1.1466.115.121.1.47 Supplier And Consumer Y
+ * 1.3.6.1.4.1.1466.115.121.1.48 Supported Algorithm N
+ * 1.3.6.1.4.1.1466.115.121.1.49 Telephone Number Y
+ * 1.3.6.1.4.1.1466.115.121.1.50 Teletex Terminal Identifier Y
+ * 1.3.6.1.4.1.1466.115.121.1.51 Telex Number Y 1.3.6.1.4.1.1466.115.121.1.52
+ * UTC Time Y 1.3.6.1.4.1.1466.115.121.1.53
+ */
+
+public class LdapSyntaxDescription extends SchemaPart
+{
+
+    private static final long serialVersionUID = 2740623603305997234L;
+
+    public static final String DN_OID = "1.3.6.1.4.1.1466.115.121.1.12";
+
+    public static final LdapSyntaxDescription DUMMY;
+    static
+    {
+        DUMMY = new LdapSyntaxDescription();
+        DUMMY.setSchema( Schema.DEFAULT_SCHEMA );
+        DUMMY.setNumericOID( "" );
+        DUMMY.setDesc( "" );
+    }
+
+
+    public LdapSyntaxDescription()
+    {
+        super();
+    }
+
+
+    public int compareTo( Object o )
+    {
+        if ( o instanceof LdapSyntaxDescription )
+        {
+            return this.toString().compareTo( o.toString() );
+        }
+        else
+        {
+            throw new ClassCastException( "Object of type " + this.getClass().getName() + " required." );
+        }
+    }
+
+
+    /**
+     * 
+     * @return the string representation of this syntax description, either
+     *         desc or numericOID
+     */
+    public String toString()
+    {
+        if ( this.desc != null && this.desc.length() > 0 )
+        {
+            return this.desc;
+        }
+        else if ( numericOID != null )
+        {
+            return this.numericOID;
+        }
+        else
+        {
+            return "";
+        }
+    }
+
+
+    /**
+     * Convenience method to !isBinary().
+     * 
+     * @return true if the syntax is defined as string
+     */
+    public boolean isString()
+    {
+        return !isBinary();
+    }
+
+
+    /**
+     * Checks the pre-defined and user-defined binary syntax oids. If this
+     * syntax OID is defned as binary true is returned, false otherwise.
+     * 
+     * @return true if the syntax is defined as binary
+     */
+    public boolean isBinary()
+    {
+        // check user-defined binary syntaxes
+        Set binarySyntaxOids = BrowserCorePlugin.getDefault().getCorePreferences().getBinarySyntaxOids();
+        if ( binarySyntaxOids.contains( this.numericOID ) )
+        {
+            return true;
+        }
+
+        // default: not binary
+        return false;
+    }
+
+
+    /**
+     * 
+     * @return all attribute type description using this syntax description
+     */
+    public AttributeTypeDescription[] getUsedFromAttributeTypeDescription()
+    {
+        Set usedFromSet = new HashSet();
+        for ( Iterator it = this.getSchema().getAtdMapByName().values().iterator(); it.hasNext(); )
+        {
+            AttributeTypeDescription atd = ( AttributeTypeDescription ) it.next();
+            if ( atd.getSyntaxDescriptionNumericOIDTransitive() != null && this.numericOID != null
+                && atd.getSyntaxDescriptionNumericOIDTransitive().toLowerCase().equals( this.numericOID.toLowerCase() ) )
+            {
+                usedFromSet.add( atd );
+            }
+        }
+        AttributeTypeDescription[] atds = ( AttributeTypeDescription[] ) usedFromSet
+            .toArray( new AttributeTypeDescription[0] );
+        Arrays.sort( atds );
+        return atds;
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/LdapSyntaxDescription.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/MatchingRuleDescription.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/MatchingRuleDescription.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/MatchingRuleDescription.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/MatchingRuleDescription.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,110 @@
+/*
+ *  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.studio.ldapbrowser.core.model.schema;
+
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+
+public class MatchingRuleDescription extends SchemaPart2
+{
+
+    private static final long serialVersionUID = -8497098446034593329L;
+
+    private String syntaxDescriptionNumericOID;
+
+
+    public MatchingRuleDescription()
+    {
+        super();
+        this.syntaxDescriptionNumericOID = null;
+    }
+
+
+    public int compareTo( Object o )
+    {
+        if ( o instanceof MatchingRuleDescription )
+        {
+            return this.toString().compareTo( o.toString() );
+        }
+        else
+        {
+            throw new ClassCastException( "Object of type " + this.getClass().getName() + " required." );
+        }
+    }
+
+
+    /**
+     * 
+     * @return the syntax description OID, may be null
+     */
+    public String getSyntaxDescriptionNumericOID()
+    {
+        return syntaxDescriptionNumericOID;
+    }
+
+
+    public void setSyntaxDescriptionNumericOID( String syntaxDescriptionNumericOID )
+    {
+        this.syntaxDescriptionNumericOID = syntaxDescriptionNumericOID;
+    }
+
+
+    /**
+     * 
+     * @return all attribute type descriptions using this matching rule for
+     *         equality, substring or ordering matching
+     */
+    public AttributeTypeDescription[] getUsedFromAttributeTypeDescriptions()
+    {
+        Set usedFromSet = new HashSet();
+        for ( Iterator it = this.getSchema().getAtdMapByName().values().iterator(); it.hasNext(); )
+        {
+            AttributeTypeDescription atd = ( AttributeTypeDescription ) it.next();
+            if ( atd.getEqualityMatchingRuleDescriptionOIDTransitive() != null
+                && this.getLowerCaseIdentifierSet().contains(
+                    atd.getEqualityMatchingRuleDescriptionOIDTransitive().toLowerCase() ) )
+            {
+                usedFromSet.add( atd );
+            }
+            if ( atd.getSubstringMatchingRuleDescriptionOIDTransitive() != null
+                && this.getLowerCaseIdentifierSet().contains(
+                    atd.getSubstringMatchingRuleDescriptionOIDTransitive().toLowerCase() ) )
+            {
+                usedFromSet.add( atd );
+            }
+            if ( atd.getOrderingMatchingRuleDescriptionOIDTransitive() != null
+                && this.getLowerCaseIdentifierSet().contains(
+                    atd.getOrderingMatchingRuleDescriptionOIDTransitive().toLowerCase() ) )
+            {
+                usedFromSet.add( atd );
+            }
+        }
+        AttributeTypeDescription[] atds = ( AttributeTypeDescription[] ) usedFromSet
+            .toArray( new AttributeTypeDescription[0] );
+        Arrays.sort( atds );
+        return atds;
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/MatchingRuleDescription.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/MatchingRuleUseDescription.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/MatchingRuleUseDescription.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/MatchingRuleUseDescription.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/MatchingRuleUseDescription.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,99 @@
+/*
+ *  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.studio.ldapbrowser.core.model.schema;
+
+
+public class MatchingRuleUseDescription extends SchemaPart2
+{
+
+    private static final long serialVersionUID = 2768563387519504369L;
+
+    private String[] appliesAttributeTypeDescriptionOIDs;
+
+
+    public MatchingRuleUseDescription()
+    {
+        super();
+        this.appliesAttributeTypeDescriptionOIDs = new String[0];
+    }
+
+
+    public int compareTo( Object o )
+    {
+        if ( o instanceof MatchingRuleUseDescription )
+        {
+            return this.toString().compareTo( o.toString() );
+        }
+        else
+        {
+            throw new ClassCastException( "Object of type " + this.getClass().getName() + " required." );
+        }
+    }
+
+
+    /**
+     * 
+     * @return the names, may be an empty array
+     */
+    public String[] getNames()
+    {
+        return names;
+    }
+
+
+    public void setNames( String[] names )
+    {
+        this.names = names;
+    }
+
+
+    /**
+     * 
+     * @return the obsolete flag
+     */
+    public boolean isObsolete()
+    {
+        return isObsolete;
+    }
+
+
+    public void setObsolete( boolean isObsolete )
+    {
+        this.isObsolete = isObsolete;
+    }
+
+
+    /**
+     * 
+     * @return the applied attribute type description oids
+     */
+    public String[] getAppliesAttributeTypeDescriptionOIDs()
+    {
+        return appliesAttributeTypeDescriptionOIDs;
+    }
+
+
+    public void setAppliesAttributeTypeDescriptionOIDs( String[] appliesAttributeTypeDescriptionOIDs )
+    {
+        this.appliesAttributeTypeDescriptionOIDs = appliesAttributeTypeDescriptionOIDs;
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/MatchingRuleUseDescription.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/ObjectClassDescription.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/ObjectClassDescription.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/ObjectClassDescription.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/ObjectClassDescription.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,345 @@
+/*
+ *  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.studio.ldapbrowser.core.model.schema;
+
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+
+public class ObjectClassDescription extends SchemaPart2
+{
+
+    private static final long serialVersionUID = 2324990817612632432L;
+
+    public static final String EXTENSIBLEOBJECT_OBJECTCLASSNAME = "extensibleObject";
+
+    public static final String OBSOLETE = "Obsolete";
+
+    public static final String ABSTRACT = "Abstract";
+
+    public static final String STRUCTURAL = "Structural";
+
+    public static final String AUXILIARY = "Auxiliary";
+
+    public static final String OC_ALIAS = "alias";
+
+    public static final String OC_REFERRAL = "referral";
+
+    public static final String OC_SUBENTRY = "subentry";
+
+    public static final String OC_COUNTRY = "country";
+
+    public static final String OC_LOCALITY = "locality";
+
+    public static final String OC_DCOBJECT = "dcObject";
+
+    public static final String OC_DOMAIN = "domain";
+
+    public static final String OC_GROUPOFNAMES = "groupOfNames";
+
+    public static final String OC_GROUPOFUNIQUENAMES = "groupOfUniqueNames";
+
+    public static final String OC_POSIXGROUP = "posixGroup";
+
+    public static final String OC_PERSON = "person";
+
+    public static final String OC_ORGANIZATIONALPERSON = "organizationalPerson";
+
+    public static final String OC_INETORGPERSON = "inetOrgPerson";
+
+    public static final String OC_RESIDENTIALPERSON = "residentialPerson";
+
+    public static final String OC_PILOTPERSON = "pilotPerson";
+
+    public static final String OC_NEWPILOTPERSON = "newPilotPerson";
+
+    public static final String OC_ACCOUNT = "account";
+
+    public static final String OC_ORGANIZATIONALROLE = "organizationalRole";
+
+    public static final String OC_ORGANIZATION = "organization";
+
+    public static final String OC_ORGANIZATIONALUNIT = "organizationalUnit";
+
+    public static final String OC_PILOTORGANIZATION = "pilotOrganization";
+
+    public static final String OC_DMD = "dmd";
+
+    public static final String OC_APPLICATIONPROCESS = "applicationProcess";
+
+    public static final String OC_APPLICATIONENTITY = "applicationEntity";
+
+    public static final String OC_ = "organizationalUnit";
+
+    private boolean isAbstract;
+
+    private boolean isStructural;
+
+    private boolean isAuxiliary;
+
+    private String[] superiorObjectClassDescriptionNames;
+
+    private String[] mustAttributeTypeDescriptionNames;
+
+    private String[] mayAttributeTypeDescriptionNames;
+
+
+    public ObjectClassDescription()
+    {
+        super();
+        this.isAbstract = false;
+        this.isStructural = true;
+        this.isAuxiliary = false;
+        this.superiorObjectClassDescriptionNames = new String[0];
+        this.mustAttributeTypeDescriptionNames = new String[0];
+        this.mayAttributeTypeDescriptionNames = new String[0];
+    }
+
+
+    public int compareTo( Object o )
+    {
+        if ( o instanceof ObjectClassDescription )
+        {
+            return this.toString().compareTo( o.toString() );
+        }
+        else
+        {
+            throw new ClassCastException( "Object of type " + this.getClass().getName() + " required." );
+        }
+    }
+
+
+    /**
+     * 
+     * @return the abstract flag
+     */
+    public boolean isAbstract()
+    {
+        return isAbstract;
+    }
+
+
+    public void setAbstract( boolean isAbstract )
+    {
+        this.isAbstract = isAbstract;
+        this.isAuxiliary = this.isAuxiliary && !this.isAbstract;
+        this.isStructural = this.isStructural && !this.isAbstract;
+    }
+
+
+    /**
+     * 
+     * @return the auxiliary flag
+     */
+    public boolean isAuxiliary()
+    {
+        return isAuxiliary;
+    }
+
+
+    public void setAuxiliary( boolean isAuxiliary )
+    {
+        this.isAuxiliary = isAuxiliary;
+        this.isAbstract = this.isAbstract && !this.isAuxiliary;
+        this.isStructural = this.isStructural && !this.isAuxiliary;
+    }
+
+
+    /**
+     * 
+     * @return the structural flag
+     */
+    public boolean isStructural()
+    {
+        return isStructural;
+    }
+
+
+    public void setStructural( boolean isStructural )
+    {
+        this.isStructural = isStructural;
+        this.isAbstract = this.isAbstract && !this.isStructural;
+        this.isAuxiliary = this.isAuxiliary && !this.isStructural;
+    }
+
+
+    /**
+     * 
+     * @return the may attribute names, may be an empty array
+     */
+    public String[] getMayAttributeTypeDescriptionNames()
+    {
+        return mayAttributeTypeDescriptionNames;
+    }
+
+
+    public void setMayAttributeTypeDescriptionNames( String[] mayAttributeTypeDescriptionNames )
+    {
+        this.mayAttributeTypeDescriptionNames = mayAttributeTypeDescriptionNames;
+    }
+
+
+    /**
+     * 
+     * @return the may attribute names of this and all superior object class
+     *         definitions
+     */
+    public String[] getMayAttributeTypeDescriptionNamesTransitive()
+    {
+        Set maySet = new HashSet();
+        for ( int i = 0; i < this.mayAttributeTypeDescriptionNames.length; i++ )
+        {
+            maySet.add( this.mayAttributeTypeDescriptionNames[i] );
+        }
+        ObjectClassDescription[] supOCDs = this.getExistingSuperObjectClassDescription();
+        if ( supOCDs != null && supOCDs.length > 0 )
+        {
+            for ( int i = 0; i < supOCDs.length; i++ )
+            {
+                maySet.addAll( Arrays.asList( supOCDs[i].getMayAttributeTypeDescriptionNamesTransitive() ) );
+            }
+        }
+        String[] mays = ( String[] ) maySet.toArray( new String[maySet.size()] );
+        Arrays.sort( mays );
+        return mays;
+    }
+
+
+    /**
+     * 
+     * @return the must attribute names, may be an empty array
+     */
+    public String[] getMustAttributeTypeDescriptionNames()
+    {
+        return mustAttributeTypeDescriptionNames;
+    }
+
+
+    public void setMustAttributeTypeDescriptionNames( String[] mustAttributeTypeDescriptionNames )
+    {
+        this.mustAttributeTypeDescriptionNames = mustAttributeTypeDescriptionNames;
+    }
+
+
+    /**
+     * 
+     * @return the must attribute names of this and all superior object
+     *         class definitions
+     */
+    public String[] getMustAttributeTypeDescriptionNamesTransitive()
+    {
+        Set maySet = new HashSet();
+        for ( int i = 0; i < this.mustAttributeTypeDescriptionNames.length; i++ )
+        {
+            maySet.add( this.mustAttributeTypeDescriptionNames[i] );
+        }
+        ObjectClassDescription[] supOCDs = this.getExistingSuperObjectClassDescription();
+        if ( supOCDs != null && supOCDs.length > 0 )
+        {
+            for ( int i = 0; i < supOCDs.length; i++ )
+            {
+                maySet.addAll( Arrays.asList( supOCDs[i].getMustAttributeTypeDescriptionNamesTransitive() ) );
+            }
+        }
+        String[] musts = ( String[] ) maySet.toArray( new String[maySet.size()] );
+        Arrays.sort( musts );
+        return musts;
+    }
+
+
+    /**
+     * 
+     * @return the names of the superior (parent) object class names, may be
+     *         an empty array
+     */
+    public String[] getSuperiorObjectClassDescriptionNames()
+    {
+        return superiorObjectClassDescriptionNames;
+    }
+
+
+    public void setSuperiorObjectClassDescriptionNames( String[] superiorObjectClassDescriptionNames )
+    {
+        this.superiorObjectClassDescriptionNames = superiorObjectClassDescriptionNames;
+    }
+
+    
+    /**
+     * 
+     * @return all superior (parent) object class descriptions, may be an empty array
+     */
+    public ObjectClassDescription[] getSuperiorObjectClassDescriptions()
+    {
+        String[] names = getSuperiorObjectClassDescriptionNames();
+        ObjectClassDescription[] superiorOcds = new ObjectClassDescription[names.length];
+        for ( int i = 0; i < superiorOcds.length; i++ )
+        {
+            superiorOcds[i] = getSchema().getObjectClassDescription( names[i] );
+        }
+        return superiorOcds;
+    }
+
+    /**
+     * 
+     * @return all object class description using this object class
+     *         definition as superior
+     */
+    public ObjectClassDescription[] getSubObjectClassDescriptions()
+    {
+        Set subOCDSet = new HashSet();
+        for ( Iterator it = this.getSchema().getOcdMapByName().values().iterator(); it.hasNext(); )
+        {
+            ObjectClassDescription ocd = ( ObjectClassDescription ) it.next();
+            Set supNameSet = toLowerCaseSet( ocd.getSuperiorObjectClassDescriptionNames() );
+            if ( supNameSet.removeAll( this.getLowerCaseIdentifierSet() ) )
+            {
+                subOCDSet.add( ocd );
+            }
+        }
+        ObjectClassDescription[] subOcds = ( ObjectClassDescription[] ) subOCDSet
+            .toArray( new ObjectClassDescription[0] );
+        Arrays.sort( subOcds );
+        return subOcds;
+    }
+
+
+    private ObjectClassDescription[] getExistingSuperObjectClassDescription()
+    {
+        List supList = new ArrayList();
+        for ( int i = 0; i < this.superiorObjectClassDescriptionNames.length; i++ )
+        {
+            if ( this.schema.hasObjectClassDescription( this.superiorObjectClassDescriptionNames[i] ) )
+            {
+                supList.add( this.schema.getObjectClassDescription( this.superiorObjectClassDescriptionNames[i] ) );
+            }
+        }
+        ObjectClassDescription[] supOcds = ( ObjectClassDescription[] ) supList
+            .toArray( new ObjectClassDescription[supList.size()] );
+        Arrays.sort( supOcds );
+        return supOcds;
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/ObjectClassDescription.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/Schema.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/Schema.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/Schema.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/Schema.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,902 @@
+/*
+ *  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.studio.ldapbrowser.core.model.schema;
+
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.Serializable;
+import java.io.StringReader;
+import java.io.Writer;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.studio.ldapbrowser.core.model.AttributeDescription;
+import org.apache.directory.studio.ldapbrowser.core.model.IAttribute;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.LdifEnumeration;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.container.LdifContainer;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.container.LdifContentRecord;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.lines.LdifAttrValLine;
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.parser.LdifParser;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.parser.SchemaLexer;
+import org.apache.directory.studio.ldapbrowser.core.model.schema.parser.SchemaParser;
+
+
+public class Schema implements Serializable
+{
+
+    private static final long serialVersionUID = 2439355717760227167L;
+
+    public static final String SCHEMA_FILTER = "(objectClass=subschema)";
+    
+    public static final String SCHEMA_ATTRIBUTE_OBJECTCLASSES = "objectClasses";
+
+    public static final String SCHEMA_ATTRIBUTE_ATTRIBUTETYPES = "attributeTypes";
+
+    public static final String SCHEMA_ATTRIBUTE_LDAPSYNTAXES = "ldapSyntaxes";
+
+    public static final String SCHEMA_ATTRIBUTE_MATCHINGRULES = "matchingRules";
+
+    public static final String SCHEMA_ATTRIBUTE_MATCHINGRULEUSE = "matchingRuleUse";
+
+    public static final Schema DEFAULT_SCHEMA;
+    static
+    {
+        Schema defaultSchema = null;
+
+        try
+        {
+            URL url = Schema.class.getClassLoader().getResource(
+                "default_schema.ldif" );
+            InputStream is = url.openStream();
+            Reader reader = new InputStreamReader( is );
+
+            defaultSchema = new Schema();
+            defaultSchema.defaultSchema = true;
+            defaultSchema.loadFromLdif( reader );
+        }
+        catch ( Exception e )
+        {
+            e.printStackTrace();
+        }
+
+        DEFAULT_SCHEMA = defaultSchema;
+    }
+
+    private boolean defaultSchema = false;
+
+
+    public boolean isDefault()
+    {
+        return this.defaultSchema;
+    }
+
+    private LdifContentRecord schemaRecord;
+
+    private LdapDN dn;
+
+    private String[] objectClasses;
+
+    private String createTimestamp;
+
+    private String modifyTimestamp;
+
+    private Map ocdMapByName;
+
+    private Map atdMapByName;
+
+    private Map lsdMapByNumericOID;
+
+    private Map mrdMapByName;
+
+    private Map mrdMapByNumericOID;
+
+    private Map mrudMapByName;
+
+    private Map mrudMapByNumericOID;
+
+
+    public Schema()
+    {
+        this.schemaRecord = null;
+        this.dn = null;
+        this.objectClasses = new String[0];
+        this.createTimestamp = null;
+        this.modifyTimestamp = null;
+        this.ocdMapByName = new HashMap();
+        this.atdMapByName = new HashMap();
+        this.lsdMapByNumericOID = new HashMap();
+        this.mrdMapByName = new HashMap();
+        this.mrdMapByNumericOID = new HashMap();
+        this.mrudMapByName = new HashMap();
+        this.mrudMapByNumericOID = new HashMap();
+    }
+
+
+    /**
+     * Loads all schema elements from the given reader. The input must be in
+     * LDIF format.
+     * 
+     * @param reader
+     */
+    public void loadFromLdif( Reader reader )
+    {
+        try
+        {
+            LdifParser parser = new LdifParser();
+            LdifEnumeration enumeration = parser.parse( reader );
+            if ( enumeration.hasNext( null ) )
+            {
+                LdifContainer container = enumeration.next( null );
+                if ( container instanceof LdifContentRecord )
+                {
+                    LdifContentRecord schemaRecord = ( LdifContentRecord ) container;
+                    this.parseSchemaRecord( schemaRecord );
+                }
+            }
+        }
+        catch ( Exception e )
+        {
+            System.out.println( "Schema#loadFromLdif: " + e.toString() );
+        }
+    }
+
+
+    public void loadFromRecord( LdifContentRecord schemaRecord )
+    {
+        try
+        {
+            this.parseSchemaRecord( schemaRecord );
+        }
+        catch ( Exception e )
+        {
+            System.out.println( "Schema#loadFromRecord: " + e.toString() );
+        }
+    }
+
+
+    /**
+     * Saves the schema in LDIF format to the given writer.
+     * 
+     * @param writer
+     */
+    public void saveToLdif( Writer writer )
+    {
+        try
+        {
+            writer.write( this.getSchemaRecord().toFormattedString() );
+        }
+        catch ( Exception e )
+        {
+            System.out.println( "Schema#saveToLdif: " + e.toString() );
+        }
+    }
+
+
+    private void parseSchemaRecord( LdifContentRecord schemaRecord ) throws Exception
+    {
+
+        this.setSchemaRecord( schemaRecord );
+        this.setDn( new LdapDN( schemaRecord.getDnLine().getValueAsString() ) );
+
+        LdifAttrValLine[] lines = schemaRecord.getAttrVals();
+        for ( int i = 0; i < lines.length; i++ )
+        {
+            LdifAttrValLine line = lines[i];
+            String attributeName = line.getUnfoldedAttributeDescription();
+            String value = line.getValueAsString();
+
+            SchemaLexer lexer = new SchemaLexer( new StringReader( value ) );
+            SchemaParser parser = new SchemaParser( lexer );
+
+            try
+            {
+                if ( attributeName.equalsIgnoreCase( Schema.SCHEMA_ATTRIBUTE_OBJECTCLASSES ) )
+                {
+                    ObjectClassDescription ocd = parser.objectClassDescription();
+                    ocd.setSchema( this );
+                    ocd.setLine( line );
+                    this.addObjectClassDescription( ocd );
+                }
+                else if ( attributeName.equalsIgnoreCase( Schema.SCHEMA_ATTRIBUTE_ATTRIBUTETYPES ) )
+                {
+                    AttributeTypeDescription atd = parser.attributeTypeDescription();
+                    atd.setSchema( this );
+                    atd.setLine( line );
+                    this.addAttributeTypeDescription( atd );
+                }
+                else if ( attributeName.equalsIgnoreCase( Schema.SCHEMA_ATTRIBUTE_LDAPSYNTAXES ) )
+                {
+                    LdapSyntaxDescription lsd = parser.syntaxDescription();
+                    lsd.setSchema( this );
+                    lsd.setLine( line );
+                    this.addLdapSyntaxDescription( lsd );
+                }
+                else if ( attributeName.equalsIgnoreCase( Schema.SCHEMA_ATTRIBUTE_MATCHINGRULES ) )
+                {
+                    MatchingRuleDescription mrd = parser.matchingRuleDescription();
+                    mrd.setSchema( this );
+                    mrd.setLine( line );
+                    this.addMatchingRuleDescription( mrd );
+                }
+                else if ( attributeName.equalsIgnoreCase( Schema.SCHEMA_ATTRIBUTE_MATCHINGRULEUSE ) )
+                {
+                    MatchingRuleUseDescription mrud = parser.matchingRuleUseDescription();
+                    mrud.setSchema( this );
+                    mrud.setLine( line );
+                    this.addMatchingRuleUseDescription( mrud );
+                }
+                else if ( attributeName.equalsIgnoreCase( IAttribute.OPERATIONAL_ATTRIBUTE_CREATE_TIMESTAMP ) )
+                {
+                    this.setCreateTimestamp( value );
+                }
+                else if ( attributeName.equalsIgnoreCase( IAttribute.OPERATIONAL_ATTRIBUTE_MODIFY_TIMESTAMP ) )
+                {
+                    this.setModifyTimestamp( value );
+                }
+            }
+            catch ( Exception e )
+            {
+                System.out.println( e.getMessage() + ": " + attributeName + " - " + value );
+                e.printStackTrace();
+            }
+        }
+
+        // set extensibleObject may attributes
+        ObjectClassDescription extensibleObjectOcd = this
+            .getObjectClassDescription( ObjectClassDescription.EXTENSIBLEOBJECT_OBJECTCLASSNAME );
+        AttributeTypeDescription[] userAtds = SchemaUtils.getUserAttributeDescriptions( this );
+        String[] attributeTypeDescriptionNames = SchemaUtils.getAttributeTypeDescriptionNames( userAtds );
+        extensibleObjectOcd.setMayAttributeTypeDescriptionNames( attributeTypeDescriptionNames );
+    }
+
+
+    /**
+     * 
+     * @return the schema record when the schema was created using the
+     *         loadFromLdif() method, null otherwise
+     */
+    public LdifContentRecord getSchemaRecord()
+    {
+        return schemaRecord;
+    }
+
+
+    public void setSchemaRecord( LdifContentRecord schemaRecord )
+    {
+        this.schemaRecord = schemaRecord;
+    }
+
+
+    /**
+     * 
+     * @return the dn of the schema record, may be null
+     */
+    public LdapDN getDn()
+    {
+        return dn;
+    }
+
+
+    public void setDn( LdapDN dn )
+    {
+        this.dn = dn;
+    }
+
+
+    /**
+     * 
+     * @return the create timestamp of the schema record, may be null
+     */
+    public String getCreateTimestamp()
+    {
+        return createTimestamp;
+    }
+
+
+    public void setCreateTimestamp( String createTimestamp )
+    {
+        this.createTimestamp = createTimestamp;
+    }
+
+
+    /**
+     * 
+     * @return the modify timestamp of the schema record, may be null
+     */
+    public String getModifyTimestamp()
+    {
+        return modifyTimestamp;
+    }
+
+
+    public void setModifyTimestamp( String modifyTimestamp )
+    {
+        this.modifyTimestamp = modifyTimestamp;
+    }
+
+
+    /**
+     * 
+     * @return the object classes of the schema record, may be an empty
+     *         array.
+     */
+    public String[] getObjectClasses()
+    {
+        return objectClasses;
+    }
+
+
+    public void setObjectClasses( String[] objectClasses )
+    {
+        this.objectClasses = objectClasses;
+    }
+
+
+    /**
+     * 
+     * @return a Map of name to attribute type description
+     */
+    Map getAtdMapByName()
+    {
+        return atdMapByName;
+    }
+
+
+    void setAtdMapByName( Map atdMapByName )
+    {
+        this.atdMapByName = atdMapByName;
+    }
+
+
+    public void addAttributeTypeDescription( AttributeTypeDescription atd )
+    {
+        if ( atd.getNames() != null && atd.getNames().length > 0 )
+        {
+            for ( int i = 0; i < atd.getNames().length; i++ )
+            {
+                this.atdMapByName.put( atd.getNames()[i].toLowerCase(), atd );
+            }
+        }
+        if ( atd.getNumericOID() != null )
+        {
+            this.atdMapByName.put( atd.getNumericOID().toLowerCase(), atd );
+        }
+    }
+
+
+    /**
+     * 
+     * @return an array of all attribute type description names
+     */
+    public String[] getAttributeTypeDescriptionNames()
+    {
+        Set set = new HashSet();
+        for ( Iterator it = this.atdMapByName.values().iterator(); it.hasNext(); )
+        {
+            AttributeTypeDescription atd = ( AttributeTypeDescription ) it.next();
+            for ( int i = 0; i < atd.getNames().length; i++ )
+            {
+                set.add( atd.getNames()[i] );
+            }
+        }
+        return ( String[] ) set.toArray( new String[set.size()] );
+    }
+
+
+    public AttributeTypeDescription[] getAttributeTypeDescriptions()
+    {
+        Set set = new HashSet();
+        for ( Iterator it = this.atdMapByName.values().iterator(); it.hasNext(); )
+        {
+            AttributeTypeDescription atd = ( AttributeTypeDescription ) it.next();
+            set.add( atd );
+        }
+        return ( AttributeTypeDescription[] ) set.toArray( new AttributeTypeDescription[set.size()] );
+    }
+
+
+    /**
+     * 
+     * @return a Map of oid to syntax description
+     */
+    public Map getLsdMapByNumericOID()
+    {
+        return lsdMapByNumericOID;
+    }
+
+
+    public void setLsdMapByNumericOID( Map lsdMapByNumericOID )
+    {
+        this.lsdMapByNumericOID = lsdMapByNumericOID;
+    }
+
+
+    public void addLdapSyntaxDescription( LdapSyntaxDescription lsd )
+    {
+        if ( lsd.getNumericOID() != null )
+        {
+            this.lsdMapByNumericOID.put( lsd.getNumericOID().toLowerCase(), lsd );
+        }
+    }
+
+
+    /**
+     * 
+     * @return an array of all syntax description oids
+     */
+    public String[] getLdapSyntaxDescriptionOids()
+    {
+        Set set = new HashSet();
+        for ( Iterator it = this.lsdMapByNumericOID.values().iterator(); it.hasNext(); )
+        {
+            LdapSyntaxDescription lsd = ( LdapSyntaxDescription ) it.next();
+            set.add( lsd.getNumericOID() );
+        }
+        return ( String[] ) set.toArray( new String[set.size()] );
+    }
+
+
+    public LdapSyntaxDescription[] getLdapSyntaxDescriptions()
+    {
+        Set set = new HashSet();
+        for ( Iterator it = this.lsdMapByNumericOID.values().iterator(); it.hasNext(); )
+        {
+            LdapSyntaxDescription lsd = ( LdapSyntaxDescription ) it.next();
+            set.add( lsd );
+        }
+        return ( LdapSyntaxDescription[] ) set.toArray( new LdapSyntaxDescription[set.size()] );
+    }
+
+
+    /**
+     * 
+     * @return a Map of name to matching rule description
+     */
+    public Map getMrdMapByName()
+    {
+        return mrdMapByName;
+    }
+
+
+    public void setMrdMapByName( Map mrdMapByName )
+    {
+        this.mrdMapByName = mrdMapByName;
+    }
+
+    
+    /**
+     * 
+     * @return an array of all matching rule description names
+     */
+    public String[] getMatchingRuleDescriptionNames()
+    {
+        Set set = new HashSet();
+        for ( Iterator it = this.mrdMapByName.values().iterator(); it.hasNext(); )
+        {
+            MatchingRuleDescription mrd = ( MatchingRuleDescription ) it.next();
+            for ( int i = 0; i < mrd.getNames().length; i++ )
+            {
+                set.add( mrd.getNames()[i] );
+            }
+        }
+        return ( String[] ) set.toArray( new String[set.size()] );
+    }
+
+
+    public MatchingRuleDescription[] getMatchingRuleDescriptions()
+    {
+        Set set = new HashSet();
+        for ( Iterator it = this.mrdMapByName.values().iterator(); it.hasNext(); )
+        {
+            MatchingRuleDescription mrd = ( MatchingRuleDescription ) it.next();
+            set.add( mrd );
+        }
+        return ( MatchingRuleDescription[] ) set.toArray( new MatchingRuleDescription[set.size()] );
+    }
+
+    public void addMatchingRuleDescription( MatchingRuleDescription mrd )
+    {
+        if ( mrd.getNames() != null && mrd.getNames().length > 0 )
+        {
+            for ( int i = 0; i < mrd.getNames().length; i++ )
+            {
+                this.mrdMapByName.put( mrd.getNames()[i].toLowerCase(), mrd );
+            }
+        }
+        if ( mrd.getNumericOID() != null )
+        {
+            this.mrdMapByNumericOID.put( mrd.getNumericOID().toLowerCase(), mrd );
+        }
+    }
+
+
+    /**
+     * 
+     * @return a Map of oid to matching rule description
+     */
+    public Map getMrdMapByNumericOID()
+    {
+        return mrdMapByNumericOID;
+    }
+
+
+    public void setMrdMapByNumericOID( Map mrdMapByNumericOID )
+    {
+        this.mrdMapByNumericOID = mrdMapByNumericOID;
+    }
+
+
+    /**
+     * 
+     * @return a Map of name to matching rule use description
+     */
+    public Map getMrudMapByName()
+    {
+        return mrudMapByName;
+    }
+
+
+    public void setMrudMapByName( Map mrudMapByName )
+    {
+        this.mrudMapByName = mrudMapByName;
+    }
+
+
+    public void addMatchingRuleUseDescription( MatchingRuleUseDescription mrud )
+    {
+        if ( mrud.getNames() != null && mrud.getNames().length > 0 )
+        {
+            for ( int i = 0; i < mrud.getNames().length; i++ )
+            {
+                this.mrudMapByName.put( mrud.getNames()[i].toLowerCase(), mrud );
+            }
+        }
+        if ( mrud.getNumericOID() != null )
+        {
+            this.mrudMapByNumericOID.put( mrud.getNumericOID().toLowerCase(), mrud );
+        }
+    }
+
+
+    /**
+     * 
+     * @return a Map of oid to matching rule use description
+     */
+    public Map getMrudMapByNumericOID()
+    {
+        return mrudMapByNumericOID;
+    }
+
+
+    public void setMrduMapByNumericOID( Map mrudMapByNumericOID )
+    {
+        this.mrudMapByNumericOID = mrudMapByNumericOID;
+    }
+
+
+    /**
+     * 
+     * @return a Map of name to object class description
+     */
+    Map getOcdMapByName()
+    {
+        return ocdMapByName;
+    }
+
+
+    void setOcdMapByName( Map ocdMapByName )
+    {
+        this.ocdMapByName = ocdMapByName;
+    }
+
+
+    public void addObjectClassDescription( ObjectClassDescription ocd )
+    {
+        if ( ocd.getNames() != null && ocd.getNames().length > 0 )
+        {
+            for ( int i = 0; i < ocd.getNames().length; i++ )
+            {
+                this.ocdMapByName.put( ocd.getNames()[i].toLowerCase(), ocd );
+            }
+        }
+        if ( ocd.getNumericOID() != null )
+        {
+            this.ocdMapByName.put( ocd.getNumericOID().toLowerCase(), ocd );
+        }
+    }
+
+
+    /**
+     * 
+     * @return an array of all object class names
+     */
+    public String[] getObjectClassDescriptionNames()
+    {
+        Set set = new HashSet();
+        for ( Iterator it = this.ocdMapByName.values().iterator(); it.hasNext(); )
+        {
+            ObjectClassDescription ocd = ( ObjectClassDescription ) it.next();
+            for ( int i = 0; i < ocd.getNames().length; i++ )
+            {
+                set.add( ocd.getNames()[i] );
+            }
+        }
+        return ( String[] ) set.toArray( new String[set.size()] );
+    }
+
+
+    public ObjectClassDescription[] getObjectClassDescriptions()
+    {
+        Set set = new HashSet();
+        for ( Iterator it = this.ocdMapByName.values().iterator(); it.hasNext(); )
+        {
+            ObjectClassDescription ocd = ( ObjectClassDescription ) it.next();
+            set.add( ocd );
+        }
+        return ( ObjectClassDescription[] ) set.toArray( new ObjectClassDescription[set.size()] );
+    }
+
+
+    /**
+     * 
+     * @param name
+     * @return true if a object class description with the given name
+     *         exists.
+     */
+    public boolean hasObjectClassDescription( String name )
+    {
+        return this.ocdMapByName.containsKey( name.toLowerCase() );
+    }
+
+
+    /**
+     * Returns the object class description of the given name. If no such
+     * object exists the default or a dummy object class description is
+     * returned.
+     * 
+     * @param name
+     *                the object class name
+     * @return the object class description, the default or a dummy
+     */
+    public ObjectClassDescription getObjectClassDescription( String name )
+    {
+        if ( this.ocdMapByName.containsKey( name.toLowerCase() ) )
+        {
+            return ( ObjectClassDescription ) this.ocdMapByName.get( name.toLowerCase() );
+        }
+        else if ( !this.isDefault() )
+        {
+            return DEFAULT_SCHEMA.getObjectClassDescription( name );
+        }
+        else
+        {
+            // DUMMY
+            ObjectClassDescription ocd = new ObjectClassDescription();
+            ocd.setSchema( this );
+            ocd.setNumericOID( name );
+            ocd.setNames( new String[]
+                { name } );
+            return ocd;
+        }
+    }
+
+
+    /**
+     * 
+     * @param name
+     * @return true if a attribute type description with the given name
+     *         exists.
+     */
+    public boolean hasAttributeTypeDescription( String name )
+    {
+        return this.atdMapByName.containsKey( name.toLowerCase() );
+    }
+
+
+    /**
+     * Returns the attribute type description of the given name. If no such
+     * object exists the default or a dummy attribute type description is
+     * returned.
+     * 
+     * @param description
+     *                the attribute description
+     * @return the attribute type description, or the default or a dummy
+     */
+    public AttributeTypeDescription getAttributeTypeDescription( String description )
+    {
+        AttributeDescription ad = new AttributeDescription( description );
+        String attributeType = ad.getParsedAttributeType();
+
+        if ( this.atdMapByName.containsKey( attributeType.toLowerCase() ) )
+        {
+            return ( AttributeTypeDescription ) this.atdMapByName.get( attributeType.toLowerCase() );
+        }
+        else if ( !this.isDefault() )
+        {
+            return DEFAULT_SCHEMA.getAttributeTypeDescription( attributeType );
+        }
+        else
+        {
+            // DUMMY
+            AttributeTypeDescription atd = new AttributeTypeDescription();
+            atd.setSchema( this );
+            atd.setNumericOID( attributeType );
+            atd.setNames( new String[]
+                { attributeType } );
+            atd.setNoUserModification( true );
+            atd.setUsage( "" );
+            return atd;
+        }
+    }
+
+
+    /**
+     * 
+     * @param name
+     * @return true if a syntax description with the given name exists.
+     */
+    public boolean hasLdapSyntaxDescription( String numericOID )
+    {
+        return this.lsdMapByNumericOID.containsKey( numericOID.toLowerCase() );
+    }
+
+
+    /**
+     * Returns the syntax description of the given name. If no such object
+     * exists the default or a dummy syntax description is returned.
+     * 
+     * @param name
+     *                the attribute name
+     * @return the attribute type description, or the default or a dummy
+     */
+    public LdapSyntaxDescription getLdapSyntaxDescription( String numericOID )
+    {
+        if ( this.lsdMapByNumericOID.containsKey( numericOID.toLowerCase() ) )
+        {
+            return ( LdapSyntaxDescription ) this.lsdMapByNumericOID.get( numericOID.toLowerCase() );
+        }
+        else if ( !this.isDefault() )
+        {
+            return DEFAULT_SCHEMA.getLdapSyntaxDescription( numericOID );
+        }
+        else
+        {
+            // DUMMY
+            LdapSyntaxDescription lsd = new LdapSyntaxDescription();
+            lsd.setSchema( this );
+            lsd.setNumericOID( numericOID );
+            return lsd;
+        }
+    }
+
+
+    /**
+     * 
+     * @param name
+     * @return true if a matching rule description with the given name or
+     *         oid exists.
+     */
+    public boolean hasMatchingRuleDescription( String nameOrOID )
+    {
+        return this.mrdMapByName.containsKey( nameOrOID.toLowerCase() )
+            || this.mrdMapByNumericOID.containsKey( nameOrOID.toLowerCase() );
+    }
+
+
+    /**
+     * Returns the matching rule description of the given name or oid. If no
+     * such object exists the default or a dummy matching rule description
+     * is returned.
+     * 
+     * @param name
+     *                the matching rule
+     * @return the matching rule description, or the default or a dummy
+     */
+    public MatchingRuleDescription getMatchingRuleDescription( String nameOrOID )
+    {
+        if ( this.mrdMapByName.containsKey( nameOrOID.toLowerCase() ) )
+        {
+            return ( MatchingRuleDescription ) this.mrdMapByName.get( nameOrOID.toLowerCase() );
+        }
+        else if ( this.mrdMapByNumericOID.containsKey( nameOrOID.toLowerCase() ) )
+        {
+            return ( MatchingRuleDescription ) this.mrdMapByNumericOID.get( nameOrOID.toLowerCase() );
+        }
+        else if ( !this.isDefault() )
+        {
+            return DEFAULT_SCHEMA.getMatchingRuleDescription( nameOrOID );
+        }
+        else
+        {
+            // DUMMY
+            MatchingRuleDescription mrd = new MatchingRuleDescription();
+            mrd.setSchema( this );
+            mrd.setNumericOID( nameOrOID );
+            return mrd;
+        }
+    }
+
+
+    /**
+     * 
+     * @param name
+     * @return true if a matching rule use description with the given name
+     *         or oid exists.
+     */
+    public boolean hasMatchingRuleUseDescription( String nameOrOID )
+    {
+        return this.mrudMapByName.containsKey( nameOrOID.toLowerCase() )
+            || this.mrudMapByNumericOID.containsKey( nameOrOID.toLowerCase() );
+    }
+
+
+    /**
+     * Returns the matching rule description of the given name or oid. If no
+     * such object exists the default or a dummy matching rule description
+     * is returned.
+     * 
+     * @param name
+     *                the matching rule
+     * @return the matching rule description, or the default or a dummy
+     */
+    public MatchingRuleUseDescription getMatchingRuleUseDescription( String nameOrOID )
+    {
+        if ( this.mrudMapByName.containsKey( nameOrOID.toLowerCase() ) )
+        {
+            return ( MatchingRuleUseDescription ) this.mrudMapByName.get( nameOrOID.toLowerCase() );
+        }
+        else if ( this.mrudMapByNumericOID.containsKey( nameOrOID.toLowerCase() ) )
+        {
+            return ( MatchingRuleUseDescription ) this.mrudMapByNumericOID.get( nameOrOID.toLowerCase() );
+        }
+        else if ( !this.isDefault() )
+        {
+            return DEFAULT_SCHEMA.getMatchingRuleUseDescription( nameOrOID );
+        }
+        else
+        {
+            // DUMMY
+            MatchingRuleUseDescription mrud = new MatchingRuleUseDescription();
+            mrud.setSchema( this );
+            mrud.setNumericOID( nameOrOID );
+            return mrud;
+        }
+    }
+
+
+    static String[] addValue( String[] array, String value )
+    {
+        List list = new ArrayList( Arrays.asList( array ) );
+        list.add( value );
+        return ( String[] ) list.toArray( new String[list.size()] );
+    }
+
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/Schema.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/SchemaPart.java
URL: http://svn.apache.org/viewvc/directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/SchemaPart.java?rev=592082&view=auto
==============================================================================
--- directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/SchemaPart.java (added)
+++ directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/SchemaPart.java Mon Nov  5 08:51:43 2007
@@ -0,0 +1,137 @@
+/*
+ *  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.studio.ldapbrowser.core.model.schema;
+
+
+import java.io.Serializable;
+
+import org.apache.directory.studio.ldapbrowser.core.model.ldif.lines.LdifAttrValLine;
+
+
+public abstract class SchemaPart implements Comparable, Serializable
+{
+
+    protected LdifAttrValLine line;
+
+    protected Schema schema;
+
+    protected String numericOID;
+
+    protected String desc;
+
+
+    protected SchemaPart()
+    {
+        this.schema = null;
+        this.numericOID = null;
+        this.desc = null;
+    }
+
+
+    /**
+     * 
+     * @return the schema
+     */
+    public Schema getSchema()
+    {
+        return schema;
+    }
+
+
+    public void setSchema( Schema schema )
+    {
+        this.schema = schema;
+    }
+
+
+    /**
+     * 
+     * @return the numeric OID
+     */
+    public String getNumericOID()
+    {
+        return numericOID;
+    }
+
+
+    public void setNumericOID( String numericOID )
+    {
+        this.numericOID = numericOID;
+    }
+
+
+    /**
+     * 
+     * @return true if this syntax description is part of the default schema
+     */
+    public boolean isDefault()
+    {
+        return this.schema.isDefault();
+    }
+
+
+    /**
+     * 
+     * @return the desc, may be null
+     */
+    public String getDesc()
+    {
+        return desc;
+    }
+
+
+    public void setDesc( String desc )
+    {
+        this.desc = desc;
+    }
+
+
+    public LdifAttrValLine getLine()
+    {
+        return line;
+    }
+
+
+    public void setLine( LdifAttrValLine line )
+    {
+        this.line = line;
+    }
+
+    
+    public boolean equals( Object obj )
+    {
+        if ( obj instanceof SchemaPart )
+        {
+            return this.getClass() == obj.getClass() && this.toString().equals( obj.toString() );
+        }
+        else
+        {
+            return false;
+        }
+    }
+    
+    
+    public int hashCode()
+    {
+        return toString().hashCode();
+    }
+    
+}

Propchange: directory/sandbox/felixk/studio-ldapbrowser-core/src/main/java/org/apache/directory/studio/ldapbrowser/core/model/schema/SchemaPart.java
------------------------------------------------------------------------------
    svn:eol-style = native