#*
 *  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 $package;


import java.util.ArrayList;
import javax.naming.NamingException;
import org.apache.directory.shared.ldap.schema.ObjectClassTypeEnum;
import org.apache.directory.server.schema.registries.*;

#if ( $package != "org.apache.directory.server.schema.bootstrap" )
import org.apache.directory.server.schema.bootstrap.*;
#end

#**
 * A producer of schema objectClass definations for the $schema schema.  This
 * code has been automatically generated using schema files in the OpenLDAP
 * format along with the directory plugin for maven.  This has been done
 * to facilitate OpenLDAP schema interoperability.
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 * @version $Rev$
 *#
public class $classname extends AbstractBootstrapProducer
{

    public $classname()
    {
        super( ProducerTypeEnum.OBJECT_CLASS_PRODUCER );
    }


    ## ------------------------------------------------------------------------
    ## BootstrapProducer Methods
    ## ------------------------------------------------------------------------


    #**
     * @see BootstrapProducer#produce(Registries, ProducerCallback)
     *#
    public void produce( Registries registries, ProducerCallback cb )
        throws NamingException
    {
        ArrayList<String> array = new ArrayList<String>();
        BootstrapObjectClass objectClass;

        #foreach ( $objectClass in $objectClasses )

        // --------------------------------------------------------------------
        // ObjectClass $objectClass.getOid() $!objectClass.getName()
        // --------------------------------------------------------------------

        objectClass = newObjectClass( "$objectClass.getOid()", registries );
        objectClass.setObsolete( $objectClass.isObsolete() );

        #if ( $objectClass.getDescription() )
#set( $desc = $objectClass.getDescription().replaceAll("\"", "\\\"") )
objectClass.setDescription( "$desc" );
        #end
// set the objectclass type
        #if ( $objectClass.getClassType().getValue() == 0 )
objectClass.setType( ObjectClassTypeEnum.ABSTRACT );
        #elseif ( $objectClass.getClassType().getValue() == 1 )
objectClass.setType( ObjectClassTypeEnum.AUXILIARY );
        #elseif ( $objectClass.getClassType().getValue() == 2 )
objectClass.setType( ObjectClassTypeEnum.STRUCTURAL );
        #end

        // set superior objectClasses
        #if ( $objectClass.getSuperiors() )
array.clear();
       #foreach ( $id in $objectClass.getSuperiors() ) array.add( "$id" );
       #end
 objectClass.setSuperClassIds( array.toArray( EMPTY ) );
        #else
 objectClass.setSuperClassIds( EMPTY );
        #end

        // set must list
        #if ( $objectClass.getMust() )
array.clear();
       #foreach ( $id in $objectClass.getMust() ) array.add( "$id" );
       #end
 objectClass.setMustListIds( array.toArray( EMPTY ) );
        #else
 objectClass.setMustListIds( EMPTY );
        #end

        // set may list
        #if ( $objectClass.getMay() )
array.clear();
       #foreach ( $id in $objectClass.getMay() ) array.add( "$id" );
       #end
 objectClass.setMayListIds( array.toArray( EMPTY ) );
        #else
 objectClass.setMayListIds( EMPTY );
        #end

        // set names
        #if ( $objectClass.getNames() )
array.clear();
       #foreach ( $id in $objectClass.getNames() ) array.add( "$id" );
       #end
 objectClass.setNames( array.toArray( EMPTY ) );
        #else
 objectClass.setNames( EMPTY );
        #end
cb.schemaObjectProduced( this, "$objectClass.getOid()", objectClass );

 #end   }
}
