Author: bentmann
Date: Tue Jan 4 20:32:41 2011
New Revision: 1055174
URL: http://svn.apache.org/viewvc?rev=1055174&view=rev
Log:
[MNG-4840] Prerequisites is not working on m3
Added:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginIncompatibleException.java
(with props)
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/
(with props)
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/RuntimeInformation.java
(with props)
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/internal/
(with props)
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformation.java
(with props)
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/rtinfo/
(with props)
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/rtinfo/internal/
(with props)
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformationTest.java
(with props)
Modified:
maven/maven-3/trunk/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java
maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/execution/DefaultRuntimeInformation.java
maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/execution/RuntimeInformation.java
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginDescriptorCache.java
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/MavenPluginManager.java
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java
maven/maven-3/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java
Modified:
maven/maven-3/trunk/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java?rev=1055174&r1=1055173&r2=1055174&view=diff
==============================================================================
---
maven/maven-3/trunk/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java
(original)
+++
maven/maven-3/trunk/maven-aether-provider/src/main/java/org/apache/maven/repository/internal/DefaultArtifactDescriptorReader.java
Tue Jan 4 20:32:41 2011
@@ -32,6 +32,7 @@ import org.apache.maven.model.Dependency
import org.apache.maven.model.DistributionManagement;
import org.apache.maven.model.License;
import org.apache.maven.model.Model;
+import org.apache.maven.model.Prerequisites;
import org.apache.maven.model.Relocation;
import org.apache.maven.model.Repository;
import org.apache.maven.model.building.DefaultModelBuilderFactory;
@@ -88,6 +89,7 @@ public class DefaultArtifactDescriptorRe
implements ArtifactDescriptorReader, Service
{
+ @SuppressWarnings( "unused" )
@Requirement
private Logger logger = NullLogger.INSTANCE;
@@ -195,6 +197,12 @@ public class DefaultArtifactDescriptorRe
Map<String, Object> properties = new LinkedHashMap<String,
Object>();
+ Prerequisites prerequisites = model.getPrerequisites();
+ if ( prerequisites != null )
+ {
+ properties.put( "prerequisites.maven",
prerequisites.getMaven() );
+ }
+
List<License> licenses = model.getLicenses();
properties.put( "license.count", Integer.valueOf( licenses.size()
) );
for ( int i = 0; i < licenses.size(); i++ )
Modified:
maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/execution/DefaultRuntimeInformation.java
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/execution/DefaultRuntimeInformation.java?rev=1055174&r1=1055173&r2=1055174&view=diff
==============================================================================
---
maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/execution/DefaultRuntimeInformation.java
(original)
+++
maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/execution/DefaultRuntimeInformation.java
Tue Jan 4 20:32:41 2011
@@ -22,17 +22,14 @@ package org.apache.maven.execution;
import org.apache.maven.artifact.versioning.ArtifactVersion;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.annotations.Requirement;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
import
org.codehaus.plexus.personality.plexus.lifecycle.phase.InitializationException;
-import org.codehaus.plexus.util.IOUtil;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Properties;
+import org.codehaus.plexus.util.StringUtils;
/**
* Describes runtime information about the application.
- *
+ *
* @author <a href="mailto:[email protected]">Brett Porter</a>
* @version $Id$
*/
@@ -41,9 +38,9 @@ import java.util.Properties;
public class DefaultRuntimeInformation
implements RuntimeInformation, Initializable
{
- private static final String MAVEN_GROUPID = "org.apache.maven";
- private static final String MAVEN_PROPERTIES = "META-INF/maven/" +
MAVEN_GROUPID + "/maven-core/pom.properties";
+ @Requirement
+ private org.apache.maven.rtinfo.RuntimeInformation rtInfo;
private ArtifactVersion applicationVersion;
@@ -55,33 +52,14 @@ public class DefaultRuntimeInformation
public void initialize()
throws InitializationException
{
- InputStream resourceAsStream = null;
- try
- {
- Properties properties = new Properties();
- resourceAsStream =
getClass().getClassLoader().getResourceAsStream( MAVEN_PROPERTIES );
+ String mavenVersion = rtInfo.getMavenVersion();
- if ( resourceAsStream == null )
- {
- throw new IllegalStateException( "Unable to find Maven
properties in classpath: " + MAVEN_PROPERTIES );
- }
- properties.load( resourceAsStream );
-
- String property = properties.getProperty( "version" );
- if ( property == null )
- {
- throw new InitializationException( "maven-core properties did
not include the version" );
- }
-
- applicationVersion = new DefaultArtifactVersion( property );
- }
- catch ( IOException e )
+ if ( StringUtils.isEmpty( mavenVersion ) )
{
- throw new InitializationException( "Unable to read properties file
from maven-core", e );
- }
- finally
- {
- IOUtil.close( resourceAsStream );
+ throw new InitializationException( "Unable to read Maven version
from maven-core" );
}
+
+ applicationVersion = new DefaultArtifactVersion( mavenVersion );
}
+
}
Modified:
maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/execution/RuntimeInformation.java
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/execution/RuntimeInformation.java?rev=1055174&r1=1055173&r2=1055174&view=diff
==============================================================================
---
maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/execution/RuntimeInformation.java
(original)
+++
maven/maven-3/trunk/maven-compat/src/main/java/org/apache/maven/execution/RuntimeInformation.java
Tue Jan 4 20:32:41 2011
@@ -24,9 +24,11 @@ import org.apache.maven.artifact.version
/**
* Describes runtime information about the application.
*
+ * @deprecated Use {...@link org.apache.maven.rtinfo.RuntimeInformation}
instead.
* @author <a href="mailto:[email protected]">Brett Porter</a>
* @version $Id$
*/
+...@deprecated
public interface RuntimeInformation
{
ArtifactVersion getApplicationVersion();
Modified:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java?rev=1055174&r1=1055173&r2=1055174&view=diff
==============================================================================
---
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java
(original)
+++
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/internal/MojoExecutor.java
Tue Jan 4 20:32:41 2011
@@ -27,10 +27,12 @@ import org.apache.maven.execution.MavenS
import org.apache.maven.lifecycle.LifecycleExecutionException;
import org.apache.maven.lifecycle.MissingProjectException;
import org.apache.maven.plugin.BuildPluginManager;
+import org.apache.maven.plugin.MavenPluginManager;
import org.apache.maven.plugin.MojoExecution;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.PluginConfigurationException;
+import org.apache.maven.plugin.PluginIncompatibleException;
import org.apache.maven.plugin.PluginManagerException;
import org.apache.maven.plugin.descriptor.MojoDescriptor;
import org.apache.maven.project.MavenProject;
@@ -65,6 +67,9 @@ public class MojoExecutor
private BuildPluginManager pluginManager;
@Requirement
+ private MavenPluginManager mavenPluginManager;
+
+ @Requirement
private LifecycleDependencyResolver lifeCycleDependencyResolver;
@Requirement
@@ -156,6 +161,15 @@ public class MojoExecutor
{
MojoDescriptor mojoDescriptor = mojoExecution.getMojoDescriptor();
+ try
+ {
+ mavenPluginManager.checkRequiredMavenVersion(
mojoDescriptor.getPluginDescriptor() );
+ }
+ catch ( PluginIncompatibleException e )
+ {
+ throw new LifecycleExecutionException( mojoExecution,
session.getCurrentProject(), e );
+ }
+
if ( mojoDescriptor.isProjectRequired() &&
!session.isUsingPOMsFromFilesystem() )
{
Throwable cause =
Modified:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginDescriptorCache.java
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginDescriptorCache.java?rev=1055174&r1=1055173&r2=1055174&view=diff
==============================================================================
---
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginDescriptorCache.java
(original)
+++
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginDescriptorCache.java
Tue Jan 4 20:32:41 2011
@@ -72,7 +72,7 @@ public class DefaultPluginDescriptorCach
descriptors.put( cacheKey, clone( pluginDescriptor ) );
}
- private static PluginDescriptor clone( PluginDescriptor original )
+ protected static PluginDescriptor clone( PluginDescriptor original )
{
PluginDescriptor clone = null;
@@ -88,6 +88,7 @@ public class DefaultPluginDescriptorCach
clone.setName( original.getName() );
clone.setDescription( original.getDescription() );
+ clone.setRequiredMavenVersion( original.getRequiredMavenVersion()
);
clone.setPluginArtifact( ArtifactUtils.copyArtifactSafe(
original.getPluginArtifact() ) );
Modified:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/MavenPluginManager.java
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/MavenPluginManager.java?rev=1055174&r1=1055173&r2=1055174&view=diff
==============================================================================
---
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/MavenPluginManager.java
(original)
+++
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/MavenPluginManager.java
Tue Jan 4 20:32:41 2011
@@ -68,6 +68,14 @@ public interface MavenPluginManager
InvalidPluginDescriptorException;
/**
+ * Verifies the specified plugin is compatible with the current Maven
runtime.
+ *
+ * @param pluginDescriptor The descriptor of the plugin to check, must not
be {...@code null}.
+ */
+ void checkRequiredMavenVersion( PluginDescriptor pluginDescriptor )
+ throws PluginIncompatibleException;
+
+ /**
* Sets up the class realm for the specified plugin. Both the class realm
and the plugin artifacts that constitute
* it will be stored in the plugin descriptor.
*
Added:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginIncompatibleException.java
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginIncompatibleException.java?rev=1055174&view=auto
==============================================================================
---
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginIncompatibleException.java
(added)
+++
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginIncompatibleException.java
Tue Jan 4 20:32:41 2011
@@ -0,0 +1,36 @@
+package org.apache.maven.plugin;
+
+/*
+ * 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 org.apache.maven.model.Plugin;
+
+/**
+ * Signals a plugin which is not compatible with the current Maven runtime.
+ */
+public class PluginIncompatibleException
+ extends PluginManagerException
+{
+
+ public PluginIncompatibleException( Plugin plugin, String message )
+ {
+ super( plugin, message, (Throwable) null );
+ }
+
+}
Propchange:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginIncompatibleException.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/PluginIncompatibleException.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Modified:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java?rev=1055174&r1=1055173&r2=1055174&view=diff
==============================================================================
---
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
(original)
+++
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultMavenPluginManager.java
Tue Jan 4 20:32:41 2011
@@ -55,6 +55,7 @@ import org.apache.maven.plugin.PluginCon
import org.apache.maven.plugin.PluginContainerException;
import org.apache.maven.plugin.PluginDescriptorCache;
import org.apache.maven.plugin.PluginDescriptorParsingException;
+import org.apache.maven.plugin.PluginIncompatibleException;
import org.apache.maven.plugin.PluginParameterException;
import org.apache.maven.plugin.PluginParameterExpressionEvaluator;
import org.apache.maven.plugin.PluginRealmCache;
@@ -64,6 +65,7 @@ import org.apache.maven.plugin.descripto
import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.apache.maven.plugin.descriptor.PluginDescriptorBuilder;
import org.apache.maven.project.MavenProject;
+import org.apache.maven.rtinfo.RuntimeInformation;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.classworlds.realm.ClassRealm;
import org.codehaus.plexus.component.annotations.Component;
@@ -123,6 +125,9 @@ public class DefaultMavenPluginManager
@Requirement
private PluginDependenciesResolver pluginDependenciesResolver;
+ @Requirement
+ private RuntimeInformation runtimeInformation;
+
private PluginDescriptorBuilder builder = new PluginDescriptorBuilder();
public synchronized PluginDescriptor getPluginDescriptor( Plugin plugin,
List<RemoteRepository> repositories, RepositorySystemSession session )
@@ -134,11 +139,15 @@ public class DefaultMavenPluginManager
if ( pluginDescriptor == null )
{
- Artifact pluginArtifact =
- RepositoryUtils.toArtifact(
pluginDependenciesResolver.resolve( plugin, repositories, session ) );
+ org.sonatype.aether.artifact.Artifact artifact =
+ pluginDependenciesResolver.resolve( plugin, repositories,
session );
+
+ Artifact pluginArtifact = RepositoryUtils.toArtifact( artifact );
pluginDescriptor = extractPluginDescriptor( pluginArtifact, plugin
);
+ pluginDescriptor.setRequiredMavenVersion( artifact.getProperty(
"requiredMavenVersion", null ) );
+
pluginDescriptorCache.put( cacheKey, pluginDescriptor );
}
@@ -261,6 +270,27 @@ public class DefaultMavenPluginManager
return mojoDescriptor;
}
+ public void checkRequiredMavenVersion( PluginDescriptor pluginDescriptor )
+ throws PluginIncompatibleException
+ {
+ String requiredMavenVersion =
pluginDescriptor.getRequiredMavenVersion();
+ if ( StringUtils.isNotBlank( requiredMavenVersion ) )
+ {
+ try
+ {
+ if ( !runtimeInformation.isMavenVersion( requiredMavenVersion
) )
+ {
+ throw new PluginIncompatibleException(
pluginDescriptor.getPlugin(), "The plugin "
+ + pluginDescriptor.getId() + " requires Maven version
" + requiredMavenVersion );
+ }
+ }
+ catch ( RuntimeException e )
+ {
+ logger.warn( "Could not verify plugin's Maven prerequisite: "
+ e.getMessage() );
+ }
+ }
+ }
+
public synchronized void setupPluginRealm( PluginDescriptor
pluginDescriptor, MavenSession session,
ClassLoader parent,
List<String> imports, DependencyFilter filter )
throws PluginResolutionException, PluginContainerException
Modified:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java?rev=1055174&r1=1055173&r2=1055174&view=diff
==============================================================================
---
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java
(original)
+++
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/internal/DefaultPluginDependenciesResolver.java
Tue Jan 4 20:32:41 2011
@@ -19,7 +19,9 @@ package org.apache.maven.plugin.internal
* under the License.
*/
+import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Map;
import org.apache.maven.ArtifactFilterManager;
import org.apache.maven.RepositoryUtils;
@@ -40,9 +42,13 @@ import org.sonatype.aether.graph.Depende
import org.sonatype.aether.graph.DependencyNode;
import org.sonatype.aether.graph.DependencyVisitor;
import org.sonatype.aether.repository.RemoteRepository;
+import org.sonatype.aether.resolution.ArtifactDescriptorException;
+import org.sonatype.aether.resolution.ArtifactDescriptorRequest;
+import org.sonatype.aether.resolution.ArtifactDescriptorResult;
import org.sonatype.aether.resolution.ArtifactRequest;
import org.sonatype.aether.resolution.ArtifactResolutionException;
import org.sonatype.aether.util.DefaultRepositorySystemSession;
+import org.sonatype.aether.util.FilterRepositorySystemSession;
import org.sonatype.aether.util.artifact.DefaultArtifact;
import org.sonatype.aether.util.artifact.JavaScopes;
import org.sonatype.aether.util.filter.AndDependencyFilter;
@@ -88,6 +94,36 @@ public class DefaultPluginDependenciesRe
try
{
+ RepositorySystemSession pluginSession = new
FilterRepositorySystemSession( session )
+ {
+ @Override
+ public boolean isIgnoreMissingArtifactDescriptor()
+ {
+ return false;
+ }
+ };
+
+ ArtifactDescriptorRequest request =
+ new ArtifactDescriptorRequest( pluginArtifact, repositories,
REPOSITORY_CONTEXT );
+ ArtifactDescriptorResult result =
repoSystem.readArtifactDescriptor( pluginSession, request );
+
+ pluginArtifact = result.getArtifact();
+
+ String requiredMavenVersion = (String) result.getProperties().get(
"prerequisites.maven" );
+ if ( requiredMavenVersion != null )
+ {
+ Map<String, String> props = new LinkedHashMap<String, String>(
pluginArtifact.getProperties() );
+ props.put( "requiredMavenVersion", requiredMavenVersion );
+ pluginArtifact = pluginArtifact.setProperties( props );
+ }
+ }
+ catch ( ArtifactDescriptorException e )
+ {
+ throw new PluginResolutionException( plugin, e );
+ }
+
+ try
+ {
ArtifactRequest request = new ArtifactRequest( pluginArtifact,
repositories, REPOSITORY_CONTEXT );
pluginArtifact = repoSystem.resolveArtifact( session, request
).getArtifact();
}
Modified:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java?rev=1055174&r1=1055173&r2=1055174&view=diff
==============================================================================
---
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java
(original)
+++
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/plugin/version/internal/DefaultPluginVersionResolver.java
Tue Jan 4 20:32:41 2011
@@ -22,14 +22,19 @@ package org.apache.maven.plugin.version.
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
+import java.util.TreeSet;
import org.apache.maven.artifact.repository.metadata.Metadata;
import org.apache.maven.artifact.repository.metadata.Versioning;
import org.apache.maven.artifact.repository.metadata.io.MetadataReader;
import org.apache.maven.model.Build;
import org.apache.maven.model.Plugin;
+import org.apache.maven.plugin.MavenPluginManager;
+import org.apache.maven.plugin.PluginResolutionException;
+import org.apache.maven.plugin.descriptor.PluginDescriptor;
import org.apache.maven.plugin.version.PluginVersionRequest;
import org.apache.maven.plugin.version.PluginVersionResolutionException;
import org.apache.maven.plugin.version.PluginVersionResolver;
@@ -43,12 +48,15 @@ import org.sonatype.aether.RepositoryLis
import org.sonatype.aether.RepositorySystem;
import org.sonatype.aether.RepositorySystemSession;
import org.sonatype.aether.repository.ArtifactRepository;
-import org.sonatype.aether.repository.LocalRepository;
import org.sonatype.aether.repository.RemoteRepository;
import org.sonatype.aether.resolution.MetadataRequest;
import org.sonatype.aether.resolution.MetadataResult;
import org.sonatype.aether.util.listener.DefaultRepositoryEvent;
import org.sonatype.aether.util.metadata.DefaultMetadata;
+import org.sonatype.aether.util.version.GenericVersionScheme;
+import org.sonatype.aether.version.InvalidVersionSpecificationException;
+import org.sonatype.aether.version.Version;
+import org.sonatype.aether.version.VersionScheme;
/**
* Resolves a version for a plugin.
@@ -72,6 +80,9 @@ public class DefaultPluginVersionResolve
@Requirement
private MetadataReader metadataReader;
+ @Requirement
+ private MavenPluginManager pluginManager;
+
public PluginVersionResult resolve( PluginVersionRequest request )
throws PluginVersionResolutionException
{
@@ -118,8 +129,6 @@ public class DefaultPluginVersionResolve
List<MetadataResult> results = repositorySystem.resolveMetadata(
request.getRepositorySession(), requests );
- LocalRepository localRepo =
request.getRepositorySession().getLocalRepository();
-
Versions versions = new Versions();
for ( MetadataResult res : results )
@@ -133,24 +142,137 @@ public class DefaultPluginVersionResolve
mergeMetadata( request.getRepositorySession(), versions,
res.getMetadata(), repository );
}
+ selectVersion( result, request, versions );
+
+ return result;
+ }
+
+ private void selectVersion( DefaultPluginVersionResult result,
PluginVersionRequest request, Versions versions )
+ throws PluginVersionResolutionException
+ {
+ String version = null;
+ ArtifactRepository repo = null;
+
if ( StringUtils.isNotEmpty( versions.releaseVersion ) )
{
- result.setVersion( versions.releaseVersion );
- result.setRepository( ( versions.releaseRepository == null ) ?
localRepo : versions.releaseRepository );
+ version = versions.releaseVersion;
+ repo = versions.releaseRepository;
}
else if ( StringUtils.isNotEmpty( versions.latestVersion ) )
{
- result.setVersion( versions.latestVersion );
- result.setRepository( ( versions.latestRepository == null ) ?
localRepo : versions.latestRepository );
+ version = versions.latestVersion;
+ repo = versions.latestRepository;
+ }
+ if ( version != null && !isCompatible( request, version ) )
+ {
+ versions.versions.remove( version );
+ version = null;
+ }
+
+ if ( version == null )
+ {
+ VersionScheme versionScheme = new GenericVersionScheme();
+
+ TreeSet<Version> releases = new TreeSet<Version>(
Collections.reverseOrder() );
+ TreeSet<Version> snapshots = new TreeSet<Version>(
Collections.reverseOrder() );
+
+ for ( String ver : versions.versions.keySet() )
+ {
+ try
+ {
+ Version v = versionScheme.parseVersion( ver );
+
+ if ( ver.endsWith( "-SNAPSHOT" ) )
+ {
+ snapshots.add( v );
+ }
+ else
+ {
+ releases.add( v );
+ }
+ }
+ catch ( InvalidVersionSpecificationException e )
+ {
+ continue;
+ }
+ }
+
+ for ( Version v : releases )
+ {
+ String ver = v.toString();
+ if ( isCompatible( request, ver ) )
+ {
+ version = ver;
+ repo = versions.versions.get( version );
+ break;
+ }
+ }
+
+ if ( version == null )
+ {
+ for ( Version v : snapshots )
+ {
+ String ver = v.toString();
+ if ( isCompatible( request, ver ) )
+ {
+ version = ver;
+ repo = versions.versions.get( version );
+ break;
+ }
+ }
+ }
+ }
+
+ if ( version != null )
+ {
+ result.setVersion( version );
+ result.setRepository( repo );
}
else
{
- throw new PluginVersionResolutionException( request.getGroupId(),
request.getArtifactId(), localRepo,
+ throw new PluginVersionResolutionException( request.getGroupId(),
request.getArtifactId(),
+
request.getRepositorySession().getLocalRepository(),
request.getRepositories(),
"Plugin not found in
any plugin repository" );
}
+ }
- return result;
+ private boolean isCompatible( PluginVersionRequest request, String version
)
+ {
+ Plugin plugin = new Plugin();
+ plugin.setGroupId( request.getGroupId() );
+ plugin.setArtifactId( request.getArtifactId() );
+ plugin.setVersion( version );
+
+ PluginDescriptor pluginDescriptor;
+
+ try
+ {
+ pluginDescriptor =
+ pluginManager.getPluginDescriptor( plugin,
request.getRepositories(), request.getRepositorySession() );
+ }
+ catch ( PluginResolutionException e )
+ {
+ logger.debug( "Ignoring unresolvable plugin version " + version, e
);
+ return false;
+ }
+ catch ( Exception e )
+ {
+ // ignore for now and delay failure to higher level processing
+ return true;
+ }
+
+ try
+ {
+ pluginManager.checkRequiredMavenVersion( pluginDescriptor );
+ }
+ catch ( Exception e )
+ {
+ logger.debug( "Ignoring incompatible plugin version " + version +
": " + e.getMessage() );
+ return false;
+ }
+
+ return true;
}
private void mergeMetadata( RepositorySystemSession session, Versions
versions,
@@ -209,6 +331,14 @@ public class DefaultPluginVersionResolve
versions.latestTimestamp = timestamp;
versions.latestRepository = repository;
}
+
+ for ( String version : versioning.getVersions() )
+ {
+ if ( !versions.versions.containsKey( version ) )
+ {
+ versions.versions.put( version, repository );
+ }
+ }
}
}
@@ -266,6 +396,8 @@ public class DefaultPluginVersionResolve
ArtifactRepository latestRepository;
+ Map<String, ArtifactRepository> versions = new LinkedHashMap<String,
ArtifactRepository>();
+
}
}
Propchange:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/
------------------------------------------------------------------------------
bugtraq:label = Enter issue ID:
Propchange:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/
------------------------------------------------------------------------------
bugtraq:message = Issue id: %BUGID%
Propchange:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/
------------------------------------------------------------------------------
bugtraq:number = false
Propchange:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/
------------------------------------------------------------------------------
bugtraq:url = http://jira.codehaus.org/browse/%BUGID%
Added:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/RuntimeInformation.java
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/RuntimeInformation.java?rev=1055174&view=auto
==============================================================================
---
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/RuntimeInformation.java
(added)
+++
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/RuntimeInformation.java
Tue Jan 4 20:32:41 2011
@@ -0,0 +1,49 @@
+package org.apache.maven.rtinfo;
+
+/*
+ * 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.
+ */
+
+/**
+ * Provides information about the current Maven runtime.
+ *
+ * @since 3.0.2
+ */
+public interface RuntimeInformation
+{
+
+ /**
+ * Retrieves the current Maven version, for example "3.0.2".
+ *
+ * @return The current Maven version or an empty string if unknown, never
{...@code null}.
+ */
+ String getMavenVersion();
+
+ /**
+ * Checks whether the current Maven runtime matches the specified version
range. A version range can either use the
+ * usual mathematical syntax "[2.0.10,2.1.0),[3.0,)" or use a single
version "2.2.1". The latter is a short form for
+ * "[2.2.1,)", i.e. denotes the minimum version required.
+ *
+ * @param versionRange The version range to match the current Maven
runtime against, must not be {...@code null}.
+ * @return {...@code true} if the current Maven runtime matches the
specified version range, {...@code false} otherwise.
+ * @throws IllegalArgumentException If the specified version range is
{...@code null}, empty or otherwise not a valid
+ * version specification.
+ */
+ boolean isMavenVersion( String versionRange );
+
+}
Propchange:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/RuntimeInformation.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/RuntimeInformation.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/internal/
------------------------------------------------------------------------------
bugtraq:label = Enter issue ID:
Propchange:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/internal/
------------------------------------------------------------------------------
bugtraq:message = Issue id: %BUGID%
Propchange:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/internal/
------------------------------------------------------------------------------
bugtraq:number = false
Propchange:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/internal/
------------------------------------------------------------------------------
bugtraq:url = http://jira.codehaus.org/browse/%BUGID%
Added:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformation.java
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformation.java?rev=1055174&view=auto
==============================================================================
---
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformation.java
(added)
+++
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformation.java
Tue Jan 4 20:32:41 2011
@@ -0,0 +1,149 @@
+package org.apache.maven.rtinfo.internal;
+
+/*
+ * 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.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+import org.apache.maven.rtinfo.RuntimeInformation;
+import org.codehaus.plexus.component.annotations.Component;
+import org.codehaus.plexus.component.annotations.Requirement;
+import org.codehaus.plexus.logging.Logger;
+import org.codehaus.plexus.util.IOUtil;
+import org.codehaus.plexus.util.StringUtils;
+import org.sonatype.aether.util.version.GenericVersionScheme;
+import org.sonatype.aether.version.InvalidVersionSpecificationException;
+import org.sonatype.aether.version.Version;
+import org.sonatype.aether.version.VersionConstraint;
+import org.sonatype.aether.version.VersionScheme;
+
+/**
+ * Provides information about the current Maven runtime.
+ */
+...@component( role = RuntimeInformation.class )
+public class DefaultRuntimeInformation
+ implements RuntimeInformation
+{
+
+ @Requirement
+ private Logger logger;
+
+ private String mavenVersion;
+
+ public String getMavenVersion()
+ {
+ if ( mavenVersion == null )
+ {
+ Properties props = new Properties();
+
+ String resource =
"META-INF/maven/org.apache.maven/maven-core/pom.properties";
+
+ InputStream is =
DefaultRuntimeInformation.class.getResourceAsStream( "/" + resource );
+ if ( is != null )
+ {
+ try
+ {
+ props.load( is );
+ }
+ catch ( IOException e )
+ {
+ String msg = "Could not parse " + resource + ", Maven
runtime information not available";
+ if ( logger.isDebugEnabled() )
+ {
+ logger.warn( msg, e );
+ }
+ else
+ {
+ logger.warn( msg );
+ }
+ }
+ finally
+ {
+ IOUtil.close( is );
+ }
+ }
+ else
+ {
+ logger.warn( "Could not locate " + resource + " on classpath,
Maven runtime information not available" );
+ }
+
+ String version = props.getProperty( "version", "" ).trim();
+
+ if ( !version.startsWith( "${" ) )
+ {
+ mavenVersion = version;
+ }
+ else
+ {
+ mavenVersion = "";
+ }
+ }
+
+ return mavenVersion;
+ }
+
+ public boolean isMavenVersion( String versionRange )
+ {
+ VersionScheme versionScheme = new GenericVersionScheme();
+
+ if ( versionRange == null )
+ {
+ throw new IllegalArgumentException( "Version range must not be
null" );
+ }
+ if ( StringUtils.isBlank( versionRange ) )
+ {
+ throw new IllegalArgumentException( "Version range must not be
empty" );
+ }
+
+ VersionConstraint constraint;
+ try
+ {
+ constraint = versionScheme.parseVersionConstraint( versionRange );
+ }
+ catch ( InvalidVersionSpecificationException e )
+ {
+ throw new IllegalArgumentException( e.getMessage(), e );
+ }
+
+ Version current;
+ try
+ {
+ String mavenVersion = getMavenVersion();
+ if ( mavenVersion.length() <= 0 )
+ {
+ throw new IllegalStateException( "Could not determine current
Maven version" );
+ }
+
+ current = versionScheme.parseVersion( mavenVersion );
+ }
+ catch ( InvalidVersionSpecificationException e )
+ {
+ throw new IllegalStateException( "Could not parse current Maven
version: " + e.getMessage(), e );
+ }
+
+ if ( constraint.getRanges().isEmpty() )
+ {
+ return constraint.getVersion().compareTo( current ) <= 0;
+ }
+ return constraint.containsVersion( current );
+ }
+
+}
Propchange:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformation.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformation.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Propchange:
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/rtinfo/
------------------------------------------------------------------------------
bugtraq:label = Enter issue ID:
Propchange:
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/rtinfo/
------------------------------------------------------------------------------
bugtraq:message = Issue id: %BUGID%
Propchange:
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/rtinfo/
------------------------------------------------------------------------------
bugtraq:number = false
Propchange:
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/rtinfo/
------------------------------------------------------------------------------
bugtraq:url = http://jira.codehaus.org/browse/%BUGID%
Propchange:
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/rtinfo/internal/
------------------------------------------------------------------------------
bugtraq:label = Enter issue ID:
Propchange:
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/rtinfo/internal/
------------------------------------------------------------------------------
bugtraq:message = Issue id: %BUGID%
Propchange:
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/rtinfo/internal/
------------------------------------------------------------------------------
bugtraq:number = false
Propchange:
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/rtinfo/internal/
------------------------------------------------------------------------------
bugtraq:url = http://jira.codehaus.org/browse/%BUGID%
Added:
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformationTest.java
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformationTest.java?rev=1055174&view=auto
==============================================================================
---
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformationTest.java
(added)
+++
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformationTest.java
Tue Jan 4 20:32:41 2011
@@ -0,0 +1,81 @@
+package org.apache.maven.rtinfo.internal;
+
+/*
+ * 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 org.apache.maven.rtinfo.RuntimeInformation;
+import org.codehaus.plexus.PlexusTestCase;
+
+public class DefaultRuntimeInformationTest
+ extends PlexusTestCase
+{
+
+ public void testGetMavenVersion()
+ throws Exception
+ {
+ RuntimeInformation rtInfo = lookup( RuntimeInformation.class );
+
+ String mavenVersion = rtInfo.getMavenVersion();
+ assertNotNull( mavenVersion );
+ assertTrue( mavenVersion.length() > 0 );
+ }
+
+ public void testIsMavenVersion()
+ throws Exception
+ {
+ RuntimeInformation rtInfo = lookup( RuntimeInformation.class );
+
+ assertTrue( rtInfo.isMavenVersion( "2.0" ) );
+ assertFalse( rtInfo.isMavenVersion( "9.9" ) );
+
+ assertTrue( rtInfo.isMavenVersion( "[2.0.11,2.1.0),[3.0,)" ) );
+ assertFalse( rtInfo.isMavenVersion( "[9.0,)" ) );
+
+ try
+ {
+ rtInfo.isMavenVersion( "[3.0," );
+ fail( "Bad version range wasn't rejected" );
+ }
+ catch ( IllegalArgumentException e )
+ {
+ assertTrue( true );
+ }
+
+ try
+ {
+ rtInfo.isMavenVersion( "" );
+ fail( "Bad version range wasn't rejected" );
+ }
+ catch ( IllegalArgumentException e )
+ {
+ assertTrue( true );
+ }
+
+ try
+ {
+ rtInfo.isMavenVersion( null );
+ fail( "Bad version range wasn't rejected" );
+ }
+ catch ( IllegalArgumentException e )
+ {
+ assertTrue( true );
+ }
+ }
+
+}
Propchange:
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformationTest.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
maven/maven-3/trunk/maven-core/src/test/java/org/apache/maven/rtinfo/internal/DefaultRuntimeInformationTest.java
------------------------------------------------------------------------------
svn:keywords = Author Date Id Revision
Modified:
maven/maven-3/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java
URL:
http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java?rev=1055174&r1=1055173&r2=1055174&view=diff
==============================================================================
---
maven/maven-3/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java
(original)
+++
maven/maven-3/trunk/maven-plugin-api/src/main/java/org/apache/maven/plugin/descriptor/PluginDescriptor.java
Tue Jan 4 20:32:41 2011
@@ -79,6 +79,8 @@ public class PluginDescriptor
private String description;
+ private String requiredMavenVersion;
+
private Plugin plugin;
private Artifact pluginArtifact;
@@ -89,7 +91,7 @@ public class PluginDescriptor
//
// ----------------------------------------------------------------------
- @SuppressWarnings( "unchecked" )
+ @SuppressWarnings( { "unchecked", "rawtypes" } )
public List<MojoDescriptor> getMojos()
{
return (List) getComponents();
@@ -332,6 +334,16 @@ public class PluginDescriptor
return description;
}
+ public void setRequiredMavenVersion( String requiredMavenVersion )
+ {
+ this.requiredMavenVersion = requiredMavenVersion;
+ }
+
+ public String getRequiredMavenVersion()
+ {
+ return requiredMavenVersion;
+ }
+
public void setPlugin( Plugin plugin )
{
this.plugin = plugin;