View Javadoc
1   package org.apache.maven.plugins.enforcer;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *  http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import java.util.ArrayList;
23  import java.util.Collections;
24  import java.util.List;
25  
26  import org.apache.maven.artifact.repository.ArtifactRepository;
27  import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
28  import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
29  import org.apache.maven.project.MavenProject;
30  import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
31  import org.codehaus.plexus.util.StringUtils;
32  
33  /**
34   * This rule checks that this project's maven session whether have banned repositories.
35   * 
36   * @author <a href="mailto:wangyf2010@gmail.com">Simon Wang</a>
37   */
38  public class BannedRepositories
39      extends AbstractNonCacheableEnforcerRule
40  {
41  
42      // ----------------------------------------------------------------------
43      // Mojo parameters
44      // ----------------------------------------------------------------------
45  
46      /**
47       * Specify explicitly banned non-plugin repositories. This is a list of repository url patterns. Support wildcard
48       * "*".
49       * 
50       * @see {@link #setBannedRepositories(List)}
51       */
52      private List<String> bannedRepositories = Collections.emptyList();
53  
54      /**
55       * Specify explicitly banned plugin repositories. This is a list of repository url patterns. Support wildcard "*".
56       * 
57       * @see {@link #setBannedPluginRepositories(List)}
58       */
59      private List<String> bannedPluginRepositories = Collections.emptyList();
60  
61      /**
62       * Specify explicitly allowed non-plugin repositories, then all others repositories would be banned. This is a list
63       * of repository url patterns. Support wildcard "*".
64       * 
65       * @see {@link #setAllowedRepositories(List)}
66       */
67      private List<String> allowedRepositories = Collections.emptyList();
68  
69      /**
70       * Specify explicitly allowed plugin repositories, then all others repositories would be banned. This is a list of
71       * repository url patterns. Support wildcard "*".
72       * 
73       * @see {@link #setAllowedPluginRepositories(List)}
74       */
75      private List<String> allowedPluginRepositories = Collections.emptyList();
76  
77      // ----------------------------------------------------------------------
78      // Public methods
79      // ----------------------------------------------------------------------
80  
81      /*
82       * (non-Javadoc)
83       * @see
84       * org.apache.maven.enforcer.rule.api.EnforcerRule#execute(org.apache.maven.enforcer.rule.api.EnforcerRuleHelper)
85       */
86      @SuppressWarnings( "unchecked" )
87      public void execute( EnforcerRuleHelper helper )
88          throws EnforcerRuleException
89      {
90          MavenProject project;
91          try
92          {
93              project = (MavenProject) helper.evaluate( "${project}" );
94  
95              List<ArtifactRepository> resultBannedRepos =
96                  checkRepositories( project.getRemoteArtifactRepositories(), this.allowedRepositories,
97                                     this.bannedRepositories );
98  
99              List<ArtifactRepository> resultBannedPluginRepos =
100                 checkRepositories( project.getPluginArtifactRepositories(), this.allowedPluginRepositories,
101                                    this.bannedPluginRepositories );
102 
103             String repoErrMsg = populateErrorMessage( resultBannedRepos, " " );
104             String pluginRepoErrMsg = populateErrorMessage( resultBannedPluginRepos, " plugin " );
105 
106             String errMsg = repoErrMsg + pluginRepoErrMsg;
107 
108             if ( errMsg != null && !StringUtils.isEmpty( errMsg.toString() ) )
109             {
110                 throw new EnforcerRuleException( errMsg.toString() );
111             }
112 
113         }
114         catch ( ExpressionEvaluationException e )
115         {
116             throw new EnforcerRuleException( e.getLocalizedMessage() );
117         }
118     }
119 
120     // ----------------------------------------------------------------------
121     // Protected methods
122     // ----------------------------------------------------------------------
123 
124     protected void setBannedRepositories( List<String> bannedRepositories )
125     {
126         this.bannedRepositories = bannedRepositories;
127     }
128 
129     protected void setBannedPluginRepositories( List<String> bannedPluginRepositories )
130     {
131         this.bannedPluginRepositories = bannedPluginRepositories;
132     }
133 
134     protected void setAllowedRepositories( List<String> allowedRepositories )
135     {
136         this.allowedRepositories = allowedRepositories;
137     }
138 
139     protected void setAllowedPluginRepositories( List<String> allowedPluginRepositories )
140     {
141         this.allowedPluginRepositories = allowedPluginRepositories;
142     }
143 
144     // ----------------------------------------------------------------------
145     // Private methods
146     // ----------------------------------------------------------------------
147 
148     /**
149      * Check whether specified repositories have banned repositories.
150      * 
151      * @param repositories: candidate repositories.
152      * @param includes : 'include' patterns.
153      * @param excludes : 'exclude' patterns.
154      * @return Banned repositories.
155      */
156     private List<ArtifactRepository> checkRepositories( List<ArtifactRepository> repositories, List<String> includes,
157                                                         List<String> excludes )
158     {
159         List<ArtifactRepository> bannedRepos = new ArrayList<ArtifactRepository>();
160 
161         for ( ArtifactRepository repo : repositories )
162         {
163             String url = repo.getUrl().trim();
164             if ( includes.size() > 0 && !match( url, includes ) )
165             {
166                 bannedRepos.add( repo );
167                 continue;
168             }
169 
170             if ( excludes.size() > 0 && match( url, excludes ) )
171             {
172                 bannedRepos.add( repo );
173             }
174 
175         }
176 
177         return bannedRepos;
178     }
179 
180     private boolean match( String url, List<String> patterns )
181     {
182         for ( String pattern : patterns )
183         {
184             if ( this.match( url, pattern ) )
185             {
186                 return true;
187             }
188         }
189 
190         return false;
191     }
192 
193     private boolean match( String text, String pattern )
194     {
195         return text.matches( pattern.replace( "?", ".?" ).replace( "*", ".*?" ) );
196     }
197 
198     private String populateErrorMessage( List<ArtifactRepository> resultBannedRepos, String errorMessagePrefix )
199     {
200         StringBuffer errMsg = new StringBuffer( "" );
201         if ( !resultBannedRepos.isEmpty() )
202         {
203             errMsg.append( "Current maven session contains banned" + errorMessagePrefix
204                 + "repository urls, please double check your pom or settings.xml:\n"
205                 + getRepositoryUrlString( resultBannedRepos ) + "\n\n" );
206         }
207 
208         return errMsg.toString();
209     }
210 
211     private String getRepositoryUrlString( List<ArtifactRepository> resultBannedRepos )
212     {
213         StringBuffer urls = new StringBuffer( "" );
214         for ( ArtifactRepository repo : resultBannedRepos )
215         {
216             urls.append( repo.getId() + " - " + repo.getUrl() + "\n" );
217         }
218         return urls.toString();
219     }
220 
221 }