1 package org.apache.maven.plugins.enforcer;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
35
36
37
38 public class BannedRepositories
39 extends AbstractNonCacheableEnforcerRule
40 {
41
42
43
44
45
46
47
48
49
50
51
52 private List<String> bannedRepositories = Collections.emptyList();
53
54
55
56
57
58
59 private List<String> bannedPluginRepositories = Collections.emptyList();
60
61
62
63
64
65
66
67 private List<String> allowedRepositories = Collections.emptyList();
68
69
70
71
72
73
74
75 private List<String> allowedPluginRepositories = Collections.emptyList();
76
77
78
79
80
81
82
83
84
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
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
146
147
148
149
150
151
152
153
154
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 }