You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dj...@apache.org on 2008/09/26 09:26:54 UTC

svn commit: r699202 - in /geronimo/server/trunk: buildsupport/car-maven-plugin/src/main/java/org/apache/geronimo/mavenplugins/car/ framework/modules/geronimo-deploy-jsr88/src/main/java/org/apache/geronimo/deployment/plugin/jmx/ framework/modules/geroni...

Author: djencks
Date: Fri Sep 26 00:26:53 2008
New Revision: 699202

URL: http://svn.apache.org/viewvc?rev=699202&view=rev
Log:
GERONIMO-4318 try to indicate when plugins have been installed in the current server, irrespective of whether they are in the repos

Modified:
    geronimo/server/trunk/buildsupport/car-maven-plugin/src/main/java/org/apache/geronimo/mavenplugins/car/InstallModulesMojo.java
    geronimo/server/trunk/framework/modules/geronimo-deploy-jsr88/src/main/java/org/apache/geronimo/deployment/plugin/jmx/RemoteDeploymentManager.java
    geronimo/server/trunk/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/PluginInstaller.java
    geronimo/server/trunk/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/PluginInstallerGBean.java
    geronimo/server/trunk/framework/modules/geronimo-plugin/src/test/java/org/apache/geronimo/system/plugin/CopyFileTest.java
    geronimo/server/trunk/framework/modules/geronimo-plugin/src/test/java/org/apache/geronimo/system/plugin/PluginInstallerTest.java
    geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/AbstractListHandler.java
    geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/ViewPluginDownloadHandler.java

