org.apache.commons.discovery.tools
Class DiscoverClass

java.lang.Object
  extended by org.apache.commons.discovery.tools.DiscoverClass

public class DiscoverClass
extends Object

Discover class that implements a given service interface, with discovery and configuration features similar to that employed by standard Java APIs such as JAXP.

In the context of this package, a service interface is defined by a Service Provider Interface (SPI). The SPI is expressed as a Java interface, abstract class, or (base) class that defines an expected programming interface.

DiscoverClass provides the find methods for locating a class that implements a service interface (SPI). Each form of find varies slightly, but they all perform the same basic function. The DiscoverClass.find methods proceed as follows:

IMPLEMENTATION NOTE - This implementation is modelled after the SAXParserFactory and DocumentBuilderFactory implementations (corresponding to the JAXP pluggability APIs) found in Apache Xerces.

Version:
$Revision: 1090010 $ $Date: 2011-04-07 23:05:58 +0200 (Thu, 07 Apr 2011) $

Field Summary
static PropertiesHolder nullProperties
          Readable placeholder for a null value.
 
Constructor Summary
DiscoverClass()
          Create a class instance with dynamic environment (thread context class loader is determined on each call).
DiscoverClass(ClassLoaders classLoaders)
          Create a class instance with dynamic environment (thread context class loader is determined on each call).
 
Method Summary
static
<T> String[]
discoverClassNames(SPInterface<T> spi, Properties properties)
          Discover names of SPI implementation Classes from properties.
<T,S extends T>
Class<S>
find(Class<T> spiClass)
          Find class implementing SPI.
<T,S extends T>
Class<S>
find(Class<T> spiClass, Properties properties)
          Find class implementing SPI.
<T,S extends T>
Class<S>
find(Class<T> spiClass, Properties properties, String defaultImpl)
          Find class implementing SPI.
<T,S extends T>
Class<S>
find(Class<T> spiClass, String defaultImpl)
          Find class implementing SPI.
<T,S extends T>
Class<S>
find(Class<T> spiClass, String propertiesFileName, String defaultImpl)
          Find class implementing SPI.
static
<T,S extends T>
Class<S>
find(ClassLoaders loaders, SPInterface<T> spi, PropertiesHolder properties, DefaultClassHolder<T> defaultImpl)
          Find class implementing SPI.
 ClassLoaders getClassLoaders(Class<?> spiClass)
          Return the class loaders holder for the given SPI.
static String getManagedProperty(String propertyName)
          Load the class whose name is given by the value of a (Managed) System Property.
<T> T
newInstance(Class<T> spiClass)
          Create new instance of class implementing SPI.
<T> T
newInstance(Class<T> spiClass, Properties properties)
          Create new instance of class implementing SPI.
<T> T
newInstance(Class<T> spiClass, Properties properties, String defaultImpl)
          Create new instance of class implementing SPI.
<T> T
newInstance(Class<T> spiClass, String defaultImpl)
          Create new instance of class implementing SPI.
<T> T
newInstance(Class<T> spiClass, String propertiesFileName, String defaultImpl)
          Create new instance of class implementing SPI.
static
<T> T
newInstance(ClassLoaders loaders, SPInterface<T> spi, PropertiesHolder properties, DefaultClassHolder<T> defaultImpl)
          Create new instance of class implementing SPI.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

nullProperties

public static final PropertiesHolder nullProperties
Readable placeholder for a null value.

Constructor Detail

DiscoverClass

public DiscoverClass()
Create a class instance with dynamic environment (thread context class loader is determined on each call). Dynamically construct class loaders on each call.


DiscoverClass

public DiscoverClass(ClassLoaders classLoaders)
Create a class instance with dynamic environment (thread context class loader is determined on each call). Cache static list of class loaders for each call.

Parameters:
classLoaders - The class loaders holder
Method Detail

getClassLoaders

public ClassLoaders getClassLoaders(Class<?> spiClass)
Return the class loaders holder for the given SPI.

Parameters:
spiClass - The SPI type
Returns:
The class loaders holder for the given SPI

find

public <T,S extends T> Class<S> find(Class<T> spiClass)
                        throws DiscoveryException
Find class implementing SPI.

Type Parameters:
T - The SPI type
S - Any class extending T
Parameters:
spiClass - Service Provider Interface Class.
Returns:
Class implementing the SPI.
Throws:
DiscoveryException - Thrown if the name of a class implementing the SPI cannot be found, if the class cannot be loaded, or if the resulting class does not implement (or extend) the SPI.

find

public <T,S extends T> Class<S> find(Class<T> spiClass,
                                     Properties properties)
                        throws DiscoveryException
