Author: khmarbaise
Date: Sun Jun 15 18:35:23 2014
New Revision: 1602751

URL: http://svn.apache.org/r1602751
Log:
[MENFORCER-195]
 - Add new rule: BannedRepositories to ban specified repositories for
   whole maven session
 - Added Simon Wang as contributor.

Added:
    
maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedRepositories.java
    maven/enforcer/trunk/enforcer-rules/src/site/apt/bannedRepositories.apt.vm
    
maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestBannedRepositories.java
Modified:
    maven/enforcer/trunk/enforcer-rules/src/site/apt/index.apt
    
maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/MockProject.java
    maven/enforcer/trunk/pom.xml

Added: 
maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedRepositories.java
URL: 
http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedRepositories.java?rev=1602751&view=auto
==============================================================================
--- 
maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedRepositories.java
 (added)
+++ 
maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/BannedRepositories.java
 Sun Jun 15 18:35:23 2014
@@ -0,0 +1,221 @@
+package org.apache.maven.plugins.enforcer;
+
+/*
+ * 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.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+import org.apache.maven.project.MavenProject;
+import 
org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+import org.codehaus.plexus.util.StringUtils;
+
+/**
+ * This rule checks that this project's maven session whether have banned 
repositories.
+ * 
+ * @author <a href="mailto:wangyf2...@gmail.com";>Simon Wang</a>
+ */
+public class BannedRepositories
+    extends AbstractNonCacheableEnforcerRule
+{
+
+    // ----------------------------------------------------------------------
+    // Mojo parameters
+    // ----------------------------------------------------------------------
+
+    /**
+     * Specify explicitly banned non-plugin repositories. This is a list of 
repository url patterns. Support wildcard
+     * "*".
+     * 
+     * @see {@link #setBannedRepositories(List)}
+     */
+    private List<String> bannedRepositories = Collections.emptyList();
+
+    /**
+     * Specify explicitly banned plugin repositories. This is a list of 
repository url patterns. Support wildcard "*".
+     * 
+     * @see {@link #setBannedPluginRepositories(List)}
+     */
+    private List<String> bannedPluginRepositories = Collections.emptyList();
+
+    /**
+     * Specify explicitly allowed non-plugin repositories, then all others 
repositories would be banned. This is a list
+     * of repository url patterns. Support wildcard "*".
+     * 
+     * @see {@link #setAllowedRepositories(List)}
+     */
+    private List<String> allowedRepositories = Collections.emptyList();
+
+    /**
+     * Specify explicitly allowed plugin repositories, then all others 
repositories would be banned. This is a list of
+     * repository url patterns. Support wildcard "*".
+     * 
+     * @see {@link #setAllowedPluginRepositories(List)}
+     */
+    private List<String> allowedPluginRepositories = Collections.emptyList();
+
+    // ----------------------------------------------------------------------
+    // Public methods
+    // ----------------------------------------------------------------------
+
+    /*
+     * (non-Javadoc)
+     * @see
+     * 
org.apache.maven.enforcer.rule.api.EnforcerRule#execute(org.apache.maven.enforcer.rule.api.EnforcerRuleHelper)
+     */
+    @SuppressWarnings( "unchecked" )
+    public void execute( EnforcerRuleHelper helper )
+        throws EnforcerRuleException
+    {
+        MavenProject project;
+        try
+        {
+            project = (MavenProject) helper.evaluate( "${project}" );
+
+            List<ArtifactRepository> resultBannedRepos =
+                checkRepositories( project.getRemoteArtifactRepositories(), 
this.allowedRepositories,
+                                   this.bannedRepositories );
+
+            List<ArtifactRepository> resultBannedPluginRepos =
+                checkRepositories( project.getPluginArtifactRepositories(), 
this.allowedPluginRepositories,
+                                   this.bannedPluginRepositories );
+
+            String repoErrMsg = populateErrorMessage( resultBannedRepos, " " );
+            String pluginRepoErrMsg = populateErrorMessage( 
resultBannedPluginRepos, " plugin " );
+
+            String errMsg = repoErrMsg + pluginRepoErrMsg;
+
+            if ( errMsg != null && !StringUtils.isEmpty( errMsg.toString() ) )
+            {
+                throw new EnforcerRuleException( errMsg.toString() );
+            }
+
+        }
+        catch ( ExpressionEvaluationException e )
+        {
+            throw new EnforcerRuleException( e.getLocalizedMessage() );
+        }
+    }
+
+    // ----------------------------------------------------------------------
+    // Protected methods
+    // ----------------------------------------------------------------------
+
+    protected void setBannedRepositories( List<String> bannedRepositories )
+    {
+        this.bannedRepositories = bannedRepositories;
+    }
+
+    protected void setBannedPluginRepositories( List<String> 
bannedPluginRepositories )
+    {
+        this.bannedPluginRepositories = bannedPluginRepositories;
+    }
+
+    protected void setAllowedRepositories( List<String> allowedRepositories )
+    {
+        this.allowedRepositories = allowedRepositories;
+    }
+
+    protected void setAllowedPluginRepositories( List<String> 
allowedPluginRepositories )
+    {
+        this.allowedPluginRepositories = allowedPluginRepositories;
+    }
+
+    // ----------------------------------------------------------------------
+    // Private methods
+    // ----------------------------------------------------------------------
+    
+    /**
+     * Check whether specified repositories have banned repositories. 
+     * 
+     * @param repositories: candidate repositories.
+     * @param includes : 'include' patterns.
+     * @param excludes : 'exclude' patterns.
+     * @return Banned repositories.
+     */
+    private List<ArtifactRepository> checkRepositories( 
List<ArtifactRepository> repositories, List<String> includes,
+                                                        List<String> excludes )
+    {
+        List<ArtifactRepository> bannedRepos = new 
ArrayList<ArtifactRepository>();
+
+        for ( ArtifactRepository repo : repositories )
+        {
+            String url = repo.getUrl().trim();
+            if ( includes.size()>0 && !match( url, includes ) )
+            {
+                bannedRepos.add( repo );
+                continue;
+            }
+
+            if ( excludes.size()>0 && match( url, excludes ) )
+            {
+                bannedRepos.add( repo );
+            }
+
+        }
+
+        return bannedRepos;
+    }
+
+    private boolean match( String url, List<String> patterns )
+    {
+        for ( String pattern : patterns )
+        {
+            if ( this.match( url, pattern ) )
+            {
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    private boolean match( String text, String pattern )
+    {
+        return text.matches( pattern.replace( "?", ".?" ).replace( "*", ".*?" 
) );
+    }
+    
+    private String populateErrorMessage( List<ArtifactRepository> 
resultBannedRepos, String errorMessagePrefix )
+    {
+        StringBuffer errMsg = new StringBuffer( "" );
+        if ( !resultBannedRepos.isEmpty() )
+        {
+            errMsg.append( "Current maven session contains banned" + 
errorMessagePrefix
+                + "repository urls, please double check your pom or 
settings.xml:\n"
+                + getRepositoryUrlString( resultBannedRepos ) + "\n\n" );
+        }
+
+        return errMsg.toString();
+    }
+
+    private String getRepositoryUrlString( List<ArtifactRepository> 
resultBannedRepos )
+    {
+        StringBuffer urls = new StringBuffer( "" );
+        for ( ArtifactRepository repo : resultBannedRepos )
+        {
+            urls.append( repo.getId() + " - " + repo.getUrl() + "\n" );
+        }
+        return urls.toString();
+    }
+
+}

Added: 
maven/enforcer/trunk/enforcer-rules/src/site/apt/bannedRepositories.apt.vm
URL: 
http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/site/apt/bannedRepositories.apt.vm?rev=1602751&view=auto
==============================================================================
--- maven/enforcer/trunk/enforcer-rules/src/site/apt/bannedRepositories.apt.vm 
(added)
+++ maven/enforcer/trunk/enforcer-rules/src/site/apt/bannedRepositories.apt.vm 
Sun Jun 15 18:35:23 2014
@@ -0,0 +1,119 @@
+~~ 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.
+
+  ------
+  Banned Specified Repositories
+  ------
+  Simon Wang
+  ------
+  June 2014
+  ------
+
+Banned Specified Repositories
+
+   This rule checks whether this maven session (defined in pom files or even 
settings.xml) include specified banned repository.
+
+* What's difference from "requireNoRepositories"?
+
+   The purpose for "requireNoRepositories" is: Detect whether pom and pom’s 
parents contains repositories definition. That guide users to use correct 
convention (not define repositories in pom files). So it only analyze current 
pom and its parent pom files.
+
+   But “BannedRepositories” is different purpose, it’s just like 
“BannedDependencies”. It will detect banned repositories from maven session 
context instead of only pom.xml and parents. It's trying to avoid misuse 
incorrect repositories. It will detect banned repositories from current maven 
session context.
+
+* Support Parameters
+
+   * banRepositories - Specify banned non-plugin repositories. This is a black 
list of http/https url patterns.
+
+   * banPluginRepositories - Specify banned plugin repositories. This is a 
black list of http/https url patterns.
+
+   * allowedRepositories - Specify explicitly allowed non-plugin repositories. 
This is a white list of http/https url patterns.
+
+   * allowedPluginRepositories - Specify explicitly allowed plugin 
repositories. This is a white list of http/https url patternes.
+
+* Sample Configuration
+
+   For example, one company want to limit repositories usage. But different 
developers might use different settings.xml.
+   Even their projects' pom defined different repostories too.
+   For this case, could leverage this enforcer rule to banned specified 
repositories or even use allowedRepositories/allowedPluginRepositories to 
banned others unexpected repositories.
+   
+   Ex. http://repo1/xyz is the repository that want to be banned.
+       http://repo2/xyz is the repository that want to use now.
+   
+   Sample Plugin Configuration:
+
++---+
+<project>
+  [...]
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <version>${project.version}</version>
+        <executions>
+          <execution>
+            <id>enforce-banned-repositories</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <bannedRepositories>
+                  <bannedRepositories>
+                    <bannedRepository>http://repo1/*<bannedRepository>
+                  </bannedRepositories>
+                  <bannedPluginRepositories>
+                    
<bannedPluginRepository>http://repo1/*<bannedPluginRepository>
+                  </bannedPluginRepositories>
+                                 
+                  <!-- for some cases, white list is more effective -->
+                  <!--
+                                 
+                  <allowedRepositories>
+                    <allowedRepository>http://repo2/*<allowedRepository>
+                  </allowedRepositories>
+                  <allowedPluginRepositories>
+                    
<allowedPluginRepository>http://repo2/*<allowedPluginRepository>
+                  </allowedPluginRepositories>
+                                 
+                  -->
+                </bannedRepositories>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+  [...]
+</project>
++---+
+
+* Worth to Note
+
+   * http/https url patterns support wildcard "*"
+   
+   * This rule will detect banned repositories on maven session itself istead 
of pom or settings, so if users defined "mirrorOf" in settings.xml, even 
defined banned repositories in pom.xml, it won't be detected.
+
++---+
+       <mirrors>
+        <mirror>
+          <id>nexus</id>
+          <mirrorOf>*</mirrorOf>
+          <url>http://.../nexus/..</url>
+        </mirror>
+       </mirrors>
++---+ 

Modified: maven/enforcer/trunk/enforcer-rules/src/site/apt/index.apt
URL: 
http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/site/apt/index.apt?rev=1602751&r1=1602750&r2=1602751&view=diff
==============================================================================
--- maven/enforcer/trunk/enforcer-rules/src/site/apt/index.apt (original)
+++ maven/enforcer/trunk/enforcer-rules/src/site/apt/index.apt Sun Jun 15 
18:35:23 2014
@@ -57,6 +57,8 @@ Standard Rules
 
   * {{{./requireNoRepositories.html}requireNoRepositories}} - enforces to not 
include repositories.
 
+  * {{{./bannedRepositories.html}bannedRepositories}} - enforces to not 
include banned repositories.
+
   * {{{./requireOS.html}requireOS}} - enforces the OS / CPU Architecture.
 
   * {{{./requirePluginVersions.html}requirePluginVersions}} - enforces that 
all plugins have a specified version.

Modified: 
maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/MockProject.java
URL: 
http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/MockProject.java?rev=1602751&r1=1602750&r2=1602751&view=diff
==============================================================================
--- 
maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/MockProject.java
 (original)
+++ 
maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/MockProject.java
 Sun Jun 15 18:35:23 2014
@@ -100,6 +100,9 @@ public class MockProject
 
     /** The plugin artifact repositories. */
     private List pluginArtifactRepositories;
+    
+    /** The artifact repositories. */
+    private List artifactRepositories;
 
     // private ArtifactRepository releaseArtifactRepository;
 
@@ -298,7 +301,7 @@ public class MockProject
      */
     public void setRemoteArtifactRepositories( List list )
     {
-
+        this.artifactRepositories = list;
     }
 
     /*
@@ -308,7 +311,7 @@ public class MockProject
      */
     public List getRemoteArtifactRepositories()
     {
-        return Collections.singletonList( "" );
+        return artifactRepositories;
     }
 
     /*

Added: 
maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestBannedRepositories.java
URL: 
http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestBannedRepositories.java?rev=1602751&view=auto
==============================================================================
--- 
maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestBannedRepositories.java
 (added)
+++ 
maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestBannedRepositories.java
 Sun Jun 15 18:35:23 2014
@@ -0,0 +1,159 @@
+package org.apache.maven.plugins.enforcer;
+
+/*
+ * 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.ArrayList;
+import java.util.List;
+
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.DefaultArtifactRepository;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+import org.codehaus.plexus.PlexusTestCase;
+
+/**
+ * Test the "banned repositories" rule.
+ * 
+ * @author <a href="mailto:wangyf2...@gmail.com";>Simon Wang</a>
+ */
+public class TestBannedRepositories
+    extends PlexusTestCase
+{
+    private EnforcerRuleHelper helper;
+
+    private BannedRepositories rule;
+
+    private MockProject project;
+
+    public void setUp()
+        throws Exception
+    {
+        super.setUp();
+
+        rule = new BannedRepositories();
+        rule.setMessage( "my message" );
+
+        project = new MockProject();
+        project.setGroupId( "org.apache.maven.plugins.enforcer.test" );
+        project.setVersion( "1.0-SNAPSHOT" );
+
+        helper = EnforcerTestUtils.getHelper( project );
+    }
+
+    public void testNoCheckRules()
+        throws EnforcerRuleException
+    {
+        DefaultArtifactRepository repo1 = new DefaultArtifactRepository( 
"repo1", "http://repo1/";, null );
+        List<ArtifactRepository> repos = new ArrayList<ArtifactRepository>();
+        repos.add( repo1 );
+
+        project.setRemoteArtifactRepositories( repos );
+        project.setPluginArtifactRepositories( repos );
+
+        rule.execute( helper );
+    }
+
+    public void testBannedRepositories()
+    {
+        DefaultArtifactRepository repo1 = new DefaultArtifactRepository( 
"repo1", "http://repo1/";, null );
+        DefaultArtifactRepository repo2 = new DefaultArtifactRepository( 
"repo1", "http://repo1/test";, null );
+        DefaultArtifactRepository repo3 = new DefaultArtifactRepository( 
"repo1", "http://repo2/test";, null );
+        List<ArtifactRepository> repos = new ArrayList<ArtifactRepository>();
+        repos.add( repo1 );
+        repos.add( repo2 );
+        repos.add( repo3 );
+
+        project.setRemoteArtifactRepositories( repos );
+        project.setPluginArtifactRepositories( repos );
+
+        List<String> bannedRepositories = new ArrayList<String>();
+        String pattern1 = "http://repo1/*";;
+
+        bannedRepositories.add( pattern1 );
+
+        rule.setBannedRepositories( bannedRepositories );
+
+        try
+        {
+            rule.execute( helper );
+            fail( "should throw exception" );
+        }
+        catch ( EnforcerRuleException e )
+        {
+        }
+
+    }
+
+    public void testAllowedRepositoriesAllOK()
+        throws EnforcerRuleException
+    {
+        DefaultArtifactRepository repo1 = new DefaultArtifactRepository( 
"repo1", "http://repo1/";, null );
+        DefaultArtifactRepository repo2 = new DefaultArtifactRepository( 
"repo1", "http://repo1/test";, null );
+
+        List<ArtifactRepository> repos = new ArrayList<ArtifactRepository>();
+        repos.add( repo1 );
+        repos.add( repo2 );
+
+        project.setRemoteArtifactRepositories( repos );
+        project.setPluginArtifactRepositories( repos );
+
+        List<String> bannedRepositories = new ArrayList<String>();
+        String pattern1 = "http://repo1/*";;
+
+        bannedRepositories.add( pattern1 );
+
+        rule.setAllowedRepositories( bannedRepositories );
+        rule.setAllowedPluginRepositories( bannedRepositories );
+
+        rule.execute( helper );
+    }
+
+    public void testAllowedRepositoriesException()
+    {
+        DefaultArtifactRepository repo1 = new DefaultArtifactRepository( 
"repo1", "http://repo1/";, null );
+        DefaultArtifactRepository repo2 = new DefaultArtifactRepository( 
"repo1", "http://repo1/test";, null );
+        DefaultArtifactRepository repo3 = new DefaultArtifactRepository( 
"repo1", "http://repo2/test";, null );
+        List<ArtifactRepository> repos = new ArrayList<ArtifactRepository>();
+        repos.add( repo1 );
+        repos.add( repo2 );
+        repos.add( repo3 );
+
+        project.setRemoteArtifactRepositories( repos );
+        project.setPluginArtifactRepositories( repos );
+
+        List<String> patterns = new ArrayList<String>();
+        String pattern1 = "http://repo1/*";;
+
+        patterns.add( pattern1 );
+
+        rule.setAllowedPluginRepositories( patterns );
+        rule.setAllowedRepositories( patterns );
+
+        try
+        {
+            rule.execute( helper );
+            fail( "should throw exception" );
+        }
+        catch ( EnforcerRuleException e )
+        {
+        }
+
+    }
+}

Modified: maven/enforcer/trunk/pom.xml
URL: 
http://svn.apache.org/viewvc/maven/enforcer/trunk/pom.xml?rev=1602751&r1=1602750&r2=1602751&view=diff
==============================================================================
--- maven/enforcer/trunk/pom.xml (original)
+++ maven/enforcer/trunk/pom.xml Sun Jun 15 18:35:23 2014
@@ -220,6 +220,13 @@
     </dependencies>
   </dependencyManagement>
 
+  <contributors>
+    <contributor>
+      <name>Simon Wang</name>
+      <email>wangyf2...@gmail.com</email>
+      <organization>eBay Inc.</organization>
+    </contributor>
+  </contributors>
   <build>
     <resources>
       <!-- Include super-pom defined main/resources


Reply via email to