/*
* 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 javax.naming.spi;
import java.util.Hashtable;
import javax.naming.Name;
import javax.naming.Context;
/**
* An <code>ObjectFactory</code> creates objects of a specified type. A
* variety of different objects may be used by a JNDI application; these objects
* are meaningful to the application and can be manipulated according to the
* methods available to the class of the object, such as a printer object. The
* class implementing this interface should be public, should also provide a
* public constructor taking no arguments, and should be thread-safe. Where URL
* is mentioned below, this refers to RFC 1738 and related RFCs.
*/
public interface ObjectFactory {
/**
* Creates an object of the type specified by parameter <code>o</code>,
* including any reference or location details, customized by the specified
* <code>envmt</code> parameter.
* <p>
* Object factories are specified via environment properties from several
* sources including provider properties files (see the specification of the
* <code>Context</code> interface) and may comprise a list of factories.
* Each object factory in the list is used by
* <code>NamingManager.getObjectInstance()</code> which invokes this
* method on each of them until a non-null result is achieved or until the
* list is exhausted. If an <code>ObjectFactory</code> throws an
* exception, it should be passed back to the code that invoked
* <code>NamingManager.getObjectInstance()</code> and no further object
* factories in the list are examined. An exception should only be thrown by
* an object factory if it is intended that no other object factories be
* examined. Usually, if an <code>ObjectFactory</code> is unable to create
* an object, then null should be returned.
* </p>
* <p>
* A special case of <code>ObjectFactory</code> is a URL context factory
* which is used either to create an object whose location is specified by a
* URL passed as the object <code>o</code> or creates contexts for
* resolving URLs. The <code>getObjectInstance()</code> method of a URL
* context factory must obey these rules:
* </p>
* <p>
* 1. When <code>Object o</code> is null, return a new Context object
* suitable for resolving any URL of the scheme supported by this factory.
* </p>
* <p>
* 2. When <code>Object o</code> is a URL string, return a new object
* (usually a context) identified by the URL, so that names relatively lower
* than that context may be resolved.
* </p>
* <p>
* 3. When <code>Object o</code> is an <code>Array</code> object with
* more than one URL string (order is not important), return a new object
* (usually a context) identified by the URL as in rule 2, above. The URLs
* in the array are considered to be equivalent in relation to the
* associated context, but the object (context) factory can choose whether
* or not to verify that they are truly equivalent.
* </p>
* <p>
* 4. Otherwise, the behaviour of this method depends on the context factory
* implementation.
* </p>
*
* @param o
* may be null or may contain location or reference details
* @param n
* the name relative to the context <code>c</code> of the
* object being created and may be null; the implementation may
* clone or copy this object, but will not modify the original.
* @param c
* may be null when the name is relative to the default initial
* context, or specifies the context to which the name is
* relative (if a factory uses this context object,
* synchronization should be used as Context objects are not
* thread-safe).
* @param envmt
* may be null; the implementation may clone or copy this object,
* but will not modify the original.
* @return either an object of the specified type or null if no object could
* be created.
* @throws Exception
* causes no further object factory will be tried
*/
Object getObjectInstance(Object o, Name n, Context c, Hashtable<?, ?> envmt)
throws Exception;
}