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.ldap.schema.converter;
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<>();
045
046    /** The list of mandatory attributes */
047    private List<String> must = new ArrayList<>();
048
049    /** The list of optional attributes */
050    private List<String> may = new ArrayList<>();
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    @Override
152    public String toLdif( String schemaName ) throws LdapException
153    {
154        StringBuilder sb = new StringBuilder();
155
156        sb.append( schemaToLdif( schemaName, "metaObjectClass" ) );
157
158        // The superiors
159        if ( !superiors.isEmpty() )
160        {
161            for ( String superior : superiors )
162            {
163                sb.append( "m-supObjectClass: " ).append( superior ).append( '\n' );
164            }
165        }
166
167        // The kind of class
168        if ( classType != ObjectClassTypeEnum.STRUCTURAL )
169        {
170            sb.append( "m-typeObjectClass: " ).append( classType ).append( '\n' );
171        }
172
173        // The 'must'
174        if ( !must.isEmpty() )
175        {
176            for ( String attr : must )
177            {
178                sb.append( "m-must: " ).append( attr ).append( '\n' );
179            }
180        }
181
182        // The 'may'
183        if ( !may.isEmpty() )
184        {
185            for ( String attr : may )
186            {
187                sb.append( "m-may: " ).append( attr ).append( '\n' );
188            }
189        }
190
191        // The extensions
192        if ( !extensions.isEmpty() )
193        {
194            extensionsToLdif( "m-extensionObjectClass" );
195        }
196
197        return sb.toString();
198    }
199
200
201    /**
202     * @return a String representing this ObjectClass.
203     */
204    @Override
205    public String toString()
206    {
207        return getOid();
208    }
209
210
211    /**
212     * Transform a schema name to a Dn pointing to the correct position in the DIT
213     * 
214     * @param schemaName The schema name
215     * @return the Dn associated with this schema in the DIT
216     */
217    @Override
218    public String dnToLdif( String schemaName ) throws LdapException
219    {
220        StringBuilder sb = new StringBuilder();
221
222        String dn = "m-oid=" + oid + ", " + SchemaConstants.OBJECT_CLASSES_PATH + ", cn="
223            + Rdn.escapeValue( schemaName ) + ", ou=schema";
224
225        // First dump the Dn only
226        Entry entry = new DefaultEntry( dn );
227        sb.append( LdifUtils.convertToLdif( entry ) );
228
229        return sb.toString();
230    }
231}