001/*
002 *  Licensed to the Apache Software Foundation (ASF) under one
003 *  or more contributor license agreements.  See the NOTICE file
004 *  distributed with this work for additional information
005 *  regarding copyright ownership.  The ASF licenses this file
006 *  to you under the Apache License, Version 2.0 (the
007 *  "License"); you may not use this file except in compliance
008 *  with the License.  You may obtain a copy of the License at
009 *  
010 *    http://www.apache.org/licenses/LICENSE-2.0
011 *  
012 *  Unless required by applicable law or agreed to in writing,
013 *  software distributed under the License is distributed on an
014 *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 *  KIND, either express or implied.  See the License for the
016 *  specific language governing permissions and limitations
017 *  under the License. 
018 *  
019 */
020package org.apache.directory.api.converter.schema;
021
022
023import java.util.ArrayList;
024import java.util.List;
025
026import org.apache.directory.api.ldap.model.constants.SchemaConstants;
027import org.apache.directory.api.ldap.model.entry.DefaultEntry;
028import org.apache.directory.api.ldap.model.entry.Entry;
029import org.apache.directory.api.ldap.model.exception.LdapException;
030import org.apache.directory.api.ldap.model.ldif.LdifUtils;
031import org.apache.directory.api.ldap.model.name.Rdn;
032import org.apache.directory.api.ldap.model.schema.ObjectClassTypeEnum;
033
034
035/**
036 * A bean used to encapsulate the literal String values of an ObjectClass
037 * definition found within an OpenLDAP schema configuration file.
038 *
039 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
040 */
041public class ObjectClassHolder extends SchemaElementImpl
042{
043    /** The list of superiors */
044    private List<String> superiors = new ArrayList<String>();
045
046    /** The list of mandatory attributes */
047    private List<String> must = new ArrayList<String>();
048
049    /** The list of optional attributes */
050    private List<String> may = new ArrayList<String>();
051
052    /** The ObjectClass type */
053    private ObjectClassTypeEnum classType = ObjectClassTypeEnum.STRUCTURAL;
054
055
056    /**
057     * Create an instance of ObjectClass element
058     * 
059     * @param OID the OjectClass OID
060     */
061    public ObjectClassHolder( String oid )
062    {
063        this.oid = oid;
064    }
065
066
067    /**
068     * Get the list of superior for this objectClass
069     * @return A list of all inherited objectClasses 
070     */
071    public List<String> getSuperiors()
072    {
073        return superiors;
074    }
075
076
077    /**
078     * Set the list of inherited objectClasses
079     * @param superiors The list of inherited objectClasses
080     */
081    public void setSuperiors( List<String> superiors )
082    {
083        this.superiors = superiors;
084    }
085
086
087    /**
088     * @return The list of mandatory attributes
089     */
090    public List<String> getMust()
091    {
092        return must;
093    }
094
095
096    /**
097     * Set the list of mandatory attributes
098     * @param must The list of mandatory attributes
099     */
100    public void setMust( List<String> must )
101    {
102        this.must = must;
103    }
104
105
106    /**
107     * @return The list of optional attributes
108     */
109    public List<String> getMay()
110    {
111        return may;
112    }
113
114
115    /**
116     * Set the list of optional attributes
117     * @param may The list of optional attributes
118     */
119    public void setMay( List<String> may )
120    {
121        this.may = may;
122    }
123
124
125    /**
126     * @return The objectClass type
127     */
128    public ObjectClassTypeEnum getClassType()
129    {
130        return classType;
131    }
132
133
134    /**
135     * Set the objectClass type. 
136     * @param classType The objectClass type. 
137     */
138    public void setClassType( ObjectClassTypeEnum classType )
139    {
140        this.classType = classType;
141    }
142
143
144    /**
145     * Convert this objectClass to a Ldif string
146     * 
147     * @param schemaName The name of the schema file containing this objectClass
148     * @return A ldif formatted string
149     * @throws org.apache.directory.api.ldap.model.exception.LdapException If something went wrong
150     */
151    public String toLdif( String schemaName ) throws LdapException
152    {
153        StringBuilder sb = new StringBuilder();
154
155        sb.append( schemaToLdif( schemaName, "metaObjectClass" ) );
156
157        // The superiors
158        if ( superiors.size() != 0 )
159        {
160            for ( String superior : superiors )
161            {
162                sb.append( "m-supObjectClass: " ).append( superior ).append( '\n' );
163            }
164        }
165
166        // The kind of class
167        if ( classType != ObjectClassTypeEnum.STRUCTURAL )
168        {
169            sb.append( "m-typeObjectClass: " ).append( classType ).append( '\n' );
170        }
171
172        // The 'must'
173        if ( must.size() != 0 )
174        {
175            for ( String attr : must )
176            {
177                sb.append( "m-must: " ).append( attr ).append( '\n' );
178            }
179        }
180
181        // The 'may'
182        if ( may.size() != 0 )
183        {
184            for ( String attr : may )
185            {
186                sb.append( "m-may: " ).append( attr ).append( '\n' );
187            }
188        }
189
190        // The extensions
191        if ( extensions.size() != 0 )
192        {
193            extensionsToLdif( "m-extensionObjectClass" );
194        }
195
196        return sb.toString();
197    }
198
199
200    /**
201     * @return a String representing this ObjectClass.
202     */
203    public String toString()
204    {
205        return getOid();
206    }
207
208
209    /**
210     * Transform a schema name to a Dn pointing to the correct position in the DIT
211     * 
212     * @param schemaName The schema name
213     * @return the Dn associated with this schema in the DIT
214     */
215    public String dnToLdif( String schemaName ) throws LdapException
216    {
217        StringBuilder sb = new StringBuilder();
218
219        String dn = "m-oid=" + oid + ", " + SchemaConstants.OBJECT_CLASSES_PATH + ", cn="
220            + Rdn.escapeValue( schemaName ) + ", ou=schema";
221
222        // First dump the Dn only
223        Entry entry = new DefaultEntry( dn );
224        sb.append( LdifUtils.convertToLdif( entry ) );
225
226        return sb.toString();
227    }
228}