You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ws.apache.org by ve...@apache.org on 2016/05/01 13:42:46 UTC

svn commit: r1741860 - /webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/

Author: veithen
Date: Sun May  1 11:42:45 2016
New Revision: 1741860

URL: http://svn.apache.org/viewvc?rev=1741860&view=rev
Log:
Enforce distinction between class and package references.

Added:
    webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/Clazz.java   (with props)
    webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/Package.java   (with props)
Modified:
    webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/ClassProcessor.java
    webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/EnforceMojo.java
    webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/Reference.java
    webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/ReferenceCollector.java
    webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/ReferenceProcessor.java

Modified: webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/ClassProcessor.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/ClassProcessor.java?rev=1741860&r1=1741859&r2=1741860&view=diff
==============================================================================
--- webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/ClassProcessor.java (original)
+++ webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/ClassProcessor.java Sun May  1 11:42:45 2016
@@ -39,7 +39,7 @@ final class ClassProcessor extends Class
             String[] interfaces) {
         deprecated = (access & Opcodes.ACC_DEPRECATED) != 0;
         if (!deprecated) {
-            referenceProcessor = new ReferenceProcessor(referenceCollector, Type.getObjectType(name).getClassName());
+            referenceProcessor = new ReferenceProcessor(referenceCollector, new Clazz(Type.getObjectType(name).getClassName()));
             referenceProcessor.processType(Type.getObjectType(superName));
             for (String iface : interfaces) {
                 referenceProcessor.processType(Type.getObjectType(iface));

Added: webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/Clazz.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/Clazz.java?rev=1741860&view=auto
==============================================================================
--- webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/Clazz.java (added)
+++ webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/Clazz.java Sun May  1 11:42:45 2016
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.buildutils.enforcer;
+
+final class Clazz {
+    private final String name;
+
+    Clazz(String name) {
+        this.name = name;
+    }
+
+    String getName() {
+        return name;
+    }
+
+    Package getPackage() {
+        return new Package(name.substring(0, name.lastIndexOf('.')));
+    }
+    
+    @Override
+    public int hashCode() {
+        return name.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        return obj instanceof Clazz && ((Clazz)obj).name.equals(name);
+    }
+
+    @Override
+    public String toString() {
+        return name;
+    }
+}

Propchange: webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/Clazz.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/EnforceMojo.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/EnforceMojo.java?rev=1741860&r1=1741859&r2=1741860&view=diff
==============================================================================
--- webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/EnforceMojo.java (original)
+++ webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/EnforceMojo.java Sun May  1 11:42:45 2016
@@ -47,11 +47,11 @@ public class EnforceMojo extends Abstrac
         if (!classesDir.exists()) {
             return;
         }
-        Set<Reference> ignoredClassReferences = new HashSet<Reference>();
+        Set<Reference<Clazz>> ignoredClassReferences = new HashSet<>();
         if (ignore != null) {
             for (String ignoreRule : ignore.split(",")) {
                 String[] s = ignoreRule.split("->");
-                ignoredClassReferences.add(new Reference(s[0].trim(), s[1].trim()));
+                ignoredClassReferences.add(new Reference<Clazz>(new Clazz(s[0].trim()), new Clazz(s[1].trim())));
             }
         }
         DirectoryScanner ds = new DirectoryScanner();
@@ -71,10 +71,10 @@ public class EnforceMojo extends Abstrac
                 throw new MojoExecutionException("Failed to read " + relativePath + ": " + ex.getMessage(), ex);
             }
         }
-        Set<Reference> references = referenceCollector.getClassReferencesForPackageCycle();
+        Set<Reference<Clazz>> references = referenceCollector.getClassReferencesForPackageCycle();
         if (references != null) {
             StringBuilder buffer = new StringBuilder("Package cycle detected. Classes involved:");
-            for (Reference reference : references) {
+            for (Reference<Clazz> reference : references) {
                 buffer.append("\n  ");
                 buffer.append(reference.getFrom());
                 buffer.append(" -> ");
@@ -82,10 +82,10 @@ public class EnforceMojo extends Abstrac
             }
             throw new MojoFailureException(buffer.toString());
         }
-        Set<Reference> unusedIgnoredClassReferences = referenceCollector.getUnusedIgnoredClassReferences();
+        Set<Reference<Clazz>> unusedIgnoredClassReferences = referenceCollector.getUnusedIgnoredClassReferences();
         if (!unusedIgnoredClassReferences.isEmpty()) {
             StringBuilder buffer = new StringBuilder("Found unused ignored class references:");
-            for (Reference reference : unusedIgnoredClassReferences) {
+            for (Reference<Clazz> reference : unusedIgnoredClassReferences) {
                 buffer.append("\n  ");
                 buffer.append(reference.getFrom());
                 buffer.append(" -> ");

Added: webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/Package.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/Package.java?rev=1741860&view=auto
==============================================================================
--- webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/Package.java (added)
+++ webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/Package.java Sun May  1 11:42:45 2016
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.axiom.buildutils.enforcer;
+
+final class Package {
+    private final String name;
+
+    Package(String name) {
+        this.name = name;
+    }
+
+    String getName() {
+        return name;
+    }
+
+    @Override
+    public int hashCode() {
+        return name.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        return obj instanceof Package && ((Package)obj).name.equals(name);
+    }
+
+    @Override
+    public String toString() {
+        return name;
+    }
+}

Propchange: webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/Package.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/Reference.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/Reference.java?rev=1741860&r1=1741859&r2=1741860&view=diff
==============================================================================
--- webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/Reference.java (original)
+++ webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/Reference.java Sun May  1 11:42:45 2016
@@ -18,20 +18,20 @@
  */
 package org.apache.axiom.buildutils.enforcer;
 
-final class Reference {
-    private final String from;
-    private final String to;
+final class Reference<T> {
+    private final T from;
+    private final T to;
     
-    Reference(String from, String to) {
+    Reference(T from, T to) {
         this.from = from;
         this.to = to;
     }
 
-    public String getFrom() {
+    public T getFrom() {
         return from;
     }
 
-    public String getTo() {
+    public T getTo() {
         return to;
     }
 
@@ -43,7 +43,7 @@ final class Reference {
     @Override
     public boolean equals(Object obj) {
         if (obj instanceof Reference) {
-            Reference other = (Reference)obj;
+            Reference<?> other = (Reference<?>)obj;
             return from.equals(other.from) && to.equals(other.to);
         } else {
             return false;

Modified: webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/ReferenceCollector.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/ReferenceCollector.java?rev=1741860&r1=1741859&r2=1741860&view=diff
==============================================================================
--- webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/ReferenceCollector.java (original)
+++ webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/ReferenceCollector.java Sun May  1 11:42:45 2016
@@ -25,34 +25,30 @@ import java.util.Map;
 import java.util.Set;
 
 import org.jgrapht.DirectedGraph;
+import org.jgrapht.EdgeFactory;
 import org.jgrapht.alg.StrongConnectivityInspector;
 import org.jgrapht.graph.DefaultDirectedGraph;
 import org.jgrapht.graph.DirectedSubgraph;
 
 final class ReferenceCollector {
-    private final Set<Reference> ignoredClassReferences;
-    private final Set<Reference> unusedIgnoredClassReferences;
-    private final Set<Reference> packageReferences = new HashSet<>();
-    private final Map<Reference,Reference> classReferenceSamples = new HashMap<>();
+    private final Set<Reference<Clazz>> ignoredClassReferences;
+    private final Set<Reference<Clazz>> unusedIgnoredClassReferences;
+    private final Set<Reference<Package>> packageReferences = new HashSet<>();
+    private final Map<Reference<Package>,Reference<Clazz>> classReferenceSamples = new HashMap<>();
     
-    ReferenceCollector(Set<Reference> ignoredClassReferences) {
+    ReferenceCollector(Set<Reference<Clazz>> ignoredClassReferences) {
         this.ignoredClassReferences = ignoredClassReferences;
         unusedIgnoredClassReferences = new HashSet<>(ignoredClassReferences);
     }
 
-    private static String getPackageName(String className) {
-        return className.substring(0, className.lastIndexOf('.'));
-    }
-    
-    void collectClassReference(String from, String to) {
-        Reference classReference = new Reference(from, to);
+    void collectClassReference(Reference<Clazz> classReference) {
         if (ignoredClassReferences.contains(classReference)) {
             unusedIgnoredClassReferences.remove(classReference);
         } else {
-            String fromPackage = getPackageName(from);
-            String toPackage = getPackageName(to);
+            Package fromPackage = classReference.getFrom().getPackage();
+            Package toPackage = classReference.getTo().getPackage();
             if (!fromPackage.equals(toPackage)) {
-                Reference packageReference = new Reference(fromPackage, toPackage);
+                Reference<Package> packageReference = new Reference<Package>(fromPackage, toPackage);
                 if (packageReferences.add(packageReference)) {
                     classReferenceSamples.put(packageReference, classReference);
                 }
@@ -60,18 +56,23 @@ final class ReferenceCollector {
         }
     }
     
-    Set<Reference> getClassReferencesForPackageCycle() {
-        DirectedGraph<String,Reference> graph = new DefaultDirectedGraph<>(Reference.class);
-        for (Reference reference : packageReferences) {
+    Set<Reference<Clazz>> getClassReferencesForPackageCycle() {
+        DirectedGraph<Package,Reference<Package>> graph = new DefaultDirectedGraph<>(new EdgeFactory<Package,Reference<Package>>() {
+            @Override
+            public Reference<Package> createEdge(Package sourceVertex, Package targetVertex) {
+                return new Reference<Package>(sourceVertex, targetVertex);
+            }
+        });
+        for (Reference<Package> reference : packageReferences) {
             graph.addVertex(reference.getFrom());
             graph.addVertex(reference.getTo());
             graph.addEdge(reference.getFrom(), reference.getTo(), reference);
         }
-        List<DirectedSubgraph<String,Reference>> cycles = new StrongConnectivityInspector<String,Reference>(graph).stronglyConnectedSubgraphs();
-        for (DirectedSubgraph<String,Reference> cycle : cycles) {
+        List<DirectedSubgraph<Package,Reference<Package>>> cycles = new StrongConnectivityInspector<Package,Reference<Package>>(graph).stronglyConnectedSubgraphs();
+        for (DirectedSubgraph<Package,Reference<Package>> cycle : cycles) {
             if (cycle.vertexSet().size() > 1) {
-                Set<Reference> classReferences = new HashSet<>();
-                for (Reference packageReference : cycle.edgeSet()) {
+                Set<Reference<Clazz>> classReferences = new HashSet<>();
+                for (Reference<Package> packageReference : cycle.edgeSet()) {
                     classReferences.add(classReferenceSamples.get(packageReference));
                 }
                 return classReferences;
@@ -80,7 +81,7 @@ final class ReferenceCollector {
         return null;
     }
 
-    Set<Reference> getUnusedIgnoredClassReferences() {
+    Set<Reference<Clazz>> getUnusedIgnoredClassReferences() {
         return unusedIgnoredClassReferences;
     }
 }

Modified: webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/ReferenceProcessor.java
URL: http://svn.apache.org/viewvc/webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/ReferenceProcessor.java?rev=1741860&r1=1741859&r2=1741860&view=diff
==============================================================================
--- webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/ReferenceProcessor.java (original)
+++ webservices/axiom/trunk/buildutils/enforcer-maven-plugin/src/main/java/org/apache/axiom/buildutils/enforcer/ReferenceProcessor.java Sun May  1 11:42:45 2016
@@ -22,9 +22,9 @@ import org.objectweb.asm.Type;
 
 final class ReferenceProcessor {
     private final ReferenceCollector referenceCollector;
-    private final String origin;
+    private final Clazz origin;
     
-    ReferenceProcessor(ReferenceCollector referenceCollector, String origin) {
+    ReferenceProcessor(ReferenceCollector referenceCollector, Clazz origin) {
         this.referenceCollector = referenceCollector;
         this.origin = origin;
     }
@@ -32,7 +32,7 @@ final class ReferenceProcessor {
     public void processType(Type type) {
         switch (type.getSort()) {
             case Type.OBJECT:
-                referenceCollector.collectClassReference(origin, type.getClassName());
+                referenceCollector.collectClassReference(new Reference<Clazz>(origin, new Clazz(type.getClassName())));
                 break;
             case Type.ARRAY:
                 processType(type.getElementType());