Modified: geronimo/server/trunk/buildsupport/car-maven-plugin/src/main/java/org/apache/geronimo/mavenplugins/car/InstallModulesMojo.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/buildsupport/car-maven-plugin/src/main/java/org/apache/geronimo/mavenplugins/car/InstallModulesMojo.java?rev=699202&r1=699201&r2=699202&view=diff
==============================================================================
--- geronimo/server/trunk/buildsupport/car-maven-plugin/src/main/java/org/apache/geronimo/mavenplugins/car/InstallModulesMojo.java (original)
+++ geronimo/server/trunk/buildsupport/car-maven-plugin/src/main/java/org/apache/geronimo/mavenplugins/car/InstallModulesMojo.java Fri Sep 26 00:26:53 2008
@@ -162,7 +162,7 @@
         Kernel kernel = new BasicKernel("Assembly");
         PluginRepositoryList pluginRepoList = new PluginRepositoryDownloader(Collections.singletonMap(localRepo, (String[]) null), true);
         try {
-            PluginInstallerGBean installer = new PluginInstallerGBean(targetRepositoryPath, targetServerPath, servers, pluginRepoList, kernel, getClass().getClassLoader());
+            PluginInstallerGBean installer = new PluginInstallerGBean(targetRepositoryPath, targetServerPath, null, servers, pluginRepoList, kernel, getClass().getClassLoader());
             installer.install(pluginList, sourceRepo, true, null, null, downloadPoller);
             if (overrides != null) {
                 for (Override override: this.overrides) {

Modified: geronimo/server/trunk/framework/modules/geronimo-deploy-jsr88/src/main/java/org/apache/geronimo/deployment/plugin/jmx/RemoteDeploymentManager.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-deploy-jsr88/src/main/java/org/apache/geronimo/deployment/plugin/jmx/RemoteDeploymentManager.java?rev=699202&r1=699201&r2=699202&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-deploy-jsr88/src/main/java/org/apache/geronimo/deployment/plugin/jmx/RemoteDeploymentManager.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-deploy-jsr88/src/main/java/org/apache/geronimo/deployment/plugin/jmx/RemoteDeploymentManager.java Fri Sep 26 00:26:53 2008
@@ -189,10 +189,10 @@
         }
     }
     
-    public void validatePlugin(PluginType plugin) throws MissingDependencyException {
+    public boolean validatePlugin(PluginType plugin) throws MissingDependencyException {
         PluginInstaller installer = getPluginInstaller();
         try {
-            installer.validatePlugin(plugin);
+            return installer.validatePlugin(plugin);
         } finally {
             kernel.getProxyManager().destroyProxy(installer);
         }

Modified: geronimo/server/trunk/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/PluginInstaller.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/PluginInstaller.java?rev=699202&r1=699201&r2=699202&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/PluginInstaller.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/PluginInstaller.java Fri Sep 26 00:26:53 2008
@@ -21,12 +21,14 @@
 import java.net.URL;
 import java.util.Map;
 import javax.security.auth.login.FailedLoginException;
-import org.apache.geronimo.kernel.repository.Artifact;
-import org.apache.geronimo.kernel.repository.Dependency;
-import org.apache.geronimo.kernel.repository.MissingDependencyException;
+
+import org.apache.geronimo.kernel.config.ConfigurationAlreadyExistsException;
 import org.apache.geronimo.kernel.config.ConfigurationManager;
 import org.apache.geronimo.kernel.config.NoSuchStoreException;
 import org.apache.geronimo.kernel.InvalidGBeanException;
+import org.apache.geronimo.kernel.repository.Artifact;
+import org.apache.geronimo.kernel.repository.Dependency;
+import org.apache.geronimo.kernel.repository.MissingDependencyException;
 import org.apache.geronimo.system.plugin.model.PluginListType;
 import org.apache.geronimo.system.plugin.model.PluginType;
 import org.apache.geronimo.system.plugin.model.AttributesType;
@@ -52,7 +54,7 @@
      * @return A Map with key type String (plugin name) and value type Artifact
      *         (config ID of the plugin).
      */
-    public Map getInstalledPlugins();
+    public Map<String, Artifact> getInstalledPlugins();
 
     /**
      * Gets a CofigurationMetadata for a configuration installed in the local
@@ -185,7 +187,7 @@
      * @throws org.apache.geronimo.kernel.repository.MissingDependencyException
      *          if a dependency is not satisfied
      */
-    public void validatePlugin(PluginType plugin) throws MissingDependencyException;
+    public boolean validatePlugin(PluginType plugin) throws MissingDependencyException;
 
     /**
      * Ensures that a plugin's prerequisites are installed

Modified: geronimo/server/trunk/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/PluginInstallerGBean.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/PluginInstallerGBean.java?rev=699202&r1=699201&r2=699202&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/PluginInstallerGBean.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-plugin/src/main/java/org/apache/geronimo/system/plugin/PluginInstallerGBean.java Fri Sep 26 00:26:53 2008
@@ -21,6 +21,8 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.FileInputStream;
+import java.io.OutputStream;
 import java.net.URI;
 import java.net.URL;
 import java.util.ArrayList;
@@ -54,6 +56,7 @@
 import org.apache.geronimo.gbean.ReferenceCollectionEvent;
 import org.apache.geronimo.gbean.ReferenceCollectionListener;
 import org.apache.geronimo.gbean.annotation.GBean;
+import org.apache.geronimo.gbean.annotation.ParamAttribute;
 import org.apache.geronimo.gbean.annotation.ParamReference;
 import org.apache.geronimo.gbean.annotation.ParamSpecial;
 import org.apache.geronimo.gbean.annotation.SpecialAttributeType;
@@ -68,6 +71,7 @@
 import org.apache.geronimo.kernel.config.NoSuchConfigException;
 import org.apache.geronimo.kernel.config.NoSuchStoreException;
 import org.apache.geronimo.kernel.config.PersistentConfigurationList;
+import org.apache.geronimo.kernel.config.ConfigurationAlreadyExistsException;
 import org.apache.geronimo.kernel.repository.Artifact;
 import org.apache.geronimo.kernel.repository.ArtifactManager;
 import org.apache.geronimo.kernel.repository.DefaultArtifactManager;
@@ -116,6 +120,9 @@
     private static final Logger log = LoggerFactory.getLogger(PluginInstallerGBean.class);
 
     private static int counter;
+    private final String installedPluginsList;
+    //all plugins that have ever been installed on this server.
+    private final Set<Artifact> installedArtifacts = new HashSet<Artifact>();
     private final ConfigurationManager configManager;
     private final GeronimoSourceRepository localSourceRepository;
     private final WritableListableRepository writeableRepo;
@@ -146,7 +153,8 @@
      * @param classLoader                  classLoader @throws IOException exception if server instance cannot be loaded
      * @throws java.io.IOException from bad ServerInstance
      */
-    public PluginInstallerGBean(@ParamReference(name = "ConfigManager", namingType = "ConfigurationManager")ConfigurationManager configManager,
+    public PluginInstallerGBean(@ParamAttribute(name = "installedPluginsList")String installedPluginsList,
+                                @ParamReference(name = "ConfigManager", namingType = "ConfigurationManager")ConfigurationManager configManager,
                                 @ParamReference(name = "Repository", namingType = "Repository")WritableListableRepository repository,
                                 @ParamReference(name = "ConfigStore", namingType = "ConfigurationStore")ConfigurationStore configStore,
                                 @ParamReference(name = "ServerInstances", namingType = "ServerInstanceData")Collection<ServerInstanceData> serverInstanceDatas,
@@ -171,6 +179,8 @@
         localSourceRepository = new GeronimoSourceRepository(configManager.getRepositories(), configManager.getArtifactResolver());
         setUpServerInstances(serverInstanceDatas, serverInfo, artifactManager, servers, writeableRepo, true);
         this.pluginRepositoryList = pluginRepositoryList;
+        this.installedPluginsList = installedPluginsList;
+        loadHistory();
     }
 
     /**
@@ -178,6 +188,7 @@
      *
      * @param targetRepositoryPath location of repo to install into (not in current server)
      * @param targetServerPath     location of server to install into (not current server
+     * @param installedPluginsList location of file to track installations
      * @param serverInstanceDatas  set of server layouts
      * @param pluginRepositoryList
      * @param kernel               kernel for current server
@@ -185,6 +196,7 @@
      */
     public PluginInstallerGBean(String targetRepositoryPath,
                                 String targetServerPath,
+                                String installedPluginsList,
                                 Collection<? extends ServerInstanceData> serverInstanceDatas,
                                 PluginRepositoryList pluginRepositoryList,
                                 final Kernel kernel,
@@ -206,6 +218,8 @@
         this.configManager = buildConfigurationManager(artifactManager, writeableRepo, kernel, configStore, classLoader, servers);
         localSourceRepository = new GeronimoSourceRepository(configManager.getRepositories(), configManager.getArtifactResolver());
         this.pluginRepositoryList = pluginRepositoryList;
+        this.installedPluginsList = installedPluginsList;
+        loadHistory();
     }
 
     private static void setUpServerInstances(Collection<? extends ServerInstanceData> serverInstanceDatas,
@@ -290,7 +304,7 @@
     PluginInstallerGBean(ConfigurationManager configManager,
                          WritableListableRepository repository,
                          ConfigurationStore configStore,
-                         ServerInfo serverInfo,
+                         String installedPluginsList, ServerInfo serverInfo,
                          ThreadPool threadPool,
                          Collection<ServerInstance> servers, PluginRepositoryList pluginRepositoryList) {
         this.configManager = configManager;
@@ -321,6 +335,53 @@
             });
         }
         this.pluginRepositoryList = pluginRepositoryList;
+        this.installedPluginsList = installedPluginsList;
+        loadHistory();
+    }
+
+    private void loadHistory() {
+        if (installedPluginsList != null) {
+            File historyFile = serverInfo.resolveServer(installedPluginsList);
+            Properties properties = new Properties();
+            try {
+                InputStream in = new FileInputStream(historyFile);
+                try {
+                    properties.load(in);
+                    for (Object key : properties.keySet()) {
+                        Artifact artifact = Artifact.create((String) key);
+                        installedArtifacts.add(artifact);
+                    }
+                } finally {
+                    in.close();
+                }
+            } catch (IOException e) {
+                //give up
+            }
+        }
+    }
+
+    private void saveHistory() {
+        if (installedPluginsList != null) {
+            Properties properties = new Properties();
+            for (Artifact artifact : installedArtifacts) {
+                properties.put(artifact.toString(), null);
+            }
+            try {
+                File historyFile = serverInfo.resolveServer(installedPluginsList);
+                File parentFile = historyFile.getParentFile();
+                if (!parentFile.exists()) {
+                    FileUtils.forceMkdir(parentFile);
+                }
+                OutputStream out = new FileOutputStream(historyFile);
+                try {
+                    properties.save(out, "All the plugins that have ever been installed on this server");
+                } finally {
+                    out.close();
+                }
+            } catch (IOException e) {
+                //give up
+            }
+        }
     }
 
     /**
@@ -346,6 +407,7 @@
             PluginInstallerGBean installer = new PluginInstallerGBean(
                     targetRepositoryPath,
                     targetServerPathName,
+                    installedPluginsList,
                     serverInstanceDatas,
                     pluginRepositoryList, kernel,
                     classLoader);
@@ -381,7 +443,7 @@
      * @return A Map with key type String (plugin name) and value type Artifact
      *         (config ID of the plugin).
      */
-    public Map getInstalledPlugins() {
+    public Map<String, Artifact> getInstalledPlugins() {
         SortedSet<Artifact> artifacts = writeableRepo.list();
 
         Map<String, Artifact> plugins = new HashMap<String, Artifact>();
@@ -416,7 +478,7 @@
                         jar.close();
                     }
                 } catch (IOException e) {
-                    log.error("Unable to read JAR file " + dir.getAbsolutePath(), e);
+                    log.error("Unable to read JAR file {}", dir.getAbsolutePath(), e);
                 }
             }
         }
