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
ClassLoader s 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
ClassLoader
s 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 ExtensionLoader
extensionClass
- The Extension interfacebaseArchive
- The base archive to useUnknownExtensionTypeException
ExtensionLoader.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 ExtensionLoader
T
- 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 ExtensionLoader
T
- 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 ExtensionLoader
T
- 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.implementingClassName
T
- 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 extensionClass
UnknownExtensionTypeExceptionDelegator
private <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()