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 ofExtensionLoaderis not provided to theConfigurationBuilderand theConfigurationBuilder.build()method is invoked. If theConfigurationBuilderdoesn't provide anyClassLoader,ConfigurationBuilder.build()defaults to a one-element collection holding the TCCL. TheclassLoadersare 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<?>>cacheprivate java.lang.Iterable<java.lang.ClassLoader>classLoadersClassLoader used for loading extensionsprivate java.util.Map<java.lang.Class<?>,ExtensionWrapper>extensionMappingsprivate static java.util.logging.LoggerlogLogger
-
Constructor Summary
Constructors Constructor Description ServiceExtensionLoader(java.lang.Iterable<java.lang.ClassLoader> classLoaders)Creates a new instance, using the specifiedClassLoaders 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) voidaddToCache(java.lang.Class<?> extensionClass, java.lang.Class<?> extensionImplClass)private <T extends Assignable>
TcreateExtension(java.lang.Class<T> extensionImplClass, Archive<?> archive)Creates an instance ofextensionImplClassusingarchiveas 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 aextensionClassimplementation.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 forextensionClassin META-INF/services/ using its binary name.<T extends Archive<T>>
ArchiveFormatgetArchiveFormatFromExtensionMapping(java.lang.Class<T> type)Gets theArchiveFormatfor 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) booleanisCached(java.lang.Class<?> extensionClass)booleanisOverriden(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.implementingClassNameprivate <T extends Assignable>
java.lang.Class<T>loadExtensionClass(java.lang.String extensionClassName)Delegates class loading ofextensionClassNametoClassLoaderSearchUtilDelegator.findClassFromClassLoaders(String, Iterable)passing theextensionClassNameand the instance'sclassLoaders.private <T extends Assignable>
ExtensionWrapperloadExtensionMapping(java.lang.Class<T> extensionClass)Finds the SPI configuration, wraps it into aExtensionWrapperand loads it toextensionMappings.private <T extends Assignable>
ExtensionWrapperloadExtensionWrapper(java.io.InputStream extensionStream, java.lang.Class<T> extensionClass)Wraps the provider-configuration fileextensionStream, the SPIextensionClassand its implementation class name into aExtensionWrapperinstance.
-
-
-
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.IllegalArgumentExceptionCreates a new instance, using the specifiedClassLoaders to create extensions- Parameters:
classLoaders-- Throws:
java.lang.IllegalArgumentException- If theClassLoaderis 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:
loadin 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:
addOverridein 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:
getExtensionFromExtensionMappingin 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 theArchiveFormatfor the given type from the extensionMapping- Specified by:
getArchiveFormatFromExtensionMappingin 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 aextensionClassimplementation. 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 aExtensionWrapperand 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 forextensionClassin META-INF/services/ using its binary name.- Type Parameters:
T-- Parameters:
extensionClass- SPI type for which the configuration file is looked for- Returns:
- An
InputStreamrepresentingextensionClass's configuration file - Throws:
java.lang.RuntimeException- if it doesn't find a provider-configuration file forextensionClassUnknownExtensionTypeExceptionDelegator
-
loadExtensionWrapper
private <T extends Assignable> ExtensionWrapper loadExtensionWrapper(java.io.InputStream extensionStream, java.lang.Class<T> extensionClass)
Wraps the provider-configuration fileextensionStream, the SPIextensionClassand its implementation class name into aExtensionWrapperinstance.- Type Parameters:
T-- Parameters:
extensionStream- - a bytes stream representation of the provider-configuration fileextensionClass- - SPI type- Returns:
- a
ExtensionWrapperinstance
-
loadExtensionClass
private <T extends Assignable> java.lang.Class<T> loadExtensionClass(java.lang.String extensionClassName)
Delegates class loading ofextensionClassNametoClassLoaderSearchUtilDelegator.findClassFromClassLoaders(String, Iterable)passing theextensionClassNameand 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 ofextensionImplClassusingarchiveas 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 ofAssignablewith a one-argument list's element which implementsArchive.- Returns:
-
getClassLoaders
private java.lang.Iterable<java.lang.ClassLoader> getClassLoaders()
-
-