@@ -622,7 +684,9 @@
             for (PluginType metadata : pluginsToInstall.getPlugin()) {
                 try {
                     if (validatePlugins) {
-                        validatePlugin(metadata);
+                        if (!validatePlugin(metadata)) {
+                            throw new MissingDependencyException("Already installed", toArtifact(metadata.getPluginArtifact().get(0).getModuleId()), (Stack<Artifact>)null);
+                        }
                         verifyPrerequisites(metadata);
                     }
 
@@ -717,6 +781,7 @@
         } finally {
             poller.setFinished();
         }
+        saveHistory();
     }
 
     private List<SourceRepository> getRepos(PluginListType pluginsToInstall, SourceRepository defaultRepository, boolean restrictToDefaultRepository, PluginArtifactType instance) {
@@ -865,7 +930,11 @@
             }
 
             // 2. Validate that we can install this
-            validatePlugin(data);
+            if (!validatePlugin(data)) {
+                //already installed
+                return;
+            }
+
             verifyPrerequisites(data);
 
             PluginArtifactType instance = data.getPluginArtifact().get(0);
@@ -899,10 +968,11 @@
      * Ensures that a plugin is installable.
      *
      * @param plugin plugin to check
+     * @return true if the plugin is not installed
      * @throws org.apache.geronimo.kernel.repository.MissingDependencyException
      *          if plugin requires a dependency that is not present
      */
