/*
 *   Copyright 2004 The Apache Software Foundation
 *
 *   Licensed 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.ldap.server.jndi;


import javax.naming.spi.DirStateFactory;


/**
 * A specialized StateFactory that is optimized for our server-side JNDI
 * provider.  This factory reports the id of the objectClass that it
 * is associated with.  This makes it easier for the server side provider to
 * find the required factory rather than attempt several others within the list
 * of state factories.  JNDI SPI methods are inefficient since they are designed
 * to try all state factories to produce an object.  Our provider looks up
 * the most specific state factories based on additional information.  This
 * makes a huge difference when the number of StateFactories becomes large.
 * <br/>
 * Eventually, it is highly feasible for generated schemas, to also include
 * state and object factories for various objectClasses.  This means the number
 * of factories will increase.  By associating object and state factories with
 * their respective objectClasses we can integrate this into the schema
 * subsystem making factory lookups extremely fast and efficient without costing
 * the user too much to create and store objects within the directory.
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 * @version $Rev$
 */
public interface ServerDirStateFactory extends DirStateFactory
{
    /**
     * Gets either the OID for the objectClass or the human readable name for
     * the objectClass this DirStateFactory is associated with.  Note
     * that associating this factory with an objectClass automatically
     * associates this DirStateFactory with all descendents of the objectClass.
     *
     * @return the OID or human readable name of the objectClass associated with this StateFactory
     */
    String getObjectClassId();

    /**
     * Gets the Class instance associated with this StateFactory.  Objects to
     * be persisted by this StateFactory must be of this type, a subclass of
     * this type, or implement this type if it is an interface.
     *
     * @return the class associated with this factory.
     */
    Class getAssociatedClass();
}
