You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jv...@apache.org on 2009/06/05 15:49:26 UTC
svn commit: r782014 - in /maven/components/trunk: ./
maven-core/src/main/java/org/apache/maven/
maven-core/src/main/java/org/apache/maven/execution/
maven-core/src/main/java/org/apache/maven/lifecycle/
maven-core/src/main/java/org/apache/maven/plugin/ ...
Author: jvanzyl
Date: Fri Jun 5 13:49:25 2009
New Revision: 782014
URL: http://svn.apache.org/viewvc?rev=782014&view=rev
Log:
MNG-4041: maven core returns stale project state during extended use. this is a patch which provides intelligent caching and yields a very substantial performance improvement.
Submitted by: Igor Fedorenko
Removed:
maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/ApplicationInformation.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/DefaultRuntimeInformation.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/RuntimeInformation.java
Modified:
maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultProjectDependenciesResolver.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginClassLoaderCache.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/InvalidPluginDescriptorException.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginDescriptorParsingException.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginManager.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultMavenProjectCache.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProjectCache.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultMavenMetadataCache.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataCache.java
maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
maven/components/trunk/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java
maven/components/trunk/maven-core/src/test/java/org/apache/maven/plugin/PluginManagerTest.java
maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java
maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/MavenEmbedderTest.java
maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/ModelUtils.java
maven/components/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java
maven/components/trunk/pom.xml
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java Fri Jun 5 13:49:25 2009
@@ -171,7 +171,7 @@
return result;
}
- protected Map<String,MavenProject> getProjects( MavenExecutionRequest request )
+ public Map<String,MavenProject> getProjects( MavenExecutionRequest request )
throws MavenExecutionException, ProjectBuildingException
{
// We have no POM file.
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultProjectDependenciesResolver.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultProjectDependenciesResolver.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultProjectDependenciesResolver.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultProjectDependenciesResolver.java Fri Jun 5 13:49:25 2009
@@ -54,7 +54,7 @@
ArtifactFilter filter;
- if ( exclusions != null )
+ if ( ! exclusions.isEmpty() )
{
filter = new AndArtifactFilter( Arrays.asList( new ArtifactFilter[]{ new ExcludesArtifactFilter( exclusions ), scopeFilter } ) );
}
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java Fri Jun 5 13:49:25 2009
@@ -47,6 +47,7 @@
import org.apache.maven.plugin.MojoNotFoundException;
import org.apache.maven.plugin.PluginDescriptorParsingException;
import org.apache.maven.plugin.PluginManager;
+import org.apache.maven.plugin.PluginManagerException;
import org.apache.maven.plugin.PluginNotFoundException;
import org.apache.maven.plugin.PluginResolutionException;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
@@ -221,7 +222,7 @@
// 4. Bind those mojos found in the lifecycle mapping for the packaging to the lifecycle
// 5. Bind mojos specified in the project itself to the lifecycle
public MavenExecutionPlan calculateExecutionPlan( MavenSession session, String... tasks )
- throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException
+ throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException, PluginManagerException
{
MavenProject project = session.getCurrentProject();
@@ -394,7 +395,13 @@
// org.apache.maven.plugins:maven-remote-resources-plugin:1.0:process
//
MojoDescriptor mojoDescriptor = pluginManager.getMojoDescriptor(
- mojoExecution.getGroupId(), mojoExecution.getArtifactId(), mojoExecution.getVersion(), mojoExecution.getGoal(), session.getLocalRepository(), project.getRemoteArtifactRepositories() );
+ mojoExecution.getGroupId(), mojoExecution.getArtifactId(), mojoExecution.getVersion(), mojoExecution.getGoal(), session.getLocalRepository(), project.getPluginArtifactRepositories() );
+
+ PluginDescriptor pluginDescriptor = mojoDescriptor.getPluginDescriptor();
+ if ( pluginDescriptor.getPlugin().isExtensions() )
+ {
+ pluginDescriptor.setClassRealm( pluginManager.getPluginRealm( session, pluginDescriptor ) );
+ }
requiredDependencyResolutionScope = calculateRequiredDependencyResolutionScope( requiredDependencyResolutionScope, mojoDescriptor.isDependencyResolutionRequired() );
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/LifecycleExecutor.java Fri Jun 5 13:49:25 2009
@@ -30,6 +30,7 @@
import org.apache.maven.plugin.InvalidPluginDescriptorException;
import org.apache.maven.plugin.MojoNotFoundException;
import org.apache.maven.plugin.PluginDescriptorParsingException;
+import org.apache.maven.plugin.PluginManagerException;
import org.apache.maven.plugin.PluginNotFoundException;
import org.apache.maven.plugin.PluginResolutionException;
@@ -50,7 +51,7 @@
* @throws LifecycleExecutionException
*/
MavenExecutionPlan calculateExecutionPlan( MavenSession session, String... tasks )
- throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException;
+ throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException, NoPluginFoundForPrefixException, InvalidPluginDescriptorException, PluginManagerException;
// For a given project packaging find all the plugins that are bound to any registered
// lifecycles. The project builder needs to now what default plugin information needs to be
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginClassLoaderCache.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginClassLoaderCache.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginClassLoaderCache.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginClassLoaderCache.java Fri Jun 5 13:49:25 2009
@@ -1,29 +0,0 @@
-package org.apache.maven.plugin;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.codehaus.plexus.classworlds.realm.ClassRealm;
-import org.codehaus.plexus.component.annotations.Component;
-
-@Component(role=PluginClassLoaderCache.class)
-public class DefaultPluginClassLoaderCache
- implements PluginClassLoaderCache
-{
- private Map<String,ClassRealm> pluginClassLoaders = new HashMap<String,ClassRealm>();
-
- public void put( String key, ClassRealm pluginClassLoader )
- {
- pluginClassLoaders.put( key, pluginClassLoader );
- }
-
- public ClassRealm get( String key )
- {
- return pluginClassLoaders.get( key );
- }
-
- public int size()
- {
- return pluginClassLoaders.size();
- }
-}
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java Fri Jun 5 13:49:25 2009
@@ -15,21 +15,20 @@
* the License.
*/
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
import java.io.File;
+import java.io.FileInputStream;
import java.io.IOException;
-import java.io.Reader;
+import java.io.InputStream;
import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.jar.JarFile;
+import java.util.zip.ZipEntry;
import org.apache.maven.ArtifactFilterManager;
import org.apache.maven.artifact.Artifact;
@@ -52,8 +51,11 @@
import org.apache.maven.project.DuplicateArtifactAttachmentException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.repository.RepositorySystem;
+import org.codehaus.plexus.MutablePlexusContainer;
import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.classworlds.ClassWorld;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
+import org.codehaus.plexus.classworlds.realm.DuplicateRealmException;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.component.composition.CycleDetectedInComponentGraphException;
@@ -61,23 +63,18 @@
import org.codehaus.plexus.component.configurator.ComponentConfigurator;
import org.codehaus.plexus.component.configurator.ConfigurationListener;
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
-import org.codehaus.plexus.component.discovery.ComponentDiscoverer;
-import org.codehaus.plexus.component.discovery.ComponentDiscoveryEvent;
-import org.codehaus.plexus.component.discovery.ComponentDiscoveryListener;
import org.codehaus.plexus.component.repository.ComponentDescriptor;
-import org.codehaus.plexus.component.repository.ComponentSetDescriptor;
import org.codehaus.plexus.component.repository.exception.ComponentLifecycleException;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import org.codehaus.plexus.configuration.PlexusConfiguration;
import org.codehaus.plexus.configuration.PlexusConfigurationException;
import org.codehaus.plexus.configuration.xml.XmlPlexusConfiguration;
-import org.codehaus.plexus.context.Context;
-import org.codehaus.plexus.context.ContextMapAdapter;
import org.codehaus.plexus.logging.Logger;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.InterpolationFilterReader;
import org.codehaus.plexus.util.ReaderFactory;
import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.xml.XmlStreamReader;
import org.codehaus.plexus.util.xml.Xpp3Dom;
// TODO: get plugin groups
@@ -88,12 +85,12 @@
@Component(role = PluginManager.class)
public class DefaultPluginManager
- implements PluginManager, ComponentDiscoverer, ComponentDiscoveryListener
+ implements PluginManager
{
@Requirement
private Logger logger;
- @Requirement
+ @Requirement(role=PlexusContainer.class)
protected PlexusContainer container;
@Requirement
@@ -106,19 +103,7 @@
private ResolutionErrorHandler resolutionErrorHandler;
@Requirement
- private PluginClassLoaderCache pluginClassLoaderCache;
-
- private Map<String, PluginDescriptor> pluginDescriptors;
-
- public DefaultPluginManager()
- {
- pluginDescriptors = new HashMap<String, PluginDescriptor>();
- }
-
- private String pluginKey( Plugin plugin )
- {
- return plugin.getGroupId() + ":" + plugin.getArtifactId() + ":" + plugin.getVersion();
- }
+ private PluginCache pluginCache;
/**
*
@@ -133,24 +118,33 @@
* happen but if someone has made a descriptor by hand it's possible.
* @throws CycleDetectedInComponentGraphException A cycle has been detected in the component graph for a plugin that has been dynamically loaded.
*/
- public PluginDescriptor loadPlugin( Plugin plugin, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories )
+ public synchronized PluginDescriptor loadPlugin( Plugin plugin, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories )
throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, InvalidPluginDescriptorException
{
- PluginDescriptor pluginDescriptor = getPluginDescriptor( plugin );
+// PluginDescriptor pluginDescriptor = getPluginDescriptor( plugin );
// There are cases where plugins are discovered but not actually populated. These are edge cases where you are working in the IDE on
// Maven itself so this speaks to a problem we have with the system not starting entirely clean.
- if ( pluginDescriptor != null && pluginDescriptor.getClassRealm() != null )
+// if ( pluginDescriptor != null && pluginDescriptor.getClassRealm() != null )
+// {
+// return pluginDescriptor;
+// }
+
+ PluginDescriptor pluginDescriptor = pluginCache.getPluginDescriptor( plugin, localRepository, remoteRepositories );
+
+ if ( pluginDescriptor != null )
{
return pluginDescriptor;
- }
-
+ }
+
+
Artifact pluginArtifact = repositorySystem.createPluginArtifact( plugin );
ArtifactResolutionRequest request = new ArtifactResolutionRequest()
.setArtifact( pluginArtifact )
.setLocalRepository( localRepository )
- .setRemoteRepostories( remoteRepositories );
+ .setRemoteRepostories( remoteRepositories )
+ .setResolveTransitively( false );
ArtifactResolutionResult result = repositorySystem.resolve( request );
@@ -162,81 +156,99 @@
{
throw new PluginResolutionException( plugin, e );
}
-
- ClassRealm pluginRealm = pluginClassLoaderCache.get( constructPluginKey( plugin ) );
-
- if ( pluginRealm != null )
- {
- return getPluginDescriptor( plugin );
- }
-
- pluginRealm = container.createChildRealm( pluginKey( plugin ) );
-
- Set<Artifact> pluginArtifacts;
-
try
{
- pluginArtifacts = getPluginArtifacts( pluginArtifact, plugin, localRepository, remoteRepositories );
- }
- catch ( ArtifactNotFoundException e )
- {
- throw new PluginNotFoundException( plugin, e );
- }
- catch ( ArtifactResolutionException e )
- {
- throw new PluginResolutionException( plugin, e );
- }
-
- for ( Artifact a : pluginArtifacts )
- {
- try
+ if ( pluginArtifact.getFile().isFile() )
{
- pluginRealm.addURL( a.getFile().toURI().toURL() );
+ JarFile pluginJar = new JarFile( pluginArtifact.getFile() );
+ try
+ {
+ ZipEntry pluginDescriptorEntry = pluginJar.getEntry( getComponentDescriptorLocation() );
+
+ if ( pluginDescriptorEntry != null )
+ {
+ InputStream is = pluginJar.getInputStream( pluginDescriptorEntry );
+
+ pluginDescriptor = parsebuildPluginDescriptor( is );
+ }
+ }
+ finally
+ {
+ pluginJar.close();
+ }
}
- catch ( MalformedURLException e )
+ else
{
- // Not going to happen
+ File pluginXml = new File( pluginArtifact.getFile(), getComponentDescriptorLocation() );
+
+ if ( pluginXml.canRead() )
+ {
+ InputStream is = new BufferedInputStream( new FileInputStream( pluginXml ) );
+ try
+ {
+ pluginDescriptor = parsebuildPluginDescriptor( is );
+ }
+ finally
+ {
+ IOUtil.close( is );
+ }
+ }
}
- }
-
- String pluginKey = constructPluginKey( plugin );
-
- // Check the internal consistent of a plugin descriptor when it is discovered. Most of the time the plugin descriptor is generated
- // by the maven-plugin-plugin, but if you happened to have created one by hand and it's incorrect this validator will report
- // the problem to the user.
- //
- MavenPluginValidator validator = new MavenPluginValidator( pluginArtifact );
+
+ String pluginKey = constructPluginKey( plugin );
+
+ if ( pluginDescriptor == null )
+ {
+ throw new InvalidPluginDescriptorException( "Invalid or missing Plugin Descriptor for " + pluginKey );
+ }
+
+ // Check the internal consistent of a plugin descriptor when it is discovered. Most of the time the plugin descriptor is generated
+ // by the maven-plugin-plugin, but if you happened to have created one by hand and it's incorrect this validator will report
+ // the problem to the user.
+ //
+ MavenPluginValidator validator = new MavenPluginValidator( pluginArtifact );
+
+ validator.validate( pluginDescriptor );
+
+ if ( validator.hasErrors() )
+ {
+ throw new InvalidPluginDescriptorException( "Invalid Plugin Descriptor for " + pluginKey, validator.getErrors() );
+ }
+
+ pluginDescriptor.setPlugin( plugin );
+ pluginDescriptor.setPluginArtifact( pluginArtifact );
+
+ pluginCache.putPluginDescriptor( plugin, localRepository, remoteRepositories, pluginDescriptor );
+
+ return pluginDescriptor;
- try
- {
- container.discoverComponents( pluginRealm, validator );
}
- catch ( PlexusConfigurationException e )
+ catch ( IOException e )
{
throw new PluginDescriptorParsingException( plugin, e );
}
- catch ( CycleDetectedInComponentGraphException e )
+ catch ( PlexusConfigurationException e )
{
- throw new CycleDetectedInPluginGraphException( plugin, e );
+ throw new PluginDescriptorParsingException( plugin, e );
}
+ }
- if ( validator.hasErrors() )
- {
- throw new InvalidPluginDescriptorException( "Invalid Plugin Descriptor for " + pluginKey, validator.getErrors() );
- }
-
- pluginClassLoaderCache.put( pluginKey, pluginRealm );
-
- pluginDescriptor = getPluginDescriptor( plugin );
- pluginDescriptor.setArtifacts( new ArrayList<Artifact>( pluginArtifacts ) );
-
+ private PluginDescriptor parsebuildPluginDescriptor( InputStream is )
+ throws IOException, PlexusConfigurationException
+ {
+ PluginDescriptor pluginDescriptor;
+ XmlStreamReader reader = ReaderFactory.newXmlReader( is );
+
+ InterpolationFilterReader interpolationFilterReader = new InterpolationFilterReader( new BufferedReader( reader ), container.getContext().getContextData() );
+
+ pluginDescriptor = builder.build( interpolationFilterReader );
return pluginDescriptor;
}
// TODO: Turn this into a component so it can be tested.
//
- Set<Artifact> getPluginArtifacts( Artifact pluginArtifact, Plugin pluginAsSpecifiedInPom, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories )
+ List<Artifact> getPluginArtifacts( Artifact pluginArtifact, Plugin pluginAsSpecifiedInPom, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories )
throws ArtifactNotFoundException, ArtifactResolutionException
{
AndArtifactFilter filter = new AndArtifactFilter();
@@ -284,7 +296,7 @@
logger.debug( "Using the following artifacts for classpath of: " + pluginArtifact.getId() + ":\n\n" + result.getArtifacts().toString().replace( ',', '\n' ) );
- return result.getArtifacts();
+ return new ArrayList<Artifact>( result.getArtifacts() );
}
// ----------------------------------------------------------------------
@@ -292,8 +304,8 @@
// ----------------------------------------------------------------------
public void executeMojo( MavenSession session, MojoExecution mojoExecution )
- throws MojoFailureException, MojoExecutionException, PluginConfigurationException, PluginExecutionException
- {
+ throws MojoFailureException, MojoExecutionException, PluginConfigurationException, PluginManagerException
+ {
MavenProject project = session.getCurrentProject();
MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
@@ -308,8 +320,7 @@
goalExecId += " {execution: " + mojoExecution.getExecutionId() + "}";
}
- // by this time, the pluginDescriptor has had the correct realm setup from getConfiguredMojo(..)
- ClassRealm pluginRealm = pluginClassLoaderCache.get( constructPluginKey( mojoDescriptor.getPluginDescriptor() ) );
+ ClassRealm pluginRealm = getPluginRealm( session, mojoDescriptor.getPluginDescriptor() );
ClassRealm oldLookupRealm = container.getLookupRealm();
ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
@@ -358,70 +369,193 @@
}
}
- private Mojo getConfiguredMojo( MavenSession session, MavenProject project, MojoExecution mojoExecution, ClassRealm pluginRealm )
- throws PluginConfigurationException, PluginManagerException
+ /**
+ * TODO pluginDescriptor classRealm and artifacts are set as a side effect of this
+ * call, which is not nice.
+ */
+ public synchronized ClassRealm getPluginRealm( MavenSession session, PluginDescriptor pluginDescriptor ) throws PluginManagerException
{
- MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
+ ClassRealm pluginRealm = pluginDescriptor.getClassRealm();
+ if ( pluginRealm != null )
+ {
+ return pluginRealm;
+ }
- PluginDescriptor pluginDescriptor = mojoDescriptor.getPluginDescriptor();
+ Plugin plugin = pluginDescriptor.getPlugin();
+ ArtifactRepository localRepository = session.getLocalRepository();
+ List<ArtifactRepository> remoteRepositories = session.getCurrentProject().getPluginArtifactRepositories();
- // We are forcing the use of the plugin realm for all lookups that might occur during
- // the lifecycle that is part of the lookup. Here we are specifically trying to keep
- // lookups that occur in contextualize calls in line with the right realm.
- container.setLookupRealm( pluginRealm );
+ PluginCache.CacheRecord cacheRecord = pluginCache.get( plugin, localRepository, remoteRepositories );
- ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader( pluginRealm );
+ if ( cacheRecord != null )
+ {
+ pluginDescriptor.setClassRealm( cacheRecord.realm );
+ pluginDescriptor.setArtifacts( new ArrayList<Artifact>( cacheRecord.artifacts ) );
+
+ return pluginRealm;
+ }
+
+ pluginRealm = createPluginRealm( plugin );
+
+ Artifact pluginArtifact = pluginDescriptor.getPluginArtifact();
- Mojo mojo;
+ List<Artifact> pluginArtifacts;
try
{
- mojo = container.lookup( Mojo.class, mojoDescriptor.getRoleHint() );
+ pluginArtifacts = getPluginArtifacts( pluginArtifact, plugin, localRepository, remoteRepositories );
}
- catch ( ComponentLookupException e )
+ catch ( ArtifactNotFoundException e )
+ {
+ throw new IllegalStateException( e ); // XXX
+ }
+ catch ( ArtifactResolutionException e )
{
- throw new PluginContainerException( mojoDescriptor, pluginRealm, "Unable to find the mojo '" + mojoDescriptor.getRoleHint() + "' in the plugin '" + pluginDescriptor.getPluginLookupKey()
- + "'", e );
+ throw new IllegalStateException( e ); // XXX
}
- if ( mojo instanceof ContextEnabled )
+ for ( Artifact a : pluginArtifacts )
{
- //TODO: find somewhere better to put the plugin context.
- Map<String, Object> pluginContext = null;
+ try
+ {
+ pluginRealm.addURL( a.getFile().toURI().toURL() );
+ }
+ catch ( MalformedURLException e )
+ {
+ // Not going to happen
+ }
+ }
- if ( pluginContext != null )
+ pluginDescriptor.setClassRealm( pluginRealm );
+ pluginDescriptor.setArtifacts( pluginArtifacts );
+
+ try
+ {
+ for ( ComponentDescriptor componentDescriptor : pluginDescriptor.getComponents() )
{
- pluginContext.put( "project", project );
+ componentDescriptor.setRealm( pluginRealm );
+ container.addComponentDescriptor( componentDescriptor );
+ }
+
+ container.discoverComponents( pluginRealm );
+ }
+ catch ( PlexusConfigurationException e )
+ {
+ throw new PluginManagerException( plugin, e.getMessage(), e );
+ }
+ catch ( CycleDetectedInComponentGraphException e )
+ {
+ throw new PluginManagerException( plugin, e.getMessage(), e );
+ }
+
+ pluginCache.put( plugin, localRepository, remoteRepositories, pluginRealm, pluginArtifacts );
+
+ return pluginRealm;
+ }
- pluginContext.put( "pluginDescriptor", pluginDescriptor );
+ /**
+ * Creates ClassRealm with unique id for the given plugin
+ */
+ private ClassRealm createPluginRealm( Plugin plugin )
+ throws PluginManagerException
+ {
+ ClassWorld world = ((MutablePlexusContainer) container).getClassWorld();
+
+ String baseRealmId = constructPluginKey( plugin );
+ String realmId = baseRealmId;
- ( (ContextEnabled) mojo ).setPluginContext( pluginContext );
+ synchronized ( world )
+ {
+ for ( int i = 0; i < 100; i++ )
+ {
+ try
+ {
+ ClassRealm pluginRealm = world.newRealm( realmId );
+ pluginRealm.setParentRealm( container.getContainerRealm() );
+ return pluginRealm;
+ }
+ catch ( DuplicateRealmException e )
+ {
+ realmId = baseRealmId + "-" + i;
+ }
}
}
- mojo.setLog( new DefaultLog( logger ) );
+ throw new PluginManagerException( plugin, "Could not create ClassRealm", (Throwable) null );
+ }
- Xpp3Dom dom = mojoExecution.getConfiguration();
+ private Mojo getConfiguredMojo( MavenSession session, MavenProject project, MojoExecution mojoExecution, ClassRealm pluginRealm )
+ throws PluginConfigurationException, PluginManagerException
+ {
+ MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
- PlexusConfiguration pomConfiguration;
+ PluginDescriptor pluginDescriptor = mojoDescriptor.getPluginDescriptor();
+
+ // We are forcing the use of the plugin realm for all lookups that might occur during
+ // the lifecycle that is part of the lookup. Here we are specifically trying to keep
+ // lookups that occur in contextualize calls in line with the right realm.
+ ClassRealm oldLookupRealm = container.setLookupRealm( pluginRealm );
+
+ ClassLoader oldClassLoader = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader( pluginRealm );
+ container.setLookupRealm( pluginRealm );
- if ( dom == null )
+ try
{
- pomConfiguration = new XmlPlexusConfiguration( "configuration" );
+ Mojo mojo;
+
+ try
+ {
+ mojo = container.lookup( Mojo.class, mojoDescriptor.getRoleHint() );
+ }
+ catch ( ComponentLookupException e )
+ {
+ throw new PluginContainerException( mojoDescriptor, pluginRealm, "Unable to find the mojo '" + mojoDescriptor.getRoleHint() + "' in the plugin '" + pluginDescriptor.getPluginLookupKey()
+ + "'", e );
+ }
+
+ if ( mojo instanceof ContextEnabled )
+ {
+ //TODO: find somewhere better to put the plugin context.
+ Map<String, Object> pluginContext = null;
+
+ if ( pluginContext != null )
+ {
+ pluginContext.put( "project", project );
+
+ pluginContext.put( "pluginDescriptor", pluginDescriptor );
+
+ ( (ContextEnabled) mojo ).setPluginContext( pluginContext );
+ }
+ }
+
+ mojo.setLog( new DefaultLog( logger ) );
+
+ Xpp3Dom dom = mojoExecution.getConfiguration();
+
+ PlexusConfiguration pomConfiguration;
+
+ if ( dom == null )
+ {
+ pomConfiguration = new XmlPlexusConfiguration( "configuration" );
+ }
+ else
+ {
+ pomConfiguration = new XmlPlexusConfiguration( dom );
+ }
+
+ ExpressionEvaluator expressionEvaluator = new PluginParameterExpressionEvaluator( session, mojoExecution );
+
+ populatePluginFields( mojo, mojoDescriptor, pluginRealm, pomConfiguration, expressionEvaluator );
+
+ return mojo;
}
- else
+ finally
{
- pomConfiguration = new XmlPlexusConfiguration( dom );
+ Thread.currentThread().setContextClassLoader( oldClassLoader );
+ container.setLookupRealm( oldLookupRealm );
}
- ExpressionEvaluator expressionEvaluator = new PluginParameterExpressionEvaluator( session, mojoExecution );
-
- populatePluginFields( mojo, mojoDescriptor, pluginRealm, pomConfiguration, expressionEvaluator );
-
- Thread.currentThread().setContextClassLoader( oldClassLoader );
-
- return mojo;
}
// ----------------------------------------------------------------------
@@ -553,118 +687,10 @@
return "META-INF/maven/plugin.xml";
}
- public ComponentSetDescriptor createComponentDescriptors( Reader componentDescriptorConfiguration, String source )
- throws PlexusConfigurationException
- {
- return builder.build( componentDescriptorConfiguration, source );
- }
-
- public List<ComponentSetDescriptor> findComponents( Context context, ClassRealm realm )
- throws PlexusConfigurationException
- {
- List<ComponentSetDescriptor> componentSetDescriptors = new ArrayList<ComponentSetDescriptor>();
-
- Enumeration<URL> resources;
- try
- {
- // We don't always want to scan parent realms. For plexus
- // testcase, most components are in the root classloader so that needs to be scanned,
- // but for child realms, we don't.
- if ( realm.getParentRealm() != null )
- {
- resources = realm.findRealmResources( getComponentDescriptorLocation() );
- }
- else
- {
- resources = realm.findResources( getComponentDescriptorLocation() );
- }
- }
- catch ( IOException e )
- {
- throw new PlexusConfigurationException( "Unable to retrieve resources for: " + getComponentDescriptorLocation() + " in class realm: " + realm.getId() );
- }
-
- for ( URL url : Collections.list( resources ) )
- {
- Reader reader = null;
-
- try
- {
- URLConnection conn = url.openConnection();
-
- conn.setUseCaches( false );
-
- conn.connect();
-
- reader = ReaderFactory.newXmlReader( conn.getInputStream() );
-
- InterpolationFilterReader interpolationFilterReader = new InterpolationFilterReader( reader, new ContextMapAdapter( context ) );
-
- ComponentSetDescriptor componentSetDescriptor = createComponentDescriptors( interpolationFilterReader, url.toString() );
-
- if ( componentSetDescriptor.getComponents() != null )
- {
- for ( ComponentDescriptor<?> cd : componentSetDescriptor.getComponents() )
- {
- cd.setComponentSetDescriptor( componentSetDescriptor );
- cd.setRealm( realm );
- }
- }
-
- componentSetDescriptors.add( componentSetDescriptor );
- }
- catch ( IOException ex )
- {
- throw new PlexusConfigurationException( "Error reading configuration " + url, ex );
- }
- finally
- {
- IOUtil.close( reader );
- }
- }
-
- return componentSetDescriptors;
- }
-
// ----------------------------------------------------------------------
// Component Discovery Listener
// ----------------------------------------------------------------------
- private Set pluginsInProcess = new HashSet();
-
- public void componentDiscovered( ComponentDiscoveryEvent event )
- {
- ComponentSetDescriptor componentSetDescriptor = event.getComponentSetDescriptor();
-
- if ( componentSetDescriptor instanceof PluginDescriptor )
- {
- PluginDescriptor pluginDescriptor = (PluginDescriptor) componentSetDescriptor;
-
- MavenPluginValidator validator = (MavenPluginValidator) event.getData();
-
- validator.validate( pluginDescriptor );
-
- if ( validator.hasErrors() )
- {
- return;
- }
-
- String key = constructPluginKey( pluginDescriptor );
-
- if ( !pluginsInProcess.contains( key ) )
- {
- pluginsInProcess.add( key );
-
- pluginDescriptors.put( key, pluginDescriptor );
- }
- }
- }
-
- public PluginDescriptor getPluginDescriptor( Plugin plugin )
- {
- return pluginDescriptors.get( constructPluginKey( plugin ) );
- }
-
public String constructPluginKey( Plugin plugin )
{
String version = ArtifactUtils.toSnapshotVersion( plugin.getVersion() );
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/InvalidPluginDescriptorException.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/InvalidPluginDescriptorException.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/InvalidPluginDescriptorException.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/InvalidPluginDescriptorException.java Fri Jun 5 13:49:25 2009
@@ -32,6 +32,11 @@
this.errors = errors;
}
+ public InvalidPluginDescriptorException( String message )
+ {
+ super( message );
+ }
+
private static String toMessage( String message, List<String> errors )
{
StringBuilder buffer = new StringBuilder( 256 );
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginDescriptorParsingException.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginDescriptorParsingException.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginDescriptorParsingException.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginDescriptorParsingException.java Fri Jun 5 13:49:25 2009
@@ -20,11 +20,6 @@
*/
import org.apache.maven.model.Plugin;
-import org.apache.maven.plugin.descriptor.PluginDescriptor;
-import org.codehaus.plexus.component.configurator.ComponentConfigurationException;
-import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
-import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
-import org.codehaus.plexus.configuration.PlexusConfigurationException;
/**
* @author Jason van Zyl
@@ -34,7 +29,7 @@
{
private Plugin plugin;
- public PluginDescriptorParsingException( Plugin plugin, PlexusConfigurationException e )
+ public PluginDescriptorParsingException( Plugin plugin, Exception e )
{
super( e );
this.plugin = plugin;
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginManager.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginManager.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginManager.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginManager.java Fri Jun 5 13:49:25 2009
@@ -22,14 +22,12 @@
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.apache.maven.plugin.descriptor.PluginDescriptor;
-import org.codehaus.plexus.component.discovery.ComponentDiscoverer;
-import org.codehaus.plexus.component.discovery.ComponentDiscoveryListener;
+import org.codehaus.plexus.classworlds.realm.ClassRealm;
/**
* @author Jason van Zyl
*/
public interface PluginManager
- extends ComponentDiscoverer, ComponentDiscoveryListener
{
// - find the plugin [extension point: any client may wish to do whatever they choose]
// - load the plugin into a classloader [extension point: we want to take them from a repository, some may take from disk or whatever]
@@ -41,16 +39,22 @@
// plugin resolution exception
// plugin configuration can't be parsed -- and this may be a result of client insertion of configuration
// plugin component deps have a cycle -- this should be prevented for the most part but client code may inject an override component which itself has a cycle
+ // igorf: Way too many declared exceptions!
PluginDescriptor loadPlugin( Plugin plugin, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories )
throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, InvalidPluginDescriptorException;
+ // igorf: Way too many declared exceptions!
MojoDescriptor getMojoDescriptor( String groupId, String artifactId, String version, String goal, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories )
throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException, InvalidPluginDescriptorException;
-
+
+ // igorf: Way too many declared exceptions!
MojoDescriptor getMojoDescriptor( Plugin plugin, String goal, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories )
throws PluginNotFoundException, PluginResolutionException, PluginDescriptorParsingException, CycleDetectedInPluginGraphException, MojoNotFoundException, InvalidPluginDescriptorException;
-
+
// Why do we have a plugin execution exception as well?
+ // igorf: Way too many declared exceptions!
void executeMojo( MavenSession session, MojoExecution execution )
- throws MojoFailureException, MojoExecutionException, PluginConfigurationException, PluginExecutionException;
+ throws MojoFailureException, MojoExecutionException, PluginConfigurationException, PluginExecutionException, PluginManagerException;
+
+ ClassRealm getPluginRealm( MavenSession session, PluginDescriptor pluginDescriptor ) throws PluginManagerException;
}
\ No newline at end of file
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultMavenProjectCache.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultMavenProjectCache.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultMavenProjectCache.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultMavenProjectCache.java Fri Jun 5 13:49:25 2009
@@ -1,52 +0,0 @@
-package org.apache.maven.project;
-
-/*
- * 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.
- */
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.codehaus.plexus.component.annotations.Component;
-
-@Component(role=MavenProjectCache.class)
-public class DefaultMavenProjectCache
- implements MavenProjectCache
-{
- private Map<String, MavenProject> projectCache = new HashMap<String, MavenProject>();
-
- public MavenProject get( String key )
- {
- return projectCache.get( key );
- }
-
- public void put( String key, MavenProject project )
- {
- projectCache.put( key, project );
- }
-
- public void clear()
- {
- projectCache.clear();
- }
-
- public int size()
- {
- return projectCache.size();
- }
-}
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/DefaultProjectBuilder.java Fri Jun 5 13:49:25 2009
@@ -67,9 +67,6 @@
@Requirement
private ResolutionErrorHandler resolutionErrorHandler;
- @Requirement
- private MavenProjectCache projectCache;
-
private MavenProject superProject;
// ----------------------------------------------------------------------
@@ -85,15 +82,6 @@
private MavenProject build( File pomFile, boolean localProject, ProjectBuildingRequest configuration )
throws ProjectBuildingException
{
- String cacheKey = getCacheKey( pomFile, configuration );
-
- MavenProject project = projectCache.get( cacheKey );
-
- if ( project != null )
- {
- return project;
- }
-
ModelResolver resolver =
new RepositoryModelResolver( repositorySystem, resolutionErrorHandler, configuration.getLocalRepository(),
configuration.getRemoteRepositories() );
@@ -119,7 +107,7 @@
Model model = result.getEffectiveModel();
- project = fromModelToMavenProject( model, result.getRawModels().get( 1 ).getPomFile(), configuration, model.getPomFile() );
+ MavenProject project = fromModelToMavenProject( model, result.getRawModels().get( 1 ).getPomFile(), configuration, model.getPomFile() );
project.setOriginalModel( result.getRawModel() );
@@ -144,19 +132,9 @@
project.setFile( pomFile );
project.setActiveProfiles( result.getActiveProfiles( result.getRawModel() ) );
- projectCache.put( cacheKey, project );
-
return project;
}
- private String getCacheKey( File pomFile, ProjectBuildingRequest configuration )
- {
- StringBuilder buffer = new StringBuilder( 256 );
- buffer.append( pomFile.getAbsolutePath() );
- buffer.append( '/' ).append( pomFile.lastModified() );
- return buffer.toString();
- }
-
public MavenProject build( Artifact artifact, ProjectBuildingRequest configuration )
throws ProjectBuildingException
{
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProjectCache.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProjectCache.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProjectCache.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProjectCache.java Fri Jun 5 13:49:25 2009
@@ -1,36 +0,0 @@
-package org.apache.maven.project;
-
-/*
- * 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.
- */
-
-public interface MavenProjectCache
-{
-
- MavenProject get( String key );
-
- void put( String key, MavenProject project );
-
- /**
- * Clears the cache.
- */
- void clear();
-
- int size();
-
-}
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultMavenMetadataCache.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultMavenMetadataCache.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultMavenMetadataCache.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/DefaultMavenMetadataCache.java Fri Jun 5 13:49:25 2009
@@ -38,24 +38,26 @@
public static class CacheKey
{
- Artifact artifact;
- List<ArtifactRepository> repositories = new ArrayList<ArtifactRepository>();
+ private final Artifact artifact;
+ private final List<ArtifactRepository> repositories = new ArrayList<ArtifactRepository>();
+ private final int hashCode;
- CacheKey( Artifact artifact, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories )
+ public CacheKey( Artifact artifact, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories )
{
this.artifact = ArtifactUtils.copyArtifact( artifact );
this.repositories.add( localRepository );
this.repositories.addAll( remoteRepositories );
+
+ int hash = 17;
+ hash = hash * 31 + artifactHashCode( artifact );
+ hash = hash * 31 + repositories.hashCode();
+ this.hashCode = hash;
}
@Override
public int hashCode()
{
- int hash = 17;
- hash = hash * 31 + artifact.hashCode();
- hash = hash * 31 + repositories.hashCode();
-
- return hash;
+ return hashCode;
}
@Override
@@ -73,18 +75,57 @@
CacheKey other = (CacheKey) o;
- return artifact.equals( other.artifact ) && repositories.equals( other.repositories );
+ return artifactEquals( artifact, other.artifact ) && repositories.equals( other.repositories );
+ }
+ }
+
+ private static int artifactHashCode( Artifact a )
+ {
+ int result = 17;
+ result = 31 * result + a.getGroupId().hashCode();
+ result = 31 * result + a.getArtifactId().hashCode();
+ result = 31 * result + a.getType().hashCode();
+ if ( a.getVersion() != null )
+ {
+ result = 31 * result + a.getVersion().hashCode();
+ }
+ result = 31 * result + ( a.getClassifier() != null ? a.getClassifier().hashCode() : 0 );
+ result = 31 * result + ( a.getScope() != null ? a.getScope().hashCode() : 0 );
+ result = 31 * result + ( a.getDependencyFilter() != null? a.getDependencyFilter().hashCode() : 0 );
+ result = 31 * result + ( a.isOptional() ? 1 : 0 );
+ return result;
+ }
+
+ private static boolean artifactEquals( Artifact a1, Artifact a2 )
+ {
+ if ( a1 == a2 )
+ {
+ return true;
}
+
+ return eq( a1.getGroupId(), a2.getGroupId() )
+ && eq( a1.getArtifactId(), a2.getArtifactId() )
+ && eq( a1.getType(), a2.getType() )
+ && eq( a1.getVersion(), a2.getVersion() )
+ && eq( a1.getClassifier(), a2.getClassifier() )
+ && eq( a1.getScope(), a2.getScope() )
+ && eq( a1.getDependencyFilter(), a2.getDependencyFilter() )
+ && a1.isOptional() == a2.isOptional();
+ }
+
+ private static <T> boolean eq( T s1, T s2 )
+ {
+ return s1 != null? s1.equals( s2 ): s2 == null;
}
public class CacheRecord
{
- Artifact pomArtifact;
- List<Artifact> artifacts;
- List<ArtifactRepository> remoteRepositories;
+ private Artifact pomArtifact;
+ private List<Artifact> artifacts;
+ private List<ArtifactRepository> remoteRepositories;
- long length;
- long timestamp;
+ private long length;
+ private long timestamp;
CacheRecord(Artifact pomArtifact, Set<Artifact> artifacts, List<ArtifactRepository> remoteRepositories)
{
@@ -105,6 +146,21 @@
this.timestamp = -1;
}
}
+
+ public Artifact getArtifact()
+ {
+ return pomArtifact;
+ }
+
+ public List<Artifact> getArtifacts()
+ {
+ return artifacts;
+ }
+
+ public List<ArtifactRepository> getRemoteRepositories()
+ {
+ return remoteRepositories;
+ }
public boolean isStale()
{
@@ -117,8 +173,8 @@
return length != -1 || timestamp != -1;
}
}
-
- private Map<CacheKey, CacheRecord> cache = new HashMap<CacheKey, CacheRecord>();
+
+ protected Map<CacheKey, CacheRecord> cache = new HashMap<CacheKey, CacheRecord>();
public ResolutionGroup get( Artifact artifact, ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories )
@@ -129,9 +185,9 @@
if ( cacheRecord != null && !cacheRecord.isStale() )
{
- Artifact pomArtifact = ArtifactUtils.copyArtifact( cacheRecord.pomArtifact );
- Set<Artifact> artifacts = new LinkedHashSet<Artifact>( copyArtifacts( cacheRecord.artifacts ) );
- return new ResolutionGroup( pomArtifact, artifacts , cacheRecord.remoteRepositories );
+ Artifact pomArtifact = ArtifactUtils.copyArtifact( cacheRecord.getArtifact() );
+ Set<Artifact> artifacts = new LinkedHashSet<Artifact>( copyArtifacts( cacheRecord.getArtifacts() ) );
+ return new ResolutionGroup( pomArtifact, artifacts , cacheRecord.getRemoteRepositories() );
}
cache.remove( cacheKey );
@@ -158,4 +214,8 @@
return result;
}
+ public void flush()
+ {
+ cache.clear();
+ }
}
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataCache.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataCache.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataCache.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataCache.java Fri Jun 5 13:49:25 2009
@@ -31,4 +31,5 @@
void put( Artifact artifact, ArtifactRepository localRepository,
List<ArtifactRepository> remoteRepositories, ResolutionGroup result );
+ void flush();
}
Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java Fri Jun 5 13:49:25 2009
@@ -40,8 +40,8 @@
import org.apache.maven.project.DefaultProjectBuildingRequest;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuilder;
-import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.project.ProjectBuildingException;
+import org.apache.maven.project.ProjectBuildingRequest;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.component.annotations.Component;
import org.codehaus.plexus.component.annotations.Requirement;
@@ -77,14 +77,12 @@
public ResolutionGroup retrieve( Artifact artifact, ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories )
throws ArtifactMetadataRetrievalException
{
- /*
ResolutionGroup cached = cache.get( artifact, localRepository, remoteRepositories );
if ( cached != null )
{
return cached;
}
- */
List<Dependency> dependencies;
@@ -169,7 +167,7 @@
ResolutionGroup result = new ResolutionGroup( pomArtifact, artifacts, remoteRepositories );
- //cache.put( artifact, localRepository, remoteRepositories, result );
+ cache.put( artifact, localRepository, remoteRepositories, result );
return result;
}
Modified: maven/components/trunk/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java (original)
+++ maven/components/trunk/maven-core/src/test/java/org/apache/maven/AbstractCoreMavenComponentTestCase.java Fri Jun 5 13:49:25 2009
@@ -2,10 +2,13 @@
import java.io.File;
import java.util.Arrays;
+import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Map;
import java.util.Properties;
import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.ArtifactUtils;
import org.apache.maven.artifact.InvalidRepositoryException;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.execution.DefaultMavenExecutionRequest;
@@ -21,6 +24,7 @@
import org.apache.maven.project.DefaultProjectBuildingRequest;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuildingRequest;
+import org.apache.maven.repository.DelegatingLocalArtifactRepository;
import org.apache.maven.repository.RepositorySystem;
import org.codehaus.plexus.ContainerConfiguration;
import org.codehaus.plexus.PlexusTestCase;
@@ -77,8 +81,8 @@
*/
protected void customizeContainerConfiguration( ContainerConfiguration containerConfiguration )
{
- containerConfiguration.addComponentDiscoverer( PluginManager.class );
- containerConfiguration.addComponentDiscoveryListener( PluginManager.class );
+// containerConfiguration.addComponentDiscoverer( PluginManager.class );
+// containerConfiguration.addComponentDiscoveryListener( PluginManager.class );
}
protected MavenExecutionRequest createMavenExecutionRequest( File pom )
@@ -150,6 +154,22 @@
{
return repositorySystem.createDefaultLocalRepository();
}
+
+ protected ArtifactRepository getReactorRepository( MavenProject... projects )
+ throws InvalidRepositoryException
+ {
+ Map<String, MavenProject> projectsMap = new LinkedHashMap<String, MavenProject>();
+
+ for ( MavenProject project : projects )
+ {
+ projectsMap.put( ArtifactUtils.key( project.getGroupId(), project.getArtifactId(), project.getVersion() ), project );
+ }
+
+ DelegatingLocalArtifactRepository delegatingLocalArtifactRepository = new DelegatingLocalArtifactRepository( getLocalRepository() );
+ delegatingLocalArtifactRepository.setBuildReactor( new ReactorArtifactRepository( projectsMap ) );
+
+ return delegatingLocalArtifactRepository;
+ }
protected class ProjectBuilder
{
Modified: maven/components/trunk/maven-core/src/test/java/org/apache/maven/plugin/PluginManagerTest.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/java/org/apache/maven/plugin/PluginManagerTest.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/test/java/org/apache/maven/plugin/PluginManagerTest.java (original)
+++ maven/components/trunk/maven-core/src/test/java/org/apache/maven/plugin/PluginManagerTest.java Fri Jun 5 13:49:25 2009
@@ -1,11 +1,9 @@
package org.apache.maven.plugin;
-import java.util.Set;
+import java.util.List;
import org.apache.maven.AbstractCoreMavenComponentTestCase;
import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
-import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.model.Plugin;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
@@ -66,7 +64,8 @@
MojoDescriptor mojoDescriptor = pluginManager.getMojoDescriptor( plugin, goal, session.getLocalRepository(), session.getCurrentProject().getRemoteArtifactRepositories() );
assertNotNull( mojoDescriptor );
assertEquals( "generate-metadata", mojoDescriptor.getGoal() );
- assertNotNull( mojoDescriptor.getRealm() );
+ // igorf: plugin realm comes later
+ // assertNotNull( mojoDescriptor.getRealm() );
PluginDescriptor pluginDescriptor = mojoDescriptor.getPluginDescriptor();
assertNotNull( pluginDescriptor );
@@ -226,7 +225,7 @@
ArtifactResolutionResult result = repositorySystem.resolve( request );
*/
- Set<Artifact> artifacts = pluginManager.getPluginArtifacts( pluginArtifact, plugin, getLocalRepository(), getRemoteRepositories() );
+ List<Artifact> artifacts = pluginManager.getPluginArtifacts( pluginArtifact, plugin, getLocalRepository(), getRemoteRepositories() );
assertEquals( 4, artifacts.size() );
for ( Artifact a : artifacts )
Modified: maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java (original)
+++ maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java Fri Jun 5 13:49:25 2009
@@ -165,7 +165,16 @@
}
MavenExecutionResult result = mavenEmbedder.execute( request );
-
+
+ try
+ {
+ mavenEmbedder.stop();
+ }
+ catch ( MavenEmbedderException e )
+ {
+ result.addException( e );
+ }
+
// The exception handling should be handled in Maven itself.
if ( result.hasExceptions() )
Modified: maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java (original)
+++ maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java Fri Jun 5 13:49:25 2009
@@ -37,7 +37,6 @@
import org.apache.maven.model.Model;
import org.apache.maven.model.io.ModelReader;
import org.apache.maven.model.io.ModelWriter;
-import org.apache.maven.plugin.PluginManager;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectBuildingResult;
import org.apache.maven.project.ProjectBuilder;
@@ -355,8 +354,6 @@
try
{
ContainerConfiguration cc = new DefaultContainerConfiguration()
- .addComponentDiscoverer( PluginManager.class )
- .addComponentDiscoveryListener( PluginManager.class )
.setClassWorld( classWorld )
.setName( "embedder" );
Modified: maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/MavenEmbedderTest.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/MavenEmbedderTest.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/MavenEmbedderTest.java (original)
+++ maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/MavenEmbedderTest.java Fri Jun 5 13:49:25 2009
@@ -39,7 +39,6 @@
import org.apache.maven.model.Model;
import org.apache.maven.model.Plugin;
import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.MavenProjectCache;
import org.apache.maven.settings.Profile;
import org.apache.maven.settings.Repository;
import org.apache.maven.settings.Settings;
@@ -244,9 +243,6 @@
assertNull( p0.getProperties().getProperty( "occupation" ) );
- // NOTE: The default cache does not consider profiles so clear it to ensure the project is properly rebuild
- mavenEmbedder.getPlexusContainer().lookup( MavenProjectCache.class ).clear();
-
// Check with profile activated
MavenExecutionRequest request = new DefaultMavenExecutionRequest()
Modified: maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/ModelUtils.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/ModelUtils.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/ModelUtils.java (original)
+++ maven/components/trunk/maven-model-builder/src/main/java/org/apache/maven/model/ModelUtils.java Fri Jun 5 13:49:25 2009
@@ -64,7 +64,7 @@
import org.apache.maven.model.Site;
import org.codehaus.plexus.util.xml.Xpp3Dom;
-final class ModelUtils
+public final class ModelUtils
{
// TODO: Replace this with MODELLO-191
Modified: maven/components/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java (original)
+++ maven/components/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java Fri Jun 5 13:49:25 2009
@@ -27,6 +27,7 @@
import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.ArtifactUtils;
+import org.apache.maven.model.Plugin;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
import org.codehaus.plexus.component.repository.ComponentSetDescriptor;
@@ -61,6 +62,8 @@
private String description;
+ private Plugin plugin;
+
private Artifact pluginArtifact;
// ----------------------------------------------------------------------
@@ -307,6 +310,16 @@
return description;
}
+ public void setPlugin( Plugin plugin )
+ {
+ this.plugin = plugin;
+ }
+
+ public Plugin getPlugin()
+ {
+ return plugin;
+ }
+
public Artifact getPluginArtifact()
{
return pluginArtifact;
Modified: maven/components/trunk/pom.xml
URL: http://svn.apache.org/viewvc/maven/components/trunk/pom.xml?rev=782014&r1=782013&r2=782014&view=diff
==============================================================================
--- maven/components/trunk/pom.xml (original)
+++ maven/components/trunk/pom.xml Fri Jun 5 13:49:25 2009
@@ -54,7 +54,7 @@
<plexusVersion>1.0-beta-3.0.8-SNAPSHOT</plexusVersion>
<plexusInterpolationVersion>1.8.1</plexusInterpolationVersion>
<plexusPluginManagerVersion>1.0-alpha-1</plexusPluginManagerVersion>
- <plexusUtilsVersion>1.5.8</plexusUtilsVersion>
+ <plexusUtilsVersion>1.5.13-SNAPSHOT</plexusUtilsVersion>
<plexusJetty6Version>1.6</plexusJetty6Version>
<plexusWebdavVersion>1.0</plexusWebdavVersion>
<wagonVersion>1.0-beta-5</wagonVersion>