-    public void validatePlugin(PluginType plugin) throws MissingDependencyException {
+    public boolean validatePlugin(PluginType plugin) throws MissingDependencyException {
         if (plugin.getPluginArtifact().size() != 1) {
             throw new MissingDependencyException("A plugin configuration must include one plugin artifact, not " + plugin.getPluginArtifact().size(), null, (Stack<Artifact>) null);
         }
@@ -919,11 +989,9 @@
                         break;
                     }
                 }
-                if (!upgrade) {
+                if (!upgrade && installedArtifacts.contains(artifact)) {
                     log.debug("Configuration {} is already installed", artifact);
-//                    throw new MissingDependencyException(
-//                            "Configuration " + artifact + " is already installed.", toArtifact(metadata.getModuleId()), (Stack<Artifact>) null);
-                }
+                    return false;                }
             }
         }
 
@@ -938,6 +1006,7 @@
             throw new MissingDependencyException(
                     "Plugin is not installable on JVM " + System.getProperty("java.version"), toArtifact(metadata.getModuleId()), (Stack<Artifact>) null);
         }
+        return true;
     }
 
 
@@ -1090,7 +1159,10 @@
                     throw (IOException) new IOException("Unable to read plugin metadata: " + e.getMessage()).initCause(e);
                 }
                 if (pluginData != null) { // it's a plugin, not a plain JAR
-                    validatePlugin(pluginData);
+                    if (!validatePlugin(pluginData)) {
+                        monitor.getResults().addSkippedConfigID(new MissingDependencyException("already installed", configID, (Stack<Artifact>)null));
+                        return;
+                    }
                     instance = pluginData.getPluginArtifact().get(0);
                 }
                 monitor.getResults().setCurrentMessage("Copying " + result.getArtifact() + " to the repository");
@@ -1170,8 +1242,9 @@
             throw new IllegalStateException("Installed configuration into repository but ConfigStore cannot load it: " + e.getMessage(), e);
         }
         // Copy any files out of the artifact
