public class ServiceExtensionLoader extends java.lang.Object implements ExtensionLoader
ExtensionLoader is not provided to
the ConfigurationBuilder and the ConfigurationBuilder.build() method is invoked. If the
ConfigurationBuilder doesn't provide any ClassLoader, ConfigurationBuilder.build() defaults
to a one-element collection holding the TCCL. The classLoaders are used to find the
provider-configuration file for the extension to be loaded in META-INF/services/. This provider-configuration file is
used to make an instance of the SPI implementation and cached in cache.| Modifier and Type | Field and Description |
|---|---|
private java.util.Map<java.lang.Class<?>,java.lang.Class<?>> |
cache |
private java.lang.Iterable<java.lang.ClassLoader> |
classLoaders
ClassLoader used for loading extensions
|
private java.util.Map<java.lang.Class<?>,ExtensionWrapper> |
extensionMappings |
private static java.util.logging.Logger |
log
Logger
|
| Constructor and Description |
|---|
ServiceExtensionLoader(java.lang.Iterable<java.lang.ClassLoader> classLoaders)
Creates a new instance, using the specified
ClassLoaders to create extensions |
| Modifier and Type | Method and Description |
|---|---|
<T extends Assignable> |
addOverride(java.lang.Class<T> extensionClass,
java.lang.Class<? extends T> extensionImplClass)
Add a Override to the normal Extension loading.
|
(package private) void |
addToCache(java.lang.Class<?> extensionClass,
java.lang.Class<?> extensionImplClass) |
private <T extends Assignable> |
createExtension(java.lang.Class<T> extensionImplClass,
Archive<?> archive)
Creates an instance of
extensionImplClass using archive as the parameter for its
one-argument list constructor. |
private <T extends Assignable> |
createFromCache(java.lang.Class<T> extensionClass,
Archive<?> archive) |
private <T extends Assignable> |
createFromLoadExtension(java.lang.Class<T> extensionClass,
Archive<?> archive)
Creates a new instance of a
extensionClass implementation. |
private <T extends Assignable> |
findConstructor(java.lang.Class<T> extensionImplClass)
Finds a constructor with a one-argument list's element which implements
Archive. |
private <T extends Assignable> |
findExtensionImpl(java.lang.Class<T> extensionClass)
Iterates through the classloaders to load the provider-configuration file for
extensionClass in
META-INF/services/ using its binary name. |
<T extends Archive<T>> |
getArchiveFormatFromExtensionMapping(java.lang.Class<T> type)
Gets the
ArchiveFormat for the given type from the extensionMapping |
private java.lang.Iterable<java.lang.ClassLoader> |
getClassLoaders() |
<T extends Assignable> |
getExtensionFromExtensionMapping(java.lang.Class<T> type)
Gets the extension for the given type from the extensionMapping
|
(package private) <T extends Assignable> |
getFromCache(java.lang.Class<T> extensionClass) |
(package private) boolean |
isCached(java.lang.Class<?> extensionClass) |
boolean |
isOverriden(java.lang.Class<?> extensionClass)
Check to see if a specific extension interface is beeing overloaded
|
<T extends Assignable> |
load(java.lang.Class<T> extensionClass,
Archive<?> baseArchive)
Load a Extension.
|
private <T extends Assignable> |
loadExtension(ExtensionWrapper extensionWrapper)
Loads the implementation class hold in
ExtensionWrapper.implementingClassName |
private <T extends Assignable> |
loadExtensionClass(java.lang.String extensionClassName)
Delegates class loading of
extensionClassName to
ClassLoaderSearchUtilDelegator.findClassFromClassLoaders(String, Iterable) passing the
extensionClassName and the instance's classLoaders. |
private <T extends Assignable> |
loadExtensionMapping(java.lang.Class<T> extensionClass)
Finds the SPI configuration, wraps it into a
ExtensionWrapper and loads it to
extensionMappings. |
private <T extends Assignable> |
loadExtensionWrapper(java.io.InputStream extensionStream,
java.lang.Class<T> extensionClass)
Wraps the provider-configuration file
extensionStream, the SPI extensionClass and its
implementation class name into a ExtensionWrapper instance. |
private static final java.util.logging.Logger log
private java.util.Map<java.lang.Class<?>,java.lang.Class<?>> cache
private java.util.Map<java.lang.Class<?>,ExtensionWrapper> extensionMappings
private final java.lang.Iterable<java.lang.ClassLoader> classLoaders
public ServiceExtensionLoader(java.lang.Iterable<java.lang.ClassLoader> classLoaders)
throws java.lang.IllegalArgumentException
ClassLoaders to create extensionsclassLoaders - java.lang.IllegalArgumentException - If the ClassLoader is not specifiedpublic <T extends Assignable> T load(java.lang.Class<T> extensionClass, Archive<?> baseArchive) throws UnknownExtensionTypeException
load in interface ExtensionLoaderextensionClass - The Extension interfacebaseArchive - The base archive to useUnknownExtensionTypeExceptionExtensionLoader.load(java.lang.Class, org.jboss.shrinkwrap.api.Archive)boolean isCached(java.lang.Class<?> extensionClass)
private <T extends Assignable> T createFromCache(java.lang.Class<T> extensionClass, Archive<?> archive)
void addToCache(java.lang.Class<?> extensionClass,
java.lang.Class<?> extensionImplClass)
<T extends Assignable> java.lang.Class<T> getFromCache(java.lang.Class<T> extensionClass)
public <T extends Assignable> ServiceExtensionLoader addOverride(java.lang.Class<T> extensionClass, java.lang.Class<? extends T> extensionImplClass)
addOverride in interface ExtensionLoaderT - The type of ExtensionextensionClass - The Extension interface classextensionImplClass - The Extension implementation classExtensionLoader.addOverride(java.lang.Class, java.lang.Class)public <T extends Assignable> java.lang.String getExtensionFromExtensionMapping(java.lang.Class<T> type)
getExtensionFromExtensionMapping in interface ExtensionLoaderT - The type of Extensiontype - The Extension interface classExtensionLoader.getExtensionFromExtensionMapping(java.lang.Class)public <T extends Archive<T>> ArchiveFormat getArchiveFormatFromExtensionMapping(java.lang.Class<T> type)
ArchiveFormat for the given type from the extensionMappinggetArchiveFormatFromExtensionMapping in interface ExtensionLoaderT - The type of Extensiontype - The Extension interface classExtensionLoader.getArchiveFormatFromExtensionMapping(java.lang.Class)public boolean isOverriden(java.lang.Class<?> extensionClass)
extensionClass - The ExtensionType interface classprivate <T extends Assignable> T createFromLoadExtension(java.lang.Class<T> extensionClass, Archive<?> archive)
extensionClass implementation. The implementation class is found in a
provider-configuration file in META-INF/services/T - extensionClass - archive - extensionClass' implementation.private <T extends Assignable> java.lang.Class<T> loadExtension(ExtensionWrapper extensionWrapper)
ExtensionWrapper.implementingClassNameT - extensionWrapper - private <T extends Assignable> ExtensionWrapper loadExtensionMapping(java.lang.Class<T> extensionClass)
ExtensionWrapper and loads it to
extensionMappings.T - extensionClass - private <T extends Assignable> java.io.InputStream findExtensionImpl(java.lang.Class<T> extensionClass)
extensionClass in
META-INF/services/ using its binary name.T - extensionClass - SPI type for which the configuration file is looked forInputStream representing extensionClass's configuration filejava.lang.RuntimeException - if it doesn't find a provider-configuration file for extensionClassUnknownExtensionTypeExceptionDelegatorprivate <T extends Assignable> ExtensionWrapper loadExtensionWrapper(java.io.InputStream extensionStream, java.lang.Class<T> extensionClass)
extensionStream, the SPI extensionClass and its
implementation class name into a ExtensionWrapper instance.T - extensionStream - - a bytes stream representation of the provider-configuration fileextensionClass - - SPI typeExtensionWrapper instanceprivate <T extends Assignable> java.lang.Class<T> loadExtensionClass(java.lang.String extensionClassName)
extensionClassName to
ClassLoaderSearchUtilDelegator.findClassFromClassLoaders(String, Iterable) passing the
extensionClassName and the instance's classLoaders.T - extensionClassName - private <T extends Assignable> T createExtension(java.lang.Class<T> extensionImplClass, Archive<?> archive)
extensionImplClass using archive as the parameter for its
one-argument list constructor.T - extensionImplClass - archive - private <T extends Assignable> java.lang.reflect.Constructor<T> findConstructor(java.lang.Class<T> extensionImplClass)
Archive.T - extensionImplClass - - Implementation of Assignable with a one-argument list's element which implements
Archive.private java.lang.Iterable<java.lang.ClassLoader> getClassLoaders()