Package org.jboss.shrinkwrap.impl.base
Class ServiceExtensionLoader
- java.lang.Object
-
- org.jboss.shrinkwrap.impl.base.ServiceExtensionLoader
-
- All Implemented Interfaces:
ExtensionLoader
public class ServiceExtensionLoader extends java.lang.Object implements ExtensionLoader
ServiceExtensionLoader This class is the default strategy to load extensions when an instance ofExtensionLoader
is not provided to theConfigurationBuilder
and theConfigurationBuilder.build()
method is invoked. If theConfigurationBuilder
doesn't provide anyClassLoader
,ConfigurationBuilder.build()
defaults to a one-element collection holding the TCCL. TheclassLoaders
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 incache
.- Version:
- $Revision: $
-
-
Field Summary
Fields Modifier and Type Field Description private java.util.Map<java.lang.Class<?>,java.lang.Class<?>>
cache
private java.lang.Iterable<java.lang.ClassLoader>
classLoaders
ClassLoader used for loading extensionsprivate java.util.Map<java.lang.Class<?>,ExtensionWrapper>
extensionMappings
private static java.util.logging.Logger
log
Logger
-
Constructor Summary
Constructors Constructor Description ServiceExtensionLoader(java.lang.Iterable<java.lang.ClassLoader> classLoaders)
Creates a new instance, using the specifiedClassLoader
s to create extensions
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description <T extends Assignable>
ServiceExtensionLoaderaddOverride(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>
TcreateExtension(java.lang.Class<T> extensionImplClass, Archive<?> archive)
Creates an instance ofextensionImplClass
usingarchive
as the parameter for its one-argument list constructor.private <T extends Assignable>
TcreateFromCache(java.lang.Class<T> extensionClass, Archive<?> archive)
private <T extends Assignable>
TcreateFromLoadExtension(java.lang.Class<T> extensionClass, Archive<?> archive)
Creates a new instance of aextensionClass
implementation.private <T extends Assignable>
java.lang.reflect.Constructor<T>findConstructor(java.lang.Class<T> extensionImplClass)
Finds a constructor with a one-argument list's element which implementsArchive
.private <T extends Assignable>
java.io.InputStreamfindExtensionImpl(java.lang.Class<T> extensionClass)
Iterates through the classloaders to load the provider-configuration file forextensionClass
in META-INF/services/ using its binary name.<T extends Archive<T>>
ArchiveFormatgetArchiveFormatFromExtensionMapping(java.lang.Class<T> type)
Gets theArchiveFormat
for the given type from the extensionMappingprivate java.lang.Iterable<java.lang.ClassLoader>
getClassLoaders()
<T extends Assignable>
java.lang.StringgetExtensionFromExtensionMapping(java.lang.Class<T> type)
Gets the extension for the given type from the extensionMapping(package private) <T extends Assignable>
java.lang.Class<T>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>
Tload(java.lang.Class<T> extensionClass, Archive<?> baseArchive)
Load a Extension.private <T extends Assignable>
java.lang.Class<T>loadExtension(ExtensionWrapper extensionWrapper)
Loads the implementation class hold inExtensionWrapper.implementingClassName
private <T extends Assignable>
java.lang.Class<T>loadExtensionClass(java.lang.String extensionClassName)
Delegates class loading ofextensionClassName
toClassLoaderSearchUtilDelegator.findClassFromClassLoaders(String, Iterable)
passing theextensionClassName
and the instance'sclassLoaders
.private <T extends Assignable>
ExtensionWrapperloadExtensionMapping(java.lang.Class<T> extensionClass)
Finds the SPI configuration, wraps it into aExtensionWrapper
and loads it toextensionMappings
.private <T extends Assignable>
ExtensionWrapperloadExtensionWrapper(java.io.InputStream extensionStream, java.lang.Class<T> extensionClass)
Wraps the provider-configuration fileextensionStream
, the SPIextensionClass
and its implementation class name into aExtensionWrapper
instance.
-
-
-
Field Detail
-
log
private static final java.util.logging.Logger log
Logger
-
cache
private java.util.Map<java.lang.Class<?>,java.lang.Class<?>> cache
-
extensionMappings
private java.util.Map<java.lang.Class<?>,ExtensionWrapper> extensionMappings
-
classLoaders
private final java.lang.Iterable<java.lang.ClassLoader> classLoaders
ClassLoader used for loading extensions
-
-
Constructor Detail
-
ServiceExtensionLoader
public ServiceExtensionLoader(java.lang.Iterable<java.lang.ClassLoader> classLoaders) throws java.lang.IllegalArgumentException
Creates a new instance, using the specifiedClassLoader
s to create extensions- Parameters:
classLoaders
-- Throws:
java.lang.IllegalArgumentException
- If theClassLoader
is not specified
-
-
Method Detail
-
load
public <T extends Assignable> T load(java.lang.Class<T> extensionClass, Archive<?> baseArchive) throws UnknownExtensionTypeException
Load a Extension.- Specified by:
load
in interfaceExtensionLoader
- Parameters:
extensionClass
- The Extension interfacebaseArchive
- The base archive to use- Returns:
- a
- Throws:
UnknownExtensionTypeException
- See Also:
ExtensionLoader.load(java.lang.Class, org.jboss.shrinkwrap.api.Archive)
-
isCached
boolean isCached(java.lang.Class<?> extensionClass)
-
createFromCache
private <T extends Assignable> T createFromCache(java.lang.Class<T> extensionClass, Archive<?> archive)
-
addToCache
void addToCache(java.lang.Class<?> extensionClass, java.lang.Class<?> extensionImplClass)
-
getFromCache
<T extends Assignable> java.lang.Class<T> getFromCache(java.lang.Class<T> extensionClass)
-
addOverride
public <T extends Assignable> ServiceExtensionLoader addOverride(java.lang.Class<T> extensionClass, java.lang.Class<? extends T> extensionImplClass)
Add a Override to the normal Extension loading. If a specific class is found to be overridden, the class will not be loaded using the normal strategy.- Specified by:
addOverride
in interfaceExtensionLoader
- Type Parameters:
T
- The type of Extension- Parameters:
extensionClass
- The Extension interface classextensionImplClass
- The Extension implementation class- Returns:
- this ExtensionLoader
- See Also:
ExtensionLoader.addOverride(java.lang.Class, java.lang.Class)
-
getExtensionFromExtensionMapping
public <T extends Assignable> java.lang.String getExtensionFromExtensionMapping(java.lang.Class<T> type)
Gets the extension for the given type from the extensionMapping- Specified by:
getExtensionFromExtensionMapping
in interfaceExtensionLoader
- Type Parameters:
T
- The type of Extension- Parameters:
type
- The Extension interface class- Returns:
- the filename extension
- See Also:
ExtensionLoader.getExtensionFromExtensionMapping(java.lang.Class)
-
getArchiveFormatFromExtensionMapping
public <T extends Archive<T>> ArchiveFormat getArchiveFormatFromExtensionMapping(java.lang.Class<T> type)
Gets theArchiveFormat
for the given type from the extensionMapping- Specified by:
getArchiveFormatFromExtensionMapping
in interfaceExtensionLoader
- Type Parameters:
T
- The type of Extension- Parameters:
type
- The Extension interface class- Returns:
- the archive format
- See Also:
ExtensionLoader.getArchiveFormatFromExtensionMapping(java.lang.Class)
-
isOverriden
public boolean isOverriden(java.lang.Class<?> extensionClass)
Check to see if a specific extension interface is beeing overloaded- Parameters:
extensionClass
- The ExtensionType interface class- Returns:
- true if found
-
createFromLoadExtension
private <T extends Assignable> T createFromLoadExtension(java.lang.Class<T> extensionClass, Archive<?> archive)
Creates a new instance of aextensionClass
implementation. The implementation class is found in a provider-configuration file in META-INF/services/- Type Parameters:
T
-- Parameters:
extensionClass
-archive
-- Returns:
- an instance of the
extensionClass
' implementation.
-
loadExtension
private <T extends Assignable> java.lang.Class<T> loadExtension(ExtensionWrapper extensionWrapper)
Loads the implementation class hold inExtensionWrapper.implementingClassName
- Type Parameters:
T
-- Parameters:
extensionWrapper
-- Returns:
-
loadExtensionMapping
private <T extends Assignable> ExtensionWrapper loadExtensionMapping(java.lang.Class<T> extensionClass)
Finds the SPI configuration, wraps it into aExtensionWrapper
and loads it toextensionMappings
.- Type Parameters:
T
-- Parameters:
extensionClass
-- Returns:
-
findExtensionImpl
private <T extends Assignable> java.io.InputStream findExtensionImpl(java.lang.Class<T> extensionClass)
Iterates through the classloaders to load the provider-configuration file forextensionClass
in META-INF/services/ using its binary name.- Type Parameters:
T
-- Parameters:
extensionClass
- SPI type for which the configuration file is looked for- Returns:
- An
InputStream
representingextensionClass
's configuration file - Throws:
java.lang.RuntimeException
- if it doesn't find a provider-configuration file forextensionClass
UnknownExtensionTypeExceptionDelegator
-
loadExtensionWrapper
private <T extends Assignable> ExtensionWrapper loadExtensionWrapper(java.io.InputStream extensionStream, java.lang.Class<T> extensionClass)
Wraps the provider-configuration fileextensionStream
, the SPIextensionClass
and its implementation class name into aExtensionWrapper
instance.- Type Parameters:
T
-- Parameters:
extensionStream
- - a bytes stream representation of the provider-configuration fileextensionClass
- - SPI type- Returns:
- a
ExtensionWrapper
instance
-
loadExtensionClass
private <T extends Assignable> java.lang.Class<T> loadExtensionClass(java.lang.String extensionClassName)
Delegates class loading ofextensionClassName
toClassLoaderSearchUtilDelegator.findClassFromClassLoaders(String, Iterable)
passing theextensionClassName
and the instance'sclassLoaders
.- Type Parameters:
T
-- Parameters:
extensionClassName
-- Returns:
-
createExtension
private <T extends Assignable> T createExtension(java.lang.Class<T> extensionImplClass, Archive<?> archive)
Creates an instance ofextensionImplClass
usingarchive
as the parameter for its one-argument list constructor.- Type Parameters:
T
-- Parameters:
extensionImplClass
-archive
-- Returns:
-
findConstructor
private <T extends Assignable> java.lang.reflect.Constructor<T> findConstructor(java.lang.Class<T> extensionImplClass)
Finds a constructor with a one-argument list's element which implementsArchive
.- Type Parameters:
T
-- Parameters:
extensionImplClass
- - Implementation ofAssignable
with a one-argument list's element which implementsArchive
.- Returns:
-
getClassLoaders
private java.lang.Iterable<java.lang.ClassLoader> getClassLoaders()
-
-