-        for (ServerInstance serverInstance: servers.values()) {
+        for (ServerInstance serverInstance : servers.values()) {
             if (serverInstance.getAttributeStore().isModuleInstalled(configID)) {
+                installedArtifacts.add(configID);
                 return;
             }
         }
@@ -1182,6 +1255,7 @@
             }
         }
         if (instance != null) {
+            installedArtifacts.add(configID);
             try {
                 installConfigXMLData(configID, instance, servers, loadOverride);
             } catch (InvalidGBeanException e) {

Modified: geronimo/server/trunk/framework/modules/geronimo-plugin/src/test/java/org/apache/geronimo/system/plugin/CopyFileTest.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-plugin/src/test/java/org/apache/geronimo/system/plugin/CopyFileTest.java?rev=699202&r1=699201&r2=699202&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-plugin/src/test/java/org/apache/geronimo/system/plugin/CopyFileTest.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-plugin/src/test/java/org/apache/geronimo/system/plugin/CopyFileTest.java Fri Sep 26 00:26:53 2008
@@ -47,6 +47,7 @@
     private ConfigurationStore configStore;
     private PluginInstallerGBean installer;
     private Artifact artifact = new Artifact("test", "module", "1.0", "car");
+    private String installedPluginsList = "var/config/installedPlugins.properties";
 
     protected void setUp() throws Exception {
         super.setUp();
@@ -72,7 +73,7 @@
         installer = new PluginInstallerGBean(new MockConfigurationManager(),
                 repo,
                 configStore,
-                serverInfo,
+                installedPluginsList, serverInfo,
                 new ThreadPool() {
             public int getPoolSize() {
                 return 0;

Modified: geronimo/server/trunk/framework/modules/geronimo-plugin/src/test/java/org/apache/geronimo/system/plugin/PluginInstallerTest.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/framework/modules/geronimo-plugin/src/test/java/org/apache/geronimo/system/plugin/PluginInstallerTest.java?rev=699202&r1=699201&r2=699202&view=diff
==============================================================================
--- geronimo/server/trunk/framework/modules/geronimo-plugin/src/test/java/org/apache/geronimo/system/plugin/PluginInstallerTest.java (original)
+++ geronimo/server/trunk/framework/modules/geronimo-plugin/src/test/java/org/apache/geronimo/system/plugin/PluginInstallerTest.java Fri Sep 26 00:26:53 2008
@@ -41,7 +41,8 @@
     private String fakeRepo;
     private String testRepo;
     private PluginInstaller installer;
-
+    private String installedPluginsList = "var/config/installedPlugins.properties";
+ 
     protected void setUp() throws Exception {
         super.setUp();
         fakeRepo = "http://nowhere.com/";
@@ -50,7 +51,7 @@
         testRepo = url.substring(0, pos);
         ServerInfo serverInfo = new BasicServerInfo(".");
         installer = new PluginInstallerGBean(new MockConfigurationManager(), new MockWritableListableRepository(), new MockConfigStore(),
-                serverInfo, new ThreadPool() {
+                installedPluginsList, serverInfo, new ThreadPool() {
             public int getPoolSize() {
                 return 0;
             }

Modified: geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/AbstractListHandler.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/AbstractListHandler.java?rev=699202&r1=699201&r2=699202&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/AbstractListHandler.java (original)
+++ geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/AbstractListHandler.java Fri Sep 26 00:26:53 2008
@@ -65,7 +65,7 @@
                     // determine if the plugin is installable
                     PluginType holder = PluginInstallerGBean.copy(metadata, artifact);
                     try {
-                        pluginInstaller.validatePlugin(holder);
+                        plugin.setInstallable(pluginInstaller.validatePlugin(holder));
                     } catch (Exception e) {
                         plugin.setInstallable(false);
                     }

Modified: geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/ViewPluginDownloadHandler.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/ViewPluginDownloadHandler.java?rev=699202&r1=699201&r2=699202&view=diff
==============================================================================
--- geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/ViewPluginDownloadHandler.java (original)
+++ geronimo/server/trunk/plugins/console/plugin-portlets/src/main/java/org/apache/geronimo/console/car/ViewPluginDownloadHandler.java Fri Sep 26 00:26:53 2008
@@ -89,7 +89,7 @@
             StringBuffer validationNotOk = new StringBuffer();
             PluginType holder = PluginInstallerGBean.copy(plugin.getPlugin(), plugin.getPluginArtifact());
             try {
-                pluginInstaller.validatePlugin(holder);
+                plugin.setInstallable(pluginInstaller.validatePlugin(holder));
             } catch (Exception e) {
                 plugin.setInstallable(false);
                 validationNotOk.append(e.getMessage());