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());