Class PluginInstaller

    • Field Detail

      • LOG

        @Nonnull
        private static final org.slf4j.Logger LOG
        Class logger.
      • PLUGIN_VERSION_PROPERTY

        private static final String PLUGIN_VERSION_PROPERTY
        Property Name for version.
        See Also:
        Constant Field Values
      • PLUGIN_FILE_PROPERTY_PREFIX

        private static final String PLUGIN_FILE_PROPERTY_PREFIX
        Property Prefix for install files .
        See Also:
        Constant Field Values
      • PLUGIN_RELATIVE_PATHS_PROPERTY

        private static final String PLUGIN_RELATIVE_PATHS_PROPERTY
        Property Name for whether paths are relative.
        See Also:
        Constant Field Values
      • pluginId

        private String pluginId
        What we are dealing with.
      • unpackDirectory

        private Path unpackDirectory
        Where we have unpacked into.
      • downloadDirectory

        private Path downloadDirectory
        Where we have downloaded.
      • description

        private IdPPlugin description
        The plugin's story about itself.
      • acceptKey

        @Nonnull
        private Predicate<String> acceptKey
        The callback before we install a key into the TrustStore.
      • distribution

        private Path distribution
        The actual distribution.
      • truststore

        private String truststore
        Where to get the keys from if not defaulted.
      • httpClient

        private org.apache.http.client.HttpClient httpClient
        What to use to download things.
      • updateOverrideURLs

        @Nonnull
        private List<URL> updateOverrideURLs
        If overridden these are the urls to us for update (rather than what the plugin asks for.
      • installedContents

        @Nullable
        private List<Path> installedContents
        The absolute paths of what was installed - this is setup by loadCopiedFiles().
      • installedVersionFromContents

        @Nullable
        private String installedVersionFromContents
        The version from the contents file, or null if it isn't loaded.
      • installedPluginsLoader

        private URLClassLoader installedPluginsLoader
        The "plugins" classpath loader. AutoClosed.
      • installingPluginLoader

        private URLClassLoader installingPluginLoader
        The "plugin under construction" classpath loader. AutoClosed.
      • rebuildWar

        private boolean rebuildWar
        Do we rebuild?
    • Constructor Detail

      • PluginInstaller

        public PluginInstaller()
    • Method Detail

      • setIdpHome

        public void setIdpHome​(@Nonnull
                               Path home)
        Set IdP Home.
        Parameters:
        home - Where we are working from
      • setPluginId

        public void setPluginId​(@Nonnull @NotEmpty
                                String id)
        Set the plugin id.
        Parameters:
        id - what to set.
      • setTrustore

        public void setTrustore​(@Nullable
                                String loc)
        Set the truststore.
        Parameters:
        loc - what set.
      • setAcceptKey

        public void setAcceptKey​(@Nonnull
                                 Predicate<String> what)
        Set the acceptKey predicate.
        Parameters:
        what - what to set.
      • setHttpClient

        public void setHttpClient​(@Nonnull
                                  org.apache.http.client.HttpClient what)
        Set the httpClient.
        Parameters:
        what - what to set.
      • setUpdateOverrideURLs

        public void setUpdateOverrideURLs​(@Nonnull
                                          List<URL> urls)
        Set the override URLS.
        Parameters:
        urls - The updateOverrideURLs to set.
      • setModuleContextSecurityParams

        public void setModuleContextSecurityParams​(@Nullable
                                                   HttpClientSecurityParameters params)
        Set the Module Context security parameters.
        Parameters:
        params - what to set.
      • setRebuildWar

        public void setRebuildWar​(boolean what)
        Set whether we rebuild the war.
        Parameters:
        what - - whether we will or not
      • isRebuildWar

        public boolean isRebuildWar()
        Do we rebuild the war?
        Returns:
        true if we are going to.
      • installPlugin

        public void installPlugin​(@Nonnull
                                  URL baseURL,
                                  @Nonnull @NotEmpty
                                  String fileName,
                                  boolean checkVersion)
                           throws org.apache.tools.ant.BuildException
        Install the plugin from the provided URL. Involves downloading the file and then doing a installPlugin(Path, String, boolean).
        Parameters:
        baseURL - where we get the files from
        fileName - the name
        checkVersion - do we want to check vs the IdP Version?
        Throws:
        org.apache.tools.ant.BuildException - if badness is detected.
      • installPlugin

        public void installPlugin​(@Nonnull
                                  Path base,
                                  @Nonnull @NotEmpty
                                  String fileName,
                                  boolean checkVersion)
                           throws org.apache.tools.ant.BuildException
        Install the plugin from a local path.
        • Check signature
        • Unpack to temp folder
        • Install from the folder
        Parameters:
        base - the directory where the files are
        fileName - the name
        checkVersion - do we want to check vs the IdP Version?
        Throws:
        org.apache.tools.ant.BuildException - if badness is detected.
      • uninstall

        public void uninstall()
                       throws org.apache.tools.ant.BuildException
        Remove the jars for this plugin and rebuild the war.
        Throws:
        org.apache.tools.ant.BuildException - if badness occurs.
      • setupDescriptionFromDistribution

        private void setupDescriptionFromDistribution()
                                               throws org.apache.tools.ant.BuildException
        Get hold of the IdPPlugin for this plugin.
        Throws:
        org.apache.tools.ant.BuildException - if badness is happens.
      • getInstalledContents

        @Nonnull
        public List<Path> getInstalledContents()
        What files were installed to webapp for this plugin?
        Returns:
        a list of the absolute paths of the installed contents, may be empty if nothing is installed or the plugin didn't install anything.
      • getVersionFromContents

        @Nullable
        public String getVersionFromContents()
        return the version that the contents page thinks is installed.
        Returns:
        the version, or null if it is not found.
      • getLoadedModules

        private Set<String> getLoadedModules()
                                      throws org.apache.tools.ant.BuildException
        What modules (on the installed plugins Classpath) are currently loaded?
        Returns:
        a set of the names of the currently enabled Modules.
        Throws:
        org.apache.tools.ant.BuildException - on loading a module
      • checkRequiredModules

        private void checkRequiredModules​(Set<String> loadedModules)
                                   throws org.apache.tools.ant.BuildException
        Police that required modules for plugin installation are enabled.
        Parameters:
        loadedModules - the modules we know to be enabled
        Throws:
        org.apache.tools.ant.BuildException - if any required modules are missing or disabled
      • reEnableModules

        private void reEnableModules​(Set<String> loadedModules)
                              throws org.apache.tools.ant.BuildException
        Re-enabled the listed modules iff then are implemented by the plugin we just installed.
        Parameters:
        loadedModules - the modules to enable
        Throws:
        org.apache.tools.ant.BuildException - on errors finding or enabling the modules
      • installNew

        private void installNew​(RollbackPluginInstall rollBack)
                         throws org.apache.tools.ant.BuildException
        Copy the webapp folder from the distribution to the per plugin location inside dist.
        Parameters:
        rollBack - Roll Back Context
        Throws:
        org.apache.tools.ant.BuildException - if badness is detected.
      • uninstallOld

        private void uninstallOld​(RollbackPluginInstall rollback)
                           throws org.apache.tools.ant.BuildException
        Uninstall the old version of the plugin.
        Parameters:
        rollback - Rollback Context
        Throws:
        org.apache.tools.ant.BuildException - on IO or module errors
      • saveCopiedFiles

        private void saveCopiedFiles​(List<Path> copiedFiles)
                              throws org.apache.tools.ant.BuildException
        Stream the copy list to a property file and empty it.
        Parameters:
        copiedFiles - The copied files
        Throws:
        org.apache.tools.ant.BuildException - If we hit an IO exception
      • inferInstalledIdpHome

        private Path inferInstalledIdpHome​(Properties props)
        Infer where the properties were installed to.
        Parameters:
        props - The property files
        Returns:
        the idpHome it was installed to or null if no files installed
      • loadCopiedFiles

        private void loadCopiedFiles()
                              throws org.apache.tools.ant.BuildException
        Load the contents for this plugin from the properties file used during installation.
        Throws:
        org.apache.tools.ant.BuildException - if the load fails
      • download

        private void download​(URL baseURL,
                              String fileName)
                       throws org.apache.tools.ant.BuildException
        Method to download a zip file to the {downloadDirectory.
        Parameters:
        baseURL - Where the zip/tgz and signature file is
        fileName - the name.
        Throws:
        org.apache.tools.ant.BuildException - if badness is detected.
      • buildHttpClient

        private void buildHttpClient()
        Build the Http Client if it doesn't exist.
      • emitModuleChanges

        private void emitModuleChanges()
        Emit module changes.
      • download

        private void download​(Resource baseResource,
                              String fileName)
                       throws IOException
        Download helper method.
        Parameters:
        baseResource - where to go for the file
        fileName - the file name
        Throws:
        IOException - as required
      • unpack

        private void unpack​(Path base,
                            String fileName)
                     throws org.apache.tools.ant.BuildException
        Method to unpack a zip or tgz file into out {unpackDirectory.
        Parameters:
        base - Where the zip/tgz file is
        fileName - the name.
        Throws:
        org.apache.tools.ant.BuildException - if badness is detected.
      • isZip

        private boolean isZip​(String fileName)
                       throws org.apache.tools.ant.BuildException
        does the file name end in .zip?
        Parameters:
        fileName - the name to consider
        Returns:
        true if it ends with .zip
        Throws:
        org.apache.tools.ant.BuildException - if the name is too short
      • getStreamFor

        private org.apache.commons.compress.archivers.ArchiveInputStream getStreamFor​(Path fullName,
                                                                                      boolean isZip)
                                                                               throws IOException
        Create the correct ArchiveInputStream for the input.
        Parameters:
        fullName - the path of the zip file to unpack.
        isZip - if true then this is a zip file, otherwise a tgz file
        Returns:
        the the appropriate ArchiveInputStream
        Throws:
        IOException - if we trip over an unpack
      • setupPluginId

        private void setupPluginId()
                            throws org.apache.tools.ant.BuildException
        Look into the distribution and suck out the plugin id.
        Throws:
        org.apache.tools.ant.BuildException - if badness is detected.
      • checkSignature

        private void checkSignature​(Path base,
                                    String fileName)
                             throws org.apache.tools.ant.BuildException
        Check the signature of the plugin.
        Parameters:
        base - Where the zip/tgz file is
        fileName - the name.
        Throws:
        org.apache.tools.ant.BuildException - if badness is detected.
      • getInstalledPluginsLoader

        private URLClassLoader getInstalledPluginsLoader()
                                                  throws org.apache.tools.ant.BuildException
        Generate a URLClassLoader which looks at the installed WEB-INF/lib in addition to the dist webapp and bin/lib directories. As a side effect, it also copies the libs (since they may well be overwritten)
        Returns:
        an appropriate loader
        Throws:
        org.apache.tools.ant.BuildException - if a directory traversal fails.
      • getDistributionLoader

        private URLClassLoader getDistributionLoader()
                                              throws org.apache.tools.ant.BuildException
        Generate a URLClassLoader which looks at the installing WEB-INF.
        Returns:
        an appropriate loader
        Throws:
        org.apache.tools.ant.BuildException - if a directory traversal fails.
      • getInstalledPlugins

        public List<IdPPlugin> getInstalledPlugins()
                                            throws org.apache.tools.ant.BuildException
        Return a list of the installed plugins.
        Returns:
        All the plugins.
        Throws:
        org.apache.tools.ant.BuildException - if loafing the classpath fails.
      • getInstalledPlugin

        @Nullable
        public IdPPlugin getInstalledPlugin​(@Nonnull
                                            String name)
        Find the IdPPlugin with the provided Id.
        Parameters:
        name - what to find
        Returns:
        the IdPPlugin or null if not found.
      • closeSilently

        private void closeSilently​(AutoCloseable what)
        close, ignoring errors.
        Parameters:
        what - what to close
      • getIdPVersion

        protected static PluginVersion getIdPVersion()
        Return a version we can use in a test proof manner.
        Returns:
        the IdP version or a fixed value