Return-Path: Delivered-To: apmail-maven-commits-archive@www.apache.org Received: (qmail 84558 invoked from network); 9 Nov 2007 14:34:01 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 9 Nov 2007 14:34:01 -0000 Received: (qmail 72499 invoked by uid 500); 9 Nov 2007 14:33:49 -0000 Delivered-To: apmail-maven-commits-archive@maven.apache.org Received: (qmail 72267 invoked by uid 500); 9 Nov 2007 14:33:48 -0000 Mailing-List: contact commits-help@maven.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@maven.apache.org Delivered-To: mailing list commits@maven.apache.org Received: (qmail 72029 invoked by uid 99); 9 Nov 2007 14:33:48 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 09 Nov 2007 06:33:47 -0800 X-ASF-Spam-Status: No, hits=-98.0 required=10.0 tests=ALL_TRUSTED,URIBL_BLACK X-Spam-Check-By: apache.org Received: from [140.211.11.3] (HELO eris.apache.org) (140.211.11.3) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 09 Nov 2007 14:34:35 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 9DC871A983E; Fri, 9 Nov 2007 06:33:35 -0800 (PST) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r593542 - /maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java Date: Fri, 09 Nov 2007 14:33:35 -0000 To: commits@maven.apache.org From: brianf@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20071109143335.9DC871A983E@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: brianf Date: Fri Nov 9 06:33:34 2007 New Revision: 593542 URL: http://svn.apache.org/viewvc?rev=593542&view=rev Log: enhancements to plugin versions rule. Modified: maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java Modified: maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java?rev=593542&r1=593541&r2=593542&view=diff ============================================================================== --- maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java (original) +++ maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java Fri Nov 9 06:33:34 2007 @@ -32,12 +32,14 @@ import java.util.Map.Entry; import org.apache.maven.BuildFailureException; +import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.artifact.resolver.ArtifactNotFoundException; import org.apache.maven.artifact.resolver.ArtifactResolutionException; import org.apache.maven.artifact.resolver.ArtifactResolver; import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException; +import org.apache.maven.artifact.versioning.VersionRange; import org.apache.maven.enforcer.rule.api.EnforcerRule; import org.apache.maven.enforcer.rule.api.EnforcerRuleException; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; @@ -49,6 +51,7 @@ import org.apache.maven.model.Model; import org.apache.maven.model.Plugin; import org.apache.maven.plugin.InvalidPluginException; +import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.PluginManager; import org.apache.maven.plugin.PluginManagerException; import org.apache.maven.plugin.PluginNotFoundException; @@ -102,14 +105,24 @@ * @parameter */ public boolean banRelease = true; - + /** - * The comma separated list of phases that should be used to find lifecycle plugin bindings. - * The default value is "clean,deploy,site". + * The comma separated list of phases that should be + * used to find lifecycle plugin bindings. The default + * value is "clean,deploy,site". + * * @parameter */ public String phases = "clean,deploy,site"; - + + /** + * Additional plugins to enforce have versions. These are plugins that may not be + * in the poms but are used anyway, like help, eclipse etc. + *
+ * The plugins should be specified in the form: group:artifactId. + */ + public List additionalPlugins; + private PluginManager pluginManager; private Map phaseToLifecycleMap; @@ -129,7 +142,7 @@ MavenSession session; EnforcerRuleUtils utils; - + public void execute ( EnforcerRuleHelper helper ) throws EnforcerRuleException { @@ -151,42 +164,27 @@ remoteRepositories = project.getRemoteArtifactRepositories(); utils = new EnforcerRuleUtils( helper ); - - // I couldn't find a direct way to get at the - // lifecycles list. - lifecycles = (List) ReflectionUtils.getValueIncludingSuperclasses( "lifecycles", life ); - Set allPlugins = new HashSet(); - - //lookup the bindings for all the passed in phases - String[] lifecyclePhases = this.phases.split( "," ); - for (int i = 0; i < lifecyclePhases.length;i++) - { - String lifecyclePhase = lifecyclePhases[i]; - if (StringUtils.isNotEmpty( lifecyclePhase )) - { - try - { - Lifecycle lifecycle = getLifecycleForPhase( lifecyclePhase ); - allPlugins.addAll( getAllPlugins( project, lifecycle )); - } - catch (BuildFailureException e) - { - //i'm going to swallow this because the user may have declared a phase that doesn't - //exist for every module. - } - } - } - - log.debug( "All Plugins: " + allPlugins ); + // get all the plugins that are bound to the + // specified lifecycles + Set allPlugins = getBoundPlugins( life, project, phases ); - //there's nothing to do here - if (allPlugins.isEmpty()) + //insert any additional Plugins specified by the user. + allPlugins = addAdditionalPlugins( allPlugins ); + + // there's nothing to do here + if ( allPlugins.isEmpty() ) { log.info( "No plugin bindings found." ); return; } - + else + { + log.debug( "All Plugins in use: " + allPlugins ); + } + + // get all the plugins that are mentioned in the + // pom (and parents) List plugins = getAllPluginEntries( project ); // now look for the versions that aren't valid @@ -212,7 +210,34 @@ while ( iter.hasNext() ) { Plugin plugin = (Plugin) iter.next(); - newMsg.append( plugin.getGroupId() + ":" + plugin.getArtifactId() + "\n" ); + + newMsg.append( plugin.getGroupId() ); + newMsg.append( ":" ); + newMsg.append( plugin.getArtifactId() ); + + try + { + newMsg.append( ". \tThe version currently in use is " ); + + Plugin currentPlugin = findCurrentPlugin( plugin, project ); + + if ( currentPlugin != null ) + { + newMsg.append( currentPlugin.getVersion() ); + } + else + { + newMsg.append( "unknown" ); + } + } + catch ( Exception e ) + { + //lots can go wrong here. Don't allow any issues trying to determine the issue + //stop me + log.debug( "Exception while determining plugin Version.",e ); + newMsg.append( ". Unable to determine the plugin version." ); + } + newMsg.append( "\n" ); } if ( StringUtils.isNotEmpty( message ) ) { @@ -258,6 +283,140 @@ { throw new EnforcerRuleException( e.getLocalizedMessage() ); } + catch ( MojoExecutionException e ) + { + throw new EnforcerRuleException( e.getLocalizedMessage() ); + } + } + + /** + * Add the additional plugins if they don't exist yet + * @throws MojoExecutionException + */ + public Set addAdditionalPlugins(Set existing) throws MojoExecutionException + { + if (additionalPlugins != null) + { + Iterator iter = additionalPlugins.iterator(); + while(iter.hasNext()) + { + String pluginString = (String)iter.next(); + String[] pluginStrings = pluginString.split( ":" ); + if (pluginStrings.length == 2) + { + Plugin plugin = new Plugin(); + plugin.setGroupId( pluginStrings[0] ); + plugin.setArtifactId( pluginStrings[1] ); + + //only add this if it's not already there. + if (!existing.contains( plugin )) + { + existing.add( plugin ); + } + } + else + { + throw new MojoExecutionException("Invalid AdditionalPlugin string: "+ pluginString); + } + } + + } + return existing; + } + + /** + * Given a plugin, this will retrieve the matching + * plugin artifact from the model. + * + * @param plugin to lookup + * @param project to search + * @return matching plugin, null if not found. + */ + protected Plugin findCurrentPlugin ( Plugin plugin, MavenProject project ) + { + Plugin found = null; + try + { + Model model = project.getModel(); + Map plugins = model.getBuild().getPluginsAsMap(); + found = (Plugin) plugins.get( plugin.getKey() ); + } + catch ( NullPointerException e ) + { + // nothing to do here + } + + if ( found == null ) + { + found = resolvePlugin( plugin, project ); + } + + return found; + } + + protected Plugin resolvePlugin ( Plugin plugin, MavenProject project ) + { + + List pluginRepositories = project.getPluginArtifactRepositories(); + Artifact artifact = factory.createPluginArtifact( plugin.getGroupId(), plugin.getArtifactId(), VersionRange + .createFromVersion( "LATEST" ) ); + + try + { + this.resolver.resolve( artifact, pluginRepositories, this.local ); + plugin.setVersion( artifact.getVersion() ); + } + catch ( ArtifactResolutionException e ) + { + } + catch ( ArtifactNotFoundException e ) + { + } + + return plugin; + } + + /** + * Gets the plugins that are bound to the defined phases + * + * @param life + * @param project + * @return + * @throws PluginNotFoundException + * @throws LifecycleExecutionException + * @throws IllegalAccessException + */ + protected Set getBoundPlugins ( LifecycleExecutor life, MavenProject project, String thePhases ) + throws PluginNotFoundException, LifecycleExecutionException, IllegalAccessException + { + // I couldn't find a direct way to get at the + // lifecycles list. + lifecycles = (List) ReflectionUtils.getValueIncludingSuperclasses( "lifecycles", life ); + + Set allPlugins = new HashSet(); + + // lookup the bindings for all the passed in phases + String[] lifecyclePhases = thePhases.split( "," ); + for ( int i = 0; i < lifecyclePhases.length; i++ ) + { + String lifecyclePhase = lifecyclePhases[i]; + if ( StringUtils.isNotEmpty( lifecyclePhase ) ) + { + try + { + Lifecycle lifecycle = getLifecycleForPhase( lifecyclePhase ); + allPlugins.addAll( getAllPlugins( project, lifecycle ) ); + } + catch ( BuildFailureException e ) + { + // i'm going to swallow this because the + // user may have declared a phase that + // doesn't + // exist for every module. + } + } + } + return allPlugins; } /* @@ -291,12 +450,12 @@ } // the version was specified and not // banned. It's ok. - - status = true; - - if (!banRelease && !banLatest) + + status = true; + + if ( !banRelease && !banLatest ) { - //no need to keep looking + // no need to keep looking break; } } @@ -562,7 +721,7 @@ return pluginDescriptor; } - /** + /** * Gets all plugin entries in build.plugins or * build.pluginManagement.plugins in this project and * all parents @@ -580,7 +739,7 @@ List plugins = new ArrayList(); // get all the pom models List models = utils.getModelsRecursively( project.getGroupId(), project.getArtifactId(), project.getVersion(), - new File( project.getBasedir(), "pom.xml" ) ); + new File( project.getBasedir(), "pom.xml" ) ); // now find all the plugin entries, either in // build.plugins or build.pluginManagement.plugins @@ -610,7 +769,6 @@ return plugins; } - /** * @return the banLatest */ @@ -675,7 +833,9 @@ this.utils = theUtils; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.apache.maven.enforcer.rule.api.EnforcerRule#getCacheId() */ public String getCacheId () @@ -683,7 +843,9 @@ return "0"; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isCacheable() */ public boolean isCacheable () @@ -691,7 +853,9 @@ return false; } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isResultValid(org.apache.maven.enforcer.rule.api.EnforcerRule) */ public boolean isResultValid ( EnforcerRule theCachedRule )