View Javadoc
1   package org_scala_tools_maven_dependency;
2   
3   import org.apache.maven.artifact.Artifact;
4   import org.apache.maven.plugin.logging.Log;
5   import org.apache.maven.shared.dependency.tree.DependencyNode;
6   import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
7   import org_scala_tools_maven.VersionNumber;
8   
9   import java.util.ArrayList;
10  import java.util.List;
11  
12  import static org_scala_tools_maven_dependency.ScalaConstants.*;
13  /**
14   * Ensures that all scala versions match the given version.
15   * @author JSuereth
16   *
17   */
18  public class CheckScalaVersionVisitor implements DependencyNodeVisitor {
19      private VersionNumber _version;
20      private boolean _failed = false;
21      private Log _log;
22  
23      private List<String> scalaDependentArtifactStrings = new ArrayList<String>();
24  
25      public boolean endVisit(@SuppressWarnings("unused") DependencyNode node) {
26          return !_failed;
27      }
28  
29      public CheckScalaVersionVisitor(String projectVerison, Log log) {
30          this._version = new VersionNumber(projectVerison);
31          this._log = log;
32      }
33  
34      public boolean isScalaDistroArtifact(Artifact artifact) {
35          return SCALA_DISTRO_GROUP.equalsIgnoreCase(artifact.getGroupId()) &&
36          SCALA_DISTRO_ARTIFACTS.contains(artifact.getArtifactId());
37      }
38      public boolean visit(DependencyNode node) {
39          //TODO - Do we care about provided scope?
40          Artifact artifact = node.getArtifact();
41          _log.debug("checking ["+artifact+"] for scala version");
42          //TODO - Handle version ranges???? does that make sense given scala's binary incompatability!
43          if(isScalaDistroArtifact(artifact) && artifact.getVersion() != null) {
44              VersionNumber originalVersion = new VersionNumber(artifact.getVersion());
45              if(originalVersion.compareTo(_version) != 0) {
46                  _failed = true;
47              }
48              //If this dependency is transitive, we want to track which artifact requires this...
49              if(node.getParent() != null) { //TODO - Go all the way up the parent chain till we hit the bottom....
50                  final Artifact parentArtifact = node.getParent().getArtifact();
51                  scalaDependentArtifactStrings.add(" " + StringUtil.makeArtifactNameString(parentArtifact) + " requires scala version: " + originalVersion);
52              }
53          } else {
54              //TODO - What now?
55          }
56          return !_failed;
57      }
58  
59      public boolean isFailed() {
60          return _failed;
61      }
62      public void logScalaDependents() {
63          _log.warn(" Expected all dependencies to require Scala version: " + _version);
64          for(String dependString : scalaDependentArtifactStrings) {
65              _log.warn(dependString);
66          }
67      }
68  }