Package org.pf4j

Class AbstractPluginManager

  • All Implemented Interfaces:
    PluginManager
    Direct Known Subclasses:
    DefaultPluginManager

    public abstract class AbstractPluginManager
    extends java.lang.Object
    implements PluginManager
    This class implements the boilerplate plugin code that any PluginManager implementation would have to support. It helps cut the noise out of the subclass that handles plugin management.

    This class is not thread-safe.

    • Field Detail

      • log

        private static final org.slf4j.Logger log
      • PLUGINS_DIR_PROPERTY_NAME

        public static final java.lang.String PLUGINS_DIR_PROPERTY_NAME
        See Also:
        Constant Field Values
      • MODE_PROPERTY_NAME

        public static final java.lang.String MODE_PROPERTY_NAME
        See Also:
        Constant Field Values
      • DEFAULT_PLUGINS_DIR

        public static final java.lang.String DEFAULT_PLUGINS_DIR
        See Also:
        Constant Field Values
      • DEVELOPMENT_PLUGINS_DIR

        public static final java.lang.String DEVELOPMENT_PLUGINS_DIR
        See Also:
        Constant Field Values
      • pluginsRoot

        protected java.nio.file.Path pluginsRoot
      • plugins

        protected java.util.Map<java.lang.String,​PluginWrapper> plugins
        A map of plugins this manager is responsible for (the key is the 'pluginId').
      • pluginClassLoaders

        protected java.util.Map<java.lang.String,​java.lang.ClassLoader> pluginClassLoaders
        A map of plugin class loaders (the key is the 'pluginId').
      • unresolvedPlugins

        protected java.util.List<PluginWrapper> unresolvedPlugins
        A list with unresolved plugins (unresolved dependency).
      • resolvedPlugins

        protected java.util.List<PluginWrapper> resolvedPlugins
        A list with all resolved plugins (resolved dependency).
      • startedPlugins

        protected java.util.List<PluginWrapper> startedPlugins
        A list with started plugins.
      • runtimeMode

        protected RuntimeMode runtimeMode
        Cache value for the runtime mode. No need to re-read it because it wont change at runtime.
      • systemVersion

        protected java.lang.String systemVersion
        The system version used for comparisons to the plugin requires attribute.
      • exactVersionAllowed

        protected boolean exactVersionAllowed
    • Constructor Detail

      • AbstractPluginManager

        public AbstractPluginManager()
        The plugins root is supplied by System.getProperty("pf4j.pluginsDir", "plugins").
      • AbstractPluginManager

        public AbstractPluginManager​(java.nio.file.Path pluginsRoot)
        Constructs AbstractPluginManager with the given plugins root.
        Parameters:
        pluginsRoot - the root to search for plugins
    • Method Detail

      • setSystemVersion

        public void setSystemVersion​(java.lang.String version)
        Description copied from interface: PluginManager
        Set the system version. This is used to compare against the plugin requires attribute. The default system version is 0.0.0 which disables all version checking.
        Specified by:
        setSystemVersion in interface PluginManager
      • getSystemVersion

        public java.lang.String getSystemVersion()
        Description copied from interface: PluginManager
        Returns the system version.
        Specified by:
        getSystemVersion in interface PluginManager
        Returns:
        the system version
      • getPlugin

        public PluginWrapper getPlugin​(java.lang.String pluginId)
        Description copied from interface: PluginManager
        Retrieves the plugin with this id, or null if the plugin does not exist.
        Specified by:
        getPlugin in interface PluginManager
        Parameters:
        pluginId - the unique plugin identifier, specified in its metadata
        Returns:
        A PluginWrapper object for this plugin, or null if it does not exist.
      • loadPlugin

        public java.lang.String loadPlugin​(java.nio.file.Path pluginPath)
        Description copied from interface: PluginManager
        Load a plugin.
        Specified by:
        loadPlugin in interface PluginManager
        Parameters:
        pluginPath - the plugin location
        Returns:
        the pluginId of the installed plugin as specified in its metadata
      • unloadPlugin

        public boolean unloadPlugin​(java.lang.String pluginId)
        Unload the specified plugin and it's dependents.
        Specified by:
        unloadPlugin in interface PluginManager
        Parameters:
        pluginId - the unique plugin identifier, specified in its metadata
        Returns:
        true if the plugin was unloaded
      • unloadPlugin

        private boolean unloadPlugin​(java.lang.String pluginId,
                                     boolean unloadDependents)
      • deletePlugin

        public boolean deletePlugin​(java.lang.String pluginId)
        Description copied from interface: PluginManager
        Deletes a plugin.
        Specified by:
        deletePlugin in interface PluginManager
        Parameters:
        pluginId - the unique plugin identifier, specified in its metadata
        Returns:
        true if the plugin was deleted
      • startPlugins

        public void startPlugins()
        Start all active plugins.
        Specified by:
        startPlugins in interface PluginManager
      • startPlugin

        public PluginState startPlugin​(java.lang.String pluginId)
        Start the specified plugin and its dependencies.
        Specified by:
        startPlugin in interface PluginManager
        Returns:
        the plugin state
      • stopPlugins

        public void stopPlugins()
        Stop all active plugins.
        Specified by:
        stopPlugins in interface PluginManager
      • stopPlugin

        public PluginState stopPlugin​(java.lang.String pluginId)
        Stop the specified plugin and it's dependents.
        Specified by:
        stopPlugin in interface PluginManager
        Returns:
        the plugin state
      • stopPlugin

        private PluginState stopPlugin​(java.lang.String pluginId,
                                       boolean stopDependents)
      • checkPluginId

        private void checkPluginId​(java.lang.String pluginId)
      • disablePlugin

        public boolean disablePlugin​(java.lang.String pluginId)
        Description copied from interface: PluginManager
        Disables a plugin from being loaded.
        Specified by:
        disablePlugin in interface PluginManager
        Parameters:
        pluginId - the unique plugin identifier, specified in its metadata
        Returns:
        true if plugin is disabled
      • enablePlugin

        public boolean enablePlugin​(java.lang.String pluginId)
        Description copied from interface: PluginManager
        Enables a plugin that has previously been disabled.
        Specified by:
        enablePlugin in interface PluginManager
        Parameters:
        pluginId - the unique plugin identifier, specified in its metadata
        Returns:
        true if plugin is enabled
      • getPluginClassLoader

        public java.lang.ClassLoader getPluginClassLoader​(java.lang.String pluginId)
        Get the ClassLoader for plugin.
        Specified by:
        getPluginClassLoader in interface PluginManager
      • getExtensionClasses

        public java.util.List<java.lang.Class<?>> getExtensionClasses​(java.lang.String pluginId)
        Specified by:
        getExtensionClasses in interface PluginManager
      • getExtensionClasses

        public <T> java.util.List<java.lang.Class<? extends T>> getExtensionClasses​(java.lang.Class<T> type)
        Specified by:
        getExtensionClasses in interface PluginManager
      • getExtensionClasses

        public <T> java.util.List<java.lang.Class<? extends T>> getExtensionClasses​(java.lang.Class<T> type,
                                                                                    java.lang.String pluginId)
        Specified by:
        getExtensionClasses in interface PluginManager
      • getExtensions

        public <T> java.util.List<T> getExtensions​(java.lang.Class<T> type)
        Specified by:
        getExtensions in interface PluginManager
      • getExtensions

        public <T> java.util.List<T> getExtensions​(java.lang.Class<T> type,
                                                   java.lang.String pluginId)
        Specified by:
        getExtensions in interface PluginManager
      • getExtensions

        public java.util.List getExtensions​(java.lang.String pluginId)
        Specified by:
        getExtensions in interface PluginManager
      • getExtensionClassNames

        public java.util.Set<java.lang.String> getExtensionClassNames​(java.lang.String pluginId)
        Specified by:
        getExtensionClassNames in interface PluginManager
      • getPluginsRoot

        public java.nio.file.Path getPluginsRoot()
        Description copied from interface: PluginManager
        Gets the path of the folder where plugins are installed.
        Specified by:
        getPluginsRoot in interface PluginManager
        Returns:
        Path of plugins root
      • getVersion

        public java.lang.String getVersion()
      • createPluginRepository

        protected abstract PluginRepository createPluginRepository()
      • createPluginFactory

        protected abstract PluginFactory createPluginFactory()
      • createExtensionFactory

        protected abstract ExtensionFactory createExtensionFactory()
      • createExtensionFinder

        protected abstract ExtensionFinder createExtensionFinder()
      • createPluginLoader

        protected abstract PluginLoader createPluginLoader()
      • createVersionManager

        protected abstract VersionManager createVersionManager()
      • getPluginClassLoaders

        protected java.util.Map<java.lang.String,​java.lang.ClassLoader> getPluginClassLoaders()
      • initialize

        protected void initialize()
      • isPluginValid

        protected boolean isPluginValid​(PluginWrapper pluginWrapper)
        Check if this plugin is valid (satisfies "requires" param) for a given system version.
        Parameters:
        pluginWrapper - the plugin to check
        Returns:
        true if plugin satisfies the "requires" or if requires was left blank
      • isPluginDisabled

        protected boolean isPluginDisabled​(java.lang.String pluginId)
      • resolvePlugins

        protected void resolvePlugins()
      • firePluginStateEvent

        protected void firePluginStateEvent​(PluginStateEvent event)
      • loadPluginFromPath

        protected PluginWrapper loadPluginFromPath​(java.nio.file.Path pluginPath)
      • idForPath

        protected java.lang.String idForPath​(java.nio.file.Path pluginPath)
        Tests for already loaded plugins on given path.
        Parameters:
        pluginPath - the path to investigate
        Returns:
        id of plugin or null if not loaded
      • validatePluginDescriptor

        protected void validatePluginDescriptor​(PluginDescriptor descriptor)
        Override this to change the validation criteria.
        Parameters:
        descriptor - the plugin descriptor to validate
        Throws:
        PluginRuntimeException - if validation fails
      • isExactVersionAllowed

        public boolean isExactVersionAllowed()
        Returns:
        true if exact versions in requires is allowed
      • setExactVersionAllowed

        public void setExactVersionAllowed​(boolean exactVersionAllowed)
        Set to true to allow requires expression to be exactly x.y.z. The default is false, meaning that using an exact version x.y.z will implicitly mean the same as >=x.y.z
        Parameters:
        exactVersionAllowed - set to true or false
      • getPluginLabel

        protected java.lang.String getPluginLabel​(PluginDescriptor pluginDescriptor)
        The plugin label is used in logging and it's a string in format pluginId@pluginVersion.
      • getExtensionClasses

        private <T> java.util.List<java.lang.Class<? extends T>> getExtensionClasses​(java.util.List<ExtensionWrapper<T>> extensionsWrapper)
      • getExtensions

        private <T> java.util.List<T> getExtensions​(java.util.List<ExtensionWrapper<T>> extensionsWrapper)