Class PluginInstaller

All Implemented Interfaces:
AutoCloseable, Component, DestructableComponent, InitializableComponent

public final class PluginInstaller extends AbstractInitializableComponent implements AutoCloseable
The class where the heavy lifting of managing a plugin happens.
  • Field Details

    • 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:
    • PLUGIN_FILE_PROPERTY_PREFIX

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

      private static final String PLUGIN_RELATIVE_PATHS_PROPERTY
      Property Name for whether paths are relative.
      See Also:
    • idpHome

      @NonnullAfterInit private Path idpHome
      Where we are installing to.
    • 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.
    • workspacePath

      @NonnullAfterInit private Path workspacePath
      Dumping space for renamed files.
    • distPath

      @NonnullAfterInit private Path distPath
      DistDir.
    • pluginsWebapp

      @NonnullAfterInit private Path pluginsWebapp
      Pluginss webapp.
    • pluginsContents

      @NonnullAfterInit private Path pluginsContents
      Pluginss webapp.
    • 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.
    • moduleContext

      @NonnullAfterInit private ModuleContext moduleContext
      The Module Context.
    • moduleChanges

      Module Changes.
    • installedPluginsLoader

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

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

      private HttpClientSecurityParameters securityParams
      The securityParams for the module context.
    • rebuildWar

      private boolean rebuildWar
      Do we rebuild?
  • Constructor Details

    • PluginInstaller

      public PluginInstaller()
  • Method Details

    • 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.
    • captureChanges

      private void captureChanges(Map<IdPModule.ModuleResource,IdPModule.ResourceResult> changes)
      Capture module changes.
      Parameters:
      changes - what has changed
    • emitModuleChanges

      private void emitModuleChanges()
      Emit module changes.
    • doReportOperation

      private void doReportOperation(@Nonnull IdPModule.ModuleResource resource, @Nonnull IdPModule.ResourceResult result)
      Report on a resource result.
      Parameters:
      resource - resource
      result - result of operation
    • 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.
    • doInitialize

      protected void doInitialize() throws ComponentInitializationException
      Overrides:
      doInitialize in class AbstractInitializableComponent
      Throws:
      ComponentInitializationException
    • 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
    • close

      public void close()
      Specified by:
      close in interface AutoCloseable
    • getIdPVersion

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