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.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   * @author Robert Scholte
39   * @since 1.3
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          // get the project
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          // consider including profile based artifacts
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          // CHECKSTYLE_OFF: LineLength
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          // CHECKSTYLE_ON: LineLength
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             // pattern is groupId[:artifactId[:type[:classifier]]]
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 }