Find class implementing SPI.

Type Parameters:
T - The SPI type
S - Any class extending T
Parameters:
spiClass - Service Provider Interface Class.
properties - Used to determine name of SPI implementation.
Returns:
Class implementing the SPI.
Throws:
DiscoveryException - Thrown if the name of a class implementing the SPI cannot be found, if the class cannot be loaded, or if the resulting class does not implement (or extend) the SPI.

find

public <T,S extends T> Class<S> find(Class<T> spiClass,
                                     String defaultImpl)
                        throws DiscoveryException
Find class implementing SPI.

Type Parameters:
T - The SPI type
S - Any class extending T
Parameters:
spiClass - Service Provider Interface Class.
defaultImpl - Default implementation name.
Returns:
Class implementing the SPI.
Throws:
DiscoveryException - Thrown if the name of a class implementing the SPI cannot be found, if the class cannot be loaded, or if the resulting class does not implement (or extend) the SPI.

find

public <T,S extends T> Class<S> find(Class<T> spiClass,
                                     Properties properties,
                                     String defaultImpl)
                        throws DiscoveryException
Find class implementing SPI.

Type Parameters:
T - The SPI type
S - Any class extending T
Parameters:
spiClass - Service Provider Interface Class.
properties - Used to determine name of SPI implementation,.
defaultImpl - Default implementation class.
Returns:
Class implementing the SPI.
Throws:
DiscoveryException - Thrown if the name of a class implementing the SPI cannot be found, if the class cannot be loaded, or if the resulting class does not implement (or extend) the SPI.

find

public <T,S extends T> Class<S> find(Class<T> spiClass,
                                     String propertiesFileName,
                                     String defaultImpl)
                        throws DiscoveryException
Find class implementing SPI.

Type Parameters:
T - The SPI type
S - Any class extending T
Parameters:
spiClass - Service Provider Interface Class.
propertiesFileName - Used to determine name of SPI implementation,.
defaultImpl - Default implementation class.
Returns:
Class implementing the SPI.
Throws:
DiscoveryException - Thrown if the name of a class implementing the SPI cannot be found, if the class cannot be loaded, or if the resulting class does not implement (or extend) the SPI.

find

public static <T,S extends T> Class<S> find(ClassLoaders loaders,
                                            SPInterface<T> spi,
                                            PropertiesHolder properties,
                                            DefaultClassHolder<T> defaultImpl)
                               throws DiscoveryException
Find class implementing SPI.

Type Parameters:
T - The SPI type
S - Any class extending T
Parameters:
loaders - The class loaders holder
spi - Service Provider Interface Class.
properties - Used to determine name of SPI implementation,.
defaultImpl - Default implementation class.
Returns:
Class implementing the SPI.
Throws:
DiscoveryException - Thrown if the name of a class implementing the SPI cannot be found, if the class cannot be loaded, or if the resulting class does not implement (or extend) the SPI.

newInstance

public <T> T newInstance(Class<T> spiClass)
              throws DiscoveryException,
                     InstantiationException,
                     IllegalAccessException,
                     NoSuchMethodException,
                     InvocationTargetException
Create new instance of class implementing SPI.

Type Parameters:
T - The SPI type
Parameters:
spiClass - Service Provider Interface Class.
Returns:
Instance of a class implementing the SPI.
Throws:
DiscoveryException - Thrown if the name of a class implementing the SPI cannot be found, if the class cannot be loaded and instantiated, or if the resulting class does not implement (or extend) the SPI.
InstantiationException - see Class.newInstance()
IllegalAccessException - see Class.newInstance()
NoSuchMethodException - see Class.newInstance()
InvocationTargetException - see Class.newInstance()

newInstance

public <T> T newInstance(Class<T> spiClass,
                         Properties properties)
              throws DiscoveryException,
                     InstantiationException,
                     IllegalAccessException,
                     NoSuchMethodException,
                     InvocationTargetException
Create new instance of class implementing SPI.

Type Parameters:
T - The SPI type
Parameters:
spiClass - Service Provider Interface Class.
properties - Used to determine name of SPI implementation, and passed to implementation.init() method if implementation implements Service interface.
Returns:
Instance of a class implementing the SPI.
Throws:
DiscoveryException - Thrown if the name of a class implementing the SPI cannot be found, if the class cannot be loaded and instantiated, or if the resulting class does not implement (or extend) the SPI.
InstantiationException - see Class.newInstance()
IllegalAccessException - see Class.newInstance()
NoSuchMethodException - see Class.newInstance()
InvocationTargetException - see Class.newInstance()

newInstance

