On Sep 26, 2008, at 7:55 AM, Lin Sun wrote:

David, thanks for adding this to keep track of what plugins have been
installed on the server.

I think there is a prob with the change.  In InstallModulesMojo.java,
as it set installedPluginsList as null.  I think this would cause all
the plugins that came with the server assembly during build time
(using c-m-p) not recorded, as saveHistory and loadHistory only handle
cases when installedPluginList is not null.

I agree.


Also, in PluginInstallerGBean.java, I don't see anywhere you specify
where we set the default location of the installedPluginsList file to
"var/config/installedPlugins.properties"...  I only see that in the
two test files.

I forgot to configure this in the plan.

thanks for noticing these problems!
david jencks



Lin

On Fri, Sep 26, 2008 at 3:26 AM,  <[EMAIL PROTECTED]> wrote:
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());




Reply via email to