You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by jd...@apache.org on 2008/10/12 12:34:11 UTC
svn commit: r703783 - in /geronimo/gshell/trunk:
gshell-application/src/main/java/org/apache/geronimo/gshell/application/
gshell-application/src/main/java/org/apache/geronimo/gshell/application/plugin/
gshell-wisdom/gshell-wisdom-bootstrap/ gshell-wisd...
Author: jdillon
Date: Sun Oct 12 03:34:10 2008
New Revision: 703783
URL: http://svn.apache.org/viewvc?rev=703783&view=rev
Log:
Caching the resolved classpath muck for app+plugins under ${gshell.home}/var, re-using the cache if its there to avoid re-resolving each time
Added:
geronimo/gshell/trunk/gshell-application/src/main/java/org/apache/geronimo/gshell/application/ClassPath.java (with props)
geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ClassPathImpl.java (with props)
Modified:
geronimo/gshell/trunk/gshell-application/src/main/java/org/apache/geronimo/gshell/application/Application.java
geronimo/gshell/trunk/gshell-application/src/main/java/org/apache/geronimo/gshell/application/plugin/Plugin.java
geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/pom.xml
geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ApplicationArtifactFilter.java
geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ApplicationImpl.java
geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ApplicationManagerImpl.java
geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/pom.xml
geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/plugin/PluginArtifactFilter.java
geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/plugin/PluginImpl.java
geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/plugin/PluginManagerImpl.java
Modified: geronimo/gshell/trunk/gshell-application/src/main/java/org/apache/geronimo/gshell/application/Application.java
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-application/src/main/java/org/apache/geronimo/gshell/application/Application.java?rev=703783&r1=703782&r2=703783&view=diff
==============================================================================
--- geronimo/gshell/trunk/gshell-application/src/main/java/org/apache/geronimo/gshell/application/Application.java (original)
+++ geronimo/gshell/trunk/gshell-application/src/main/java/org/apache/geronimo/gshell/application/Application.java Sun Oct 12 03:34:10 2008
@@ -19,14 +19,12 @@
package org.apache.geronimo.gshell.application;
+import org.apache.geronimo.gshell.command.Variables;
import org.apache.geronimo.gshell.io.IO;
import org.apache.geronimo.gshell.model.application.ApplicationModel;
-import org.apache.geronimo.gshell.model.common.Artifact;
-import org.apache.geronimo.gshell.command.Variables;
import java.io.File;
import java.net.InetAddress;
-import java.util.Set;
/**
* Encapsulates the context for an application.
@@ -43,7 +41,7 @@
ApplicationModel getModel();
- Set<Artifact> getArtifacts();
+ ClassPath getClassPath();
/**
* Returns the home directory of the shell.
Added: geronimo/gshell/trunk/gshell-application/src/main/java/org/apache/geronimo/gshell/application/ClassPath.java
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-application/src/main/java/org/apache/geronimo/gshell/application/ClassPath.java?rev=703783&view=auto
==============================================================================
--- geronimo/gshell/trunk/gshell-application/src/main/java/org/apache/geronimo/gshell/application/ClassPath.java (added)
+++ geronimo/gshell/trunk/gshell-application/src/main/java/org/apache/geronimo/gshell/application/ClassPath.java Sun Oct 12 03:34:10 2008
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.gshell.application;
+
+import org.apache.geronimo.gshell.model.common.Artifact;
+
+import java.net.URL;
+import java.util.Collection;
+
+/**
+ * Provides details about a classpath configuration.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface ClassPath
+{
+ Collection<URL> getUrls();
+
+ Collection<Artifact> getArtifacts();
+}
\ No newline at end of file
Propchange: geronimo/gshell/trunk/gshell-application/src/main/java/org/apache/geronimo/gshell/application/ClassPath.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/gshell/trunk/gshell-application/src/main/java/org/apache/geronimo/gshell/application/ClassPath.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: geronimo/gshell/trunk/gshell-application/src/main/java/org/apache/geronimo/gshell/application/ClassPath.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: geronimo/gshell/trunk/gshell-application/src/main/java/org/apache/geronimo/gshell/application/plugin/Plugin.java
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-application/src/main/java/org/apache/geronimo/gshell/application/plugin/Plugin.java?rev=703783&r1=703782&r2=703783&view=diff
==============================================================================
--- geronimo/gshell/trunk/gshell-application/src/main/java/org/apache/geronimo/gshell/application/plugin/Plugin.java (original)
+++ geronimo/gshell/trunk/gshell-application/src/main/java/org/apache/geronimo/gshell/application/plugin/Plugin.java Sun Oct 12 03:34:10 2008
@@ -19,10 +19,8 @@
package org.apache.geronimo.gshell.application.plugin;
+import org.apache.geronimo.gshell.application.ClassPath;
import org.apache.geronimo.gshell.model.application.PluginArtifact;
-import org.apache.geronimo.gshell.model.common.Artifact;
-
-import java.util.Set;
/**
* Plugin.
@@ -35,7 +33,7 @@
PluginArtifact getArtifact();
- Set<Artifact> getArtifacts();
+ ClassPath getClassPath();
/*
boolean isEnabled();
Modified: geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/pom.xml?rev=703783&r1=703782&r2=703783&view=diff
==============================================================================
--- geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/pom.xml (original)
+++ geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/pom.xml Sun Oct 12 03:34:10 2008
@@ -62,6 +62,11 @@
<groupId>org.apache.geronimo.gshell.support</groupId>
<artifactId>gshell-event</artifactId>
</dependency>
+
+ <dependency>
+ <groupId>org.apache.geronimo.gshell.support</groupId>
+ <artifactId>gshell-marshal</artifactId>
+ </dependency>
<dependency>
<groupId>org.apache.geronimo.gshell</groupId>
Modified: geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ApplicationArtifactFilter.java
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ApplicationArtifactFilter.java?rev=703783&r1=703782&r2=703783&view=diff
==============================================================================
--- geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ApplicationArtifactFilter.java (original)
+++ geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ApplicationArtifactFilter.java Sun Oct 12 03:34:10 2008
@@ -65,6 +65,7 @@
"gshell-interpolation",
"jcl104-over-slf4j",
"gshell-terminal",
+ "gshell-marshal",
"jline",
"log4j",
"maven-artifact",
Modified: geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ApplicationImpl.java
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ApplicationImpl.java?rev=703783&r1=703782&r2=703783&view=diff
==============================================================================
--- geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ApplicationImpl.java (original)
+++ geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ApplicationImpl.java Sun Oct 12 03:34:10 2008
@@ -21,18 +21,16 @@
import org.apache.geronimo.gshell.application.Application;
import org.apache.geronimo.gshell.application.ApplicationConfiguration;
+import org.apache.geronimo.gshell.application.ClassPath;
import org.apache.geronimo.gshell.command.Variables;
import org.apache.geronimo.gshell.io.IO;
import org.apache.geronimo.gshell.model.application.ApplicationModel;
-import org.apache.geronimo.gshell.model.common.Artifact;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
-import java.util.LinkedHashSet;
-import java.util.Set;
/**
* Event fired once the application has constructed a shell.
@@ -46,7 +44,7 @@
private final ApplicationConfiguration config;
- private Set<Artifact> artifacts;
+ private ClassPath classPath;
private InetAddress localHost;
@@ -72,33 +70,17 @@
return config.getVariables();
}
- public Set<Artifact> getArtifacts() {
- if (artifacts == null) {
- throw new IllegalStateException("Artifacts not initialized");
+ public ClassPath getClassPath() {
+ if (classPath == null) {
+ throw new IllegalStateException("Classpath not initialized");
}
- return artifacts;
+ return classPath;
}
- void initArtifacts(final Set<org.apache.maven.artifact.Artifact> artifacts) {
- assert artifacts != null;
+ void initClassPath(final ClassPath classPath) {
+ assert classPath != null;
- Set<Artifact> set = new LinkedHashSet<Artifact>();
-
- log.debug("Application artifacts:");
-
- for (org.apache.maven.artifact.Artifact source : artifacts) {
- Artifact artifact = new Artifact();
- artifact.setGroupId(source.getGroupId());
- artifact.setArtifactId(source.getArtifactId());
- artifact.setType(source.getType());
- artifact.setVersion(source.getVersion());
-
- log.debug(" {}", artifact.getId());
-
- set.add(artifact);
- }
-
- this.artifacts = set;
+ this.classPath = classPath;
}
public ApplicationModel getModel() {
Modified: geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ApplicationManagerImpl.java
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ApplicationManagerImpl.java?rev=703783&r1=703782&r2=703783&view=diff
==============================================================================
--- geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ApplicationManagerImpl.java (original)
+++ geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ApplicationManagerImpl.java Sun Oct 12 03:34:10 2008
@@ -23,10 +23,14 @@
import org.apache.geronimo.gshell.application.ApplicationConfiguration;
import org.apache.geronimo.gshell.application.ApplicationManager;
import org.apache.geronimo.gshell.application.ApplicationSecurityManager;
+import org.apache.geronimo.gshell.application.ClassPath;
import org.apache.geronimo.gshell.application.plugin.PluginManager;
import org.apache.geronimo.gshell.application.settings.SettingsManager;
import org.apache.geronimo.gshell.artifact.ArtifactManager;
+import org.apache.geronimo.gshell.chronos.StopWatch;
import org.apache.geronimo.gshell.event.EventPublisher;
+import org.apache.geronimo.gshell.marshal.MarshallerSupport;
+import org.apache.geronimo.gshell.marshal.Marshaller;
import org.apache.geronimo.gshell.model.application.ApplicationModel;
import org.apache.geronimo.gshell.model.application.DependencyArtifact;
import org.apache.geronimo.gshell.model.common.LocalRepository;
@@ -37,7 +41,6 @@
import org.apache.geronimo.gshell.shell.Shell;
import org.apache.geronimo.gshell.spring.BeanContainer;
import org.apache.geronimo.gshell.spring.BeanContainerAware;
-import org.apache.geronimo.gshell.chronos.StopWatch;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
@@ -52,11 +55,10 @@
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
-import java.net.URL;
import java.util.LinkedHashSet;
-import java.util.LinkedList;
import java.util.List;
import java.util.Set;
+import java.net.URL;
/**
* Default implementation of the {@link ApplicationManager} component.
@@ -169,20 +171,15 @@
StopWatch watch = new StopWatch(true);
ApplicationImpl app = new ApplicationImpl(config);
-
ApplicationModel model = app.getModel();
log.debug("Loading application: {}", app.getId());
log.trace("Application model: {}", model);
- Set<Artifact> artifacts = resolveArtifacts(model);
+ ClassPath classPath = loadClassPath(model);
+ app.initClassPath(classPath);
- // Initialize the applications artifact configuration
- app.initArtifacts(artifacts);
-
- List<URL> classPath = createClassPath(artifacts);
-
- BeanContainer child = container.createChild("gshell.application(" + model.getId() + ")", classPath);
+ BeanContainer child = container.createChild("gshell.application(" + model.getId() + ")", classPath.getUrls());
log.debug("Application container: {}", child);
child.loadBeans(new String[] {
@@ -196,6 +193,36 @@
return app;
}
+ private ClassPath loadClassPath(final ApplicationModel model) throws Exception {
+ assert model != null;
+
+ Marshaller<ClassPath> marshaller = new MarshallerSupport<ClassPath>(ClassPathImpl.class);
+ File file = new File(new File(System.getProperty("gshell.home")), "var/gshell/classpath.xml"); // FIXME: Get state directory from application/branding
+ ClassPath classPath;
+
+ if (file.exists()) {
+ classPath = marshaller.unmarshal(file);
+ log.debug("Loaded classpath from cache: {}", file);
+ }
+ else {
+ Set<Artifact> artifacts = resolveArtifacts(model);
+ classPath = new ClassPathImpl(artifacts);
+ log.debug("Saving classpath to cache: {}", file);
+ file.getParentFile().mkdirs();
+ marshaller.marshal(classPath, file);
+ }
+
+ if (log.isDebugEnabled()) {
+ log.debug("Application classpath:");
+
+ for (URL url : classPath.getUrls()) {
+ log.debug(" {}", url);
+ }
+ }
+
+ return classPath;
+ }
+
private Set<Artifact> resolveArtifacts(final ApplicationModel model) throws Exception {
assert model != null;
@@ -230,28 +257,6 @@
return result.getArtifacts();
}
- private List<URL> createClassPath(final Set<Artifact> artifacts) throws Exception {
- assert artifacts != null;
-
- List<URL> classPath = new LinkedList<URL>();
-
- if (!artifacts.isEmpty()) {
- log.debug("Application classpath:");
-
- for (Artifact artifact : artifacts) {
- File file = artifact.getFile();
- assert file != null;
-
- URL url = file.toURI().toURL();
- log.debug(" {}", url);
-
- classPath.add(url);
- }
- }
-
- return classPath;
- }
-
//
// ShellFactory
//
Added: geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ClassPathImpl.java
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ClassPathImpl.java?rev=703783&view=auto
==============================================================================
--- geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ClassPathImpl.java (added)
+++ geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ClassPathImpl.java Sun Oct 12 03:34:10 2008
@@ -0,0 +1,93 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.geronimo.gshell.wisdom.application;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import org.apache.geronimo.gshell.application.ClassPath;
+import org.apache.geronimo.gshell.model.common.Artifact;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+/**
+ * {@link ClassPath} implementation backed up by a set of Maven artifacts.
+ *
+ * @version $Rev$ $Date$
+ */
+@XStreamAlias("classpath")
+public class ClassPathImpl
+ implements ClassPath
+{
+ private Collection<URL> urls;
+
+ private Collection<Artifact> artifacts;
+
+ public ClassPathImpl() {}
+
+ public ClassPathImpl(final Set<org.apache.maven.artifact.Artifact> artifacts) {
+ assert artifacts != null;
+
+ this.artifacts = new LinkedHashSet<Artifact>();
+ this.urls = new LinkedHashSet<URL>();
+
+ for (org.apache.maven.artifact.Artifact source : artifacts) {
+ Artifact artifact = new Artifact();
+ artifact.setGroupId(source.getGroupId());
+ artifact.setArtifactId(source.getArtifactId());
+ artifact.setType(source.getType());
+ artifact.setVersion(source.getVersion());
+
+ try {
+ File file = source.getFile();
+ if (file == null) {
+ throw new IllegalStateException("Artifact missing resolved local-file: " + source);
+ }
+
+ //
+ // TODO: Need to make this handle when ${gshell.home} is moved, so we can still re-use the cache.
+ // Also need to, when unmarshalling, validate that the files still exist and invalidate if not
+ //
+
+ URL url = file.toURI().toURL();
+ this.urls.add(url);
+ }
+ catch (MalformedURLException e) {
+ throw new RuntimeException(e);
+ }
+
+ this.artifacts.add(artifact);
+ }
+ }
+
+ public Collection<URL> getUrls() {
+ assert urls != null;
+ return Collections.unmodifiableCollection(urls);
+ }
+
+ public Collection<Artifact> getArtifacts() {
+ assert artifacts != null;
+ return Collections.unmodifiableCollection(artifacts);
+ }
+}
\ No newline at end of file
Propchange: geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ClassPathImpl.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ClassPathImpl.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Propchange: geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-bootstrap/src/main/java/org/apache/geronimo/gshell/wisdom/application/ClassPathImpl.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/pom.xml
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/pom.xml?rev=703783&r1=703782&r2=703783&view=diff
==============================================================================
--- geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/pom.xml (original)
+++ geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/pom.xml Sun Oct 12 03:34:10 2008
@@ -72,6 +72,11 @@
<groupId>org.apache.geronimo.gshell.support</groupId>
<artifactId>gshell-vfs-meta</artifactId>
</dependency>
+
+ <dependency>
+ <groupId>org.apache.geronimo.gshell.support</groupId>
+ <artifactId>gshell-xstore</artifactId>
+ </dependency>
<dependency>
<groupId>org.apache.geronimo.gshell</groupId>
Modified: geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/plugin/PluginArtifactFilter.java
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/plugin/PluginArtifactFilter.java?rev=703783&r1=703782&r2=703783&view=diff
==============================================================================
--- geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/plugin/PluginArtifactFilter.java (original)
+++ geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/plugin/PluginArtifactFilter.java Sun Oct 12 03:34:10 2008
@@ -50,7 +50,7 @@
// Filter out application artifacts, need to use gid:aid to make sure we don't clober anything which has the same artifactId, but different groupId
final Set<String> excludes = new HashSet<String>();
- for (org.apache.geronimo.gshell.model.common.Artifact a : application.getArtifacts()) {
+ for (org.apache.geronimo.gshell.model.common.Artifact a : application.getClassPath().getArtifacts()) {
String id = a.getGroupId() + ":" + a.getArtifactId();
excludes.add(id);
}
Modified: geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/plugin/PluginImpl.java
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/plugin/PluginImpl.java?rev=703783&r1=703782&r2=703783&view=diff
==============================================================================
--- geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/plugin/PluginImpl.java (original)
+++ geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/plugin/PluginImpl.java Sun Oct 12 03:34:10 2008
@@ -20,6 +20,9 @@
package org.apache.geronimo.gshell.wisdom.plugin;
import org.apache.geronimo.gshell.application.plugin.Plugin;
+import org.apache.geronimo.gshell.application.Application;
+import org.apache.geronimo.gshell.application.ClassPath;
+import org.apache.geronimo.gshell.model.application.PluginArtifact;
import org.apache.geronimo.gshell.spring.BeanContainer;
import org.apache.geronimo.gshell.spring.BeanContainerAware;
import org.apache.geronimo.gshell.wisdom.plugin.activation.ActivationContext;
@@ -28,8 +31,6 @@
import org.apache.geronimo.gshell.wisdom.plugin.bundle.Bundle;
import org.apache.geronimo.gshell.wisdom.plugin.bundle.CommandBundle;
import org.apache.geronimo.gshell.wisdom.plugin.bundle.NoSuchBundleException;
-import org.apache.geronimo.gshell.model.common.Artifact;
-import org.apache.geronimo.gshell.model.application.PluginArtifact;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -37,8 +38,6 @@
import java.util.Collections;
import java.util.List;
import java.util.Map;
-import java.util.Set;
-import java.util.LinkedHashSet;
/**
* Default implementation of {@link Plugin}.
@@ -58,7 +57,7 @@
private PluginArtifact artifact;
- private Set<Artifact> artifacts;
+ private ClassPath classPath;
private List<String> bundleNames;
@@ -95,35 +94,19 @@
this.artifact = artifact;
}
- public Set<Artifact> getArtifacts() {
- if (artifacts == null) {
- throw new IllegalStateException("Artifacts not initialized");
+ public ClassPath getClassPath() {
+ if (classPath == null) {
+ throw new IllegalStateException("Classpath not initialized");
}
- return artifacts;
+ return classPath;
}
- void initArtifacts(final Set<org.apache.maven.artifact.Artifact> artifacts) {
- assert artifacts != null;
-
- Set<Artifact> set = new LinkedHashSet<Artifact>();
-
- log.debug("Plugin artifacts:");
-
- for (org.apache.maven.artifact.Artifact source : artifacts) {
- Artifact artifact = new Artifact();
- artifact.setGroupId(source.getGroupId());
- artifact.setArtifactId(source.getArtifactId());
- artifact.setType(source.getType());
- artifact.setVersion(source.getVersion());
+ void initClassPath(final ClassPath classPath) {
+ assert classPath != null;
- log.debug(" {}", artifact.getId());
-
- set.add(artifact);
- }
-
- this.artifacts = set;
+ this.classPath = classPath;
}
-
+
public List<String> getBundleNames() {
List<String> list = bundleNames;
Modified: geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/plugin/PluginManagerImpl.java
URL: http://svn.apache.org/viewvc/geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/plugin/PluginManagerImpl.java?rev=703783&r1=703782&r2=703783&view=diff
==============================================================================
--- geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/plugin/PluginManagerImpl.java (original)
+++ geronimo/gshell/trunk/gshell-wisdom/gshell-wisdom-core/src/main/java/org/apache/geronimo/gshell/wisdom/plugin/PluginManagerImpl.java Sun Oct 12 03:34:10 2008
@@ -21,18 +21,22 @@
import org.apache.geronimo.gshell.application.Application;
import org.apache.geronimo.gshell.application.ApplicationManager;
+import org.apache.geronimo.gshell.application.ClassPath;
import org.apache.geronimo.gshell.application.plugin.Plugin;
import org.apache.geronimo.gshell.application.plugin.PluginManager;
import org.apache.geronimo.gshell.artifact.ArtifactManager;
+import org.apache.geronimo.gshell.chronos.StopWatch;
import org.apache.geronimo.gshell.event.Event;
import org.apache.geronimo.gshell.event.EventListener;
import org.apache.geronimo.gshell.event.EventManager;
import org.apache.geronimo.gshell.event.EventPublisher;
+import org.apache.geronimo.gshell.marshal.MarshallerSupport;
+import org.apache.geronimo.gshell.marshal.Marshaller;
import org.apache.geronimo.gshell.model.application.PluginArtifact;
import org.apache.geronimo.gshell.spring.BeanContainer;
import org.apache.geronimo.gshell.spring.BeanContainerAware;
import org.apache.geronimo.gshell.wisdom.application.ApplicationConfiguredEvent;
-import org.apache.geronimo.gshell.chronos.StopWatch;
+import org.apache.geronimo.gshell.wisdom.application.ClassPathImpl;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
@@ -43,11 +47,10 @@
import javax.annotation.PostConstruct;
import java.io.File;
-import java.net.URL;
import java.util.LinkedHashSet;
-import java.util.LinkedList;
import java.util.List;
import java.util.Set;
+import java.net.URL;
/**
* Default implementation of the {@link PluginManager} component.
@@ -126,10 +129,9 @@
log.debug("Loading plugin: {}", artifact.getId());
- Set<Artifact> artifacts = resolveArtifacts(application, artifact);
- List<URL> classPath = createClassPath(artifacts);
-
- BeanContainer pluginContainer = container.createChild("gshell.plugin(" + artifact.getId() + ")", classPath);
+ ClassPath classPath = loadClassPath(application, artifact);
+
+ BeanContainer pluginContainer = container.createChild("gshell.plugin(" + artifact.getId() + ")", classPath.getUrls());
log.debug("Created plugin container: {}", pluginContainer);
pluginContainer.loadBeans(new String[] {
@@ -140,7 +142,7 @@
// Initialize the plugins artifact configuration
plugin.initArtifact(artifact);
- plugin.initArtifacts(artifacts);
+ plugin.initClassPath(classPath);
plugins.add(plugin);
@@ -153,6 +155,37 @@
eventPublisher.publish(new PluginLoadedEvent(plugin, artifact));
}
+ private ClassPath loadClassPath(final Application application, final PluginArtifact artifact) throws Exception {
+ assert application != null;
+ assert artifact != null;
+
+ Marshaller<ClassPath> marshaller = new MarshallerSupport<ClassPath>(ClassPathImpl.class);
+ File file = new File(new File(System.getProperty("gshell.home")), "var/gshell/" + artifact.getGroupId() + "/" + artifact.getArtifactId() + "/classpath.xml"); // FIXME: Get state directory from application/branding
+ ClassPath classPath;
+
+ if (file.exists()) {
+ classPath = marshaller.unmarshal(file);
+ log.debug("Loaded classpath from cache: {}", file);
+ }
+ else {
+ Set<Artifact> artifacts = resolveArtifacts(application, artifact);
+ classPath = new ClassPathImpl(artifacts);
+ log.debug("Saving classpath to cache: {}", file);
+ file.getParentFile().mkdirs();
+ marshaller.marshal(classPath, file);
+ }
+
+ if (log.isDebugEnabled()) {
+ log.debug("Plugin classpath:");
+
+ for (URL url : classPath.getUrls()) {
+ log.debug(" {}", url);
+ }
+ }
+
+ return classPath;
+ }
+
public void loadPlugin(final PluginArtifact artifact) throws Exception {
assert applicationManager != null;
loadPlugin(applicationManager.getApplication(), artifact);
@@ -184,26 +217,4 @@
return result.getArtifacts();
}
-
- private List<URL> createClassPath(final Set<Artifact> artifacts) throws Exception {
- assert artifacts != null;
-
- List<URL> classPath = new LinkedList<URL>();
-
- if (!artifacts.isEmpty()) {
- log.debug("Plugin classpath:");
-
- for (Artifact a : artifacts) {
- File file = a.getFile();
- assert file != null;
-
- URL url = file.toURI().toURL();
- log.debug(" {}", url);
-
- classPath.add(url);
- }
- }
-
- return classPath;
- }
}
\ No newline at end of file