Class AnalysisSPILoader<S extends AbstractAnalysisFactory>


  • public final class AnalysisSPILoader<S extends AbstractAnalysisFactory>
    extends java.lang.Object
    Helper class for loading named SPIs from classpath (e.g. Tokenizers, TokenStreams).
    • Field Summary

      Fields 
      Modifier and Type Field Description
      private java.lang.Class<S> clazz  
      private java.util.Set<java.lang.String> originalNames  
      private static java.util.regex.Pattern SERVICE_NAME_PATTERN  
      private java.util.Map<java.lang.String,​java.lang.Class<? extends S>> services  
    • Constructor Summary

      Constructors 
      Constructor Description
      AnalysisSPILoader​(java.lang.Class<S> clazz)  
      AnalysisSPILoader​(java.lang.Class<S> clazz, java.lang.ClassLoader classloader)  
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      java.util.Set<java.lang.String> availableServices()  
      private boolean isValidName​(java.lang.String name)  
      java.lang.Class<? extends S> lookupClass​(java.lang.String name)  
      static java.lang.String lookupSPIName​(java.lang.Class<? extends AbstractAnalysisFactory> service)
      Looks up SPI name (static "NAME" field) with appropriate modifiers.
      static <T extends AbstractAnalysisFactory>
      T
      newFactoryClassInstance​(java.lang.Class<T> clazz, java.util.Map<java.lang.String,​java.lang.String> args)
      Creates a new instance of the given AbstractAnalysisFactory by invoking the constructor, passing the given argument map.
      S newInstance​(java.lang.String name, java.util.Map<java.lang.String,​java.lang.String> args)  
      void reload​(java.lang.ClassLoader classloader)
      Reloads the internal SPI list from the given ClassLoader.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • services

        private volatile java.util.Map<java.lang.String,​java.lang.Class<? extends S extends AbstractAnalysisFactory>> services
      • originalNames

        private volatile java.util.Set<java.lang.String> originalNames
      • SERVICE_NAME_PATTERN

        private static final java.util.regex.Pattern SERVICE_NAME_PATTERN
    • Constructor Detail

      • AnalysisSPILoader

        public AnalysisSPILoader​(java.lang.Class<S> clazz)
      • AnalysisSPILoader

        public AnalysisSPILoader​(java.lang.Class<S> clazz,
                                 java.lang.ClassLoader classloader)
    • Method Detail

      • reload

        public void reload​(java.lang.ClassLoader classloader)
        Reloads the internal SPI list from the given ClassLoader. Changes to the service list are visible after the method ends, all iterators (e.g., from availableServices(),...) stay consistent.

        NOTE: Only new service providers are added, existing ones are never removed or replaced.

        This method is expensive and should only be called for discovery of new service providers on the given classpath/classloader!

      • isValidName

        private boolean isValidName​(java.lang.String name)
      • newInstance

        public S newInstance​(java.lang.String name,
                             java.util.Map<java.lang.String,​java.lang.String> args)
      • lookupClass

        public java.lang.Class<? extends S> lookupClass​(java.lang.String name)
      • availableServices

        public java.util.Set<java.lang.String> availableServices()
      • lookupSPIName

        public static java.lang.String lookupSPIName​(java.lang.Class<? extends AbstractAnalysisFactory> service)
                                              throws java.lang.NoSuchFieldException,
                                                     java.lang.IllegalAccessException,
                                                     java.lang.IllegalStateException
        Looks up SPI name (static "NAME" field) with appropriate modifiers. Also it must be a String class and declared in the concrete class.
        Returns:
        the SPI name
        Throws:
        java.lang.NoSuchFieldException - - if the "NAME" field is not defined.
        java.lang.IllegalAccessException - - if the "NAME" field is inaccessible.
        java.lang.IllegalStateException - - if the "NAME" field does not have appropriate modifiers or isn't a String field.
      • newFactoryClassInstance

        public static <T extends AbstractAnalysisFactory> T newFactoryClassInstance​(java.lang.Class<T> clazz,
                                                                                    java.util.Map<java.lang.String,​java.lang.String> args)
        Creates a new instance of the given AbstractAnalysisFactory by invoking the constructor, passing the given argument map.