public <T> T newInstance(Class<T> spiClass,
                         String defaultImpl)
              throws DiscoveryException,
                     InstantiationException,
                     IllegalAccessException,
                     NoSuchMethodException,
                     InvocationTargetException
Create new instance of class implementing SPI.

Type Parameters:
T - The SPI type
Parameters:
spiClass - Service Provider Interface Class.
defaultImpl - Default implementation.
Returns:
Instance of a class implementing the SPI.
Throws:
DiscoveryException - Thrown if the name of a class implementing the SPI cannot be found, if the class cannot be loaded and instantiated, or if the resulting class does not implement (or extend) the SPI.
InstantiationException - see Class.newInstance()
IllegalAccessException - see Class.newInstance()
NoSuchMethodException - see Class.newInstance()
InvocationTargetException - see Class.newInstance()

newInstance

public <T> T newInstance(Class<T> spiClass,
                         Properties properties,
                         String defaultImpl)
              throws DiscoveryException,
                     InstantiationException,
                     IllegalAccessException,
                     NoSuchMethodException,
                     InvocationTargetException
Create new instance of class implementing SPI.

Type Parameters:
T - The SPI type
Parameters:
spiClass - Service Provider Interface Class.
properties - Used to determine name of SPI implementation, and passed to implementation.init() method if implementation implements Service interface.
defaultImpl - Default implementation.
Returns:
Instance of a class implementing the SPI.
Throws:
DiscoveryException - Thrown if the name of a class implementing the SPI cannot be found, if the class cannot be loaded and instantiated, or if the resulting class does not implement (or extend) the SPI.
InstantiationException - see Class.newInstance()
IllegalAccessException - see Class.newInstance()
NoSuchMethodException - see Class.newInstance()
InvocationTargetException - see Class.newInstance()

newInstance

public <T> T newInstance(Class<T> spiClass,
                         String propertiesFileName,
                         String defaultImpl)
              throws DiscoveryException,
                     InstantiationException,
                     IllegalAccessException,
                     NoSuchMethodException,
                     InvocationTargetException
Create new instance of class implementing SPI.

Type Parameters:
T - The SPI type
Parameters:
spiClass - Service Provider Interface Class.
propertiesFileName - Used to determine name of SPI implementation, and passed to implementation.init() method if implementation implements Service interface.
defaultImpl - Default implementation.
Returns:
Instance of a class implementing the SPI.
Throws:
DiscoveryException - Thrown if the name of a class implementing the SPI cannot be found, if the class cannot be loaded and instantiated, or if the resulting class does not implement (or extend) the SPI.
InstantiationException - see Class.newInstance()
IllegalAccessException - see Class.newInstance()
NoSuchMethodException - see Class.newInstance()
InvocationTargetException - see Class.newInstance()

newInstance

public static <T> T newInstance(ClassLoaders loaders,
                                SPInterface<T> spi,
                                PropertiesHolder properties,
                                DefaultClassHolder<T> defaultImpl)
                     throws DiscoveryException,
                            InstantiationException,
                            IllegalAccessException,
                            NoSuchMethodException,
                            InvocationTargetException
Create new instance of class implementing SPI.

Type Parameters:
T - The SPI type
Parameters:
loaders - The class loaders holder
spi - Service Provider Interface Class.
properties - Used to determine name of SPI implementation, and passed to implementation.init() method if implementation implements Service interface.
defaultImpl - Default implementation.
Returns:
Instance of a class implementing the SPI.
Throws:
DiscoveryException - Thrown if the name of a class implementing the SPI cannot be found, if the class cannot be loaded and instantiated, or if the resulting class does not implement (or extend) the SPI.
InstantiationException - see Class.newInstance()
IllegalAccessException - see Class.newInstance()
NoSuchMethodException - see Class.newInstance()
InvocationTargetException - see Class.newInstance()

discoverClassNames

public static <T> String[] discoverClassNames(SPInterface<T> spi,
                                              Properties properties)

Discover names of SPI implementation Classes from properties. The names are the non-null values, in order, obtained from the following resources:

Type Parameters:
T - The SPI type
Parameters:
spi - The SPI representation
properties - Properties that may define the implementation class name(s).
Returns:
String[] Name of classes implementing the SPI.
Throws:
DiscoveryException - Thrown if the name of a class implementing the SPI cannot be found.

getManagedProperty

public static String getManagedProperty(String propertyName)
Load the class whose name is given by the value of a (Managed) System Property.

Parameters:
propertyName - the name of the system property whose value is the name of the class to load.
Returns:
The managed property value
See Also:
ManagedProperties


Copyright © 2002-2011 The Apache Software Foundation. All Rights Reserved.