Class ServiceExtensionLoader

    • 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 specified ClassLoaders to create extensions
        Parameters:
        classLoaders -
        Throws:
        java.lang.IllegalArgumentException - If the ClassLoader is not specified
    • Method Detail

      • 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 AssignableServiceExtensionLoader 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 interface ExtensionLoader
        Type Parameters:
        T - The type of Extension
        Parameters:
        extensionClass - The Extension interface class
        extensionImplClass - The Extension implementation class
        Returns:
        this ExtensionLoader
        See Also:
        ExtensionLoader.addOverride(java.lang.Class, 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 a extensionClass 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.
      • findExtensionImpl

        private <T extends Assignable> java.io.InputStream 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.
        Type Parameters:
        T -
        Parameters:
        extensionClass - SPI type for which the configuration file is looked for
        Returns:
        An InputStream representing extensionClass's configuration file
        Throws:
        java.lang.RuntimeException - if it doesn't find a provider-configuration file for extensionClass
        UnknownExtensionTypeExceptionDelegator
      • loadExtensionWrapper

        private <T extends AssignableExtensionWrapper 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.
        Type Parameters:
        T -
        Parameters:
        extensionStream - - a bytes stream representation of the provider-configuration file
        extensionClass - - SPI type
        Returns:
        a ExtensionWrapper instance
      • createExtension

        private <T extends Assignable> T createExtension​(java.lang.Class<T> extensionImplClass,
                                                         Archive<?> archive)
        Creates an instance of extensionImplClass using archive 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 implements Archive.
        Type Parameters:
        T -
        Parameters:
        extensionImplClass - - Implementation of Assignable with a one-argument list's element which implements Archive.
        Returns:
      • getClassLoaders

        private java.lang.Iterable<java.lang.ClassLoader> getClassLoaders()