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.Collection;
24 import java.util.HashSet;
25 import java.util.LinkedHashMap;
26 import java.util.List;
27 import java.util.Map;
28 import java.util.Set;
29 import java.util.regex.Pattern;
30
31 import org.apache.maven.artifact.Artifact;
32 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
33 import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
34 import org.apache.maven.project.MavenProject;
35 import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
36
37
38
39
40
41 public class RequireSameVersions
42 extends AbstractNonCacheableEnforcerRule
43 {
44 private boolean uniqueVersions;
45
46 private Set<String> dependencies = new HashSet<String>();
47
48 private Set<String> plugins = new HashSet<String>();
49
50 private Set<String> buildPlugins = new HashSet<String>();
51
52 private Set<String> reportPlugins = new HashSet<String>();
53
54 public void execute( EnforcerRuleHelper helper )
55 throws EnforcerRuleException
56 {
57
58 MavenProject project = null;
59 try
60 {
61 project = (MavenProject) helper.evaluate( "${project}" );
62 }
63 catch ( ExpressionEvaluationException eee )
64 {
65 throw new EnforcerRuleException( "Unable to retrieve the MavenProject: ", eee );
66 }
67
68
69 Map<String, List<String>> versionMembers = new LinkedHashMap<String, List<String>>();
70
71 Set<String> buildPluginSet = new HashSet<String>( buildPlugins );
72 buildPluginSet.addAll( plugins );
73 Set<String> reportPluginSet = new HashSet<String>( reportPlugins );
74 reportPluginSet.addAll( plugins );
75
76
77 versionMembers.putAll( collectVersionMembers( project.getArtifacts(), dependencies, " (dependency)" ) );
78 versionMembers.putAll( collectVersionMembers( project.getPluginArtifacts(), buildPlugins, " (buildPlugin)" ) );
79 versionMembers.putAll( collectVersionMembers( project.getReportArtifacts(), reportPlugins, " (reportPlugin)" ) );
80
81
82 if ( versionMembers.size() > 1 )
83 {
84 StringBuilder builder = new StringBuilder( "Found entries with different versions\n" );
85 for ( Map.Entry<String, List<String>> entry : versionMembers.entrySet() )
86 {
87 builder.append( "Entries with version " ).append( entry.getKey() ).append( '\n' );
88 for ( String conflictId : entry.getValue() )
89 {
90 builder.append( "- " ).append( conflictId ).append( '\n' );
91 }
92 }
93 throw new EnforcerRuleException( builder.toString() );
94 }
95 }
96
97 private Map<String, List<String>> collectVersionMembers( Set<Artifact> artifacts, Collection<String> patterns,
98 String source )
99 {
100 Map<String, List<String>> versionMembers = new LinkedHashMap<String, List<String>>();
101
102 List<Pattern> regExs = new ArrayList<Pattern>();
103 for ( String pattern : patterns )
104 {
105 String regex = pattern.replace( ".", "\\." ).replace( "*", ".*" ).replace( ":", "\\:" ).replace( '?', '.' );
106
107
108 regExs.add( Pattern.compile( regex + "(\\:.+)?" ) );
109 }
110
111 for ( Artifact artifact : artifacts )
112 {
113 for ( Pattern regEx : regExs )
114 {
115 if ( regEx.matcher( artifact.getDependencyConflictId() ).matches() )
116 {
117 String version = uniqueVersions ? artifact.getVersion() : artifact.getBaseVersion();
118 if ( !versionMembers.containsKey( version ) )
119 {
120 versionMembers.put( version, new ArrayList<String>() );
121 }
122 versionMembers.get( version ).add( artifact.getDependencyConflictId() + source );
123 }
124 }
125 }
126 return versionMembers;
127 }
128
129 }