You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2015/09/21 13:20:48 UTC

svn commit: r1704267 - /sling/trunk/testing/teleporter/src/main/java/org/apache/sling/testing/teleporter/client/DependencyAnalyzer.java

Author: bdelacretaz
Date: Mon Sep 21 11:20:43 2015
New Revision: 1704267

URL: http://svn.apache.org/viewvc?rev=1704267&view=rev
Log:
SLING-5040 - detect loops in analysis

Modified:
    sling/trunk/testing/teleporter/src/main/java/org/apache/sling/testing/teleporter/client/DependencyAnalyzer.java

Modified: sling/trunk/testing/teleporter/src/main/java/org/apache/sling/testing/teleporter/client/DependencyAnalyzer.java
URL: http://svn.apache.org/viewvc/sling/trunk/testing/teleporter/src/main/java/org/apache/sling/testing/teleporter/client/DependencyAnalyzer.java?rev=1704267&r1=1704266&r2=1704267&view=diff
==============================================================================
--- sling/trunk/testing/teleporter/src/main/java/org/apache/sling/testing/teleporter/client/DependencyAnalyzer.java (original)
+++ sling/trunk/testing/teleporter/src/main/java/org/apache/sling/testing/teleporter/client/DependencyAnalyzer.java Mon Sep 21 11:20:43 2015
@@ -33,6 +33,8 @@ class DependencyAnalyzer {
     private final Set<String> dependencyNames = new HashSet<String>();
     private final Set<String> includes = new HashSet<String>();
     private final Set<String> excludes = new HashSet<String>();
+    private final Set<Class<?>> alreadySeen = new HashSet<Class<?>>();
+    private Collection<Class<?>> dependencies;
     
     private DependencyAnalyzer(Class <?> ... classes) {
         this.classes = classes;
@@ -60,19 +62,26 @@ class DependencyAnalyzer {
     /** Get the aggregate dependencies of our classes, based on a recursive
      *  analysis that takes our include/exclude prefixes into account
      */
-    Collection<Class<?>> getDependencies() {
-        final Set<Class<?>> result = new HashSet<Class<?>>();
+    synchronized Collection<Class<?>> getDependencies() {
+        if(dependencies != null) {
+            return dependencies;
+        }
+        dependencies = new HashSet<Class<?>>();
         for(Class<?> c : classes) {
             analyze(c);
         }
         for(String dep : dependencyNames) {
-            result.add(toClass(dep));
+            dependencies.add(toClass(dep));
         }
-        return result;
+        return dependencies;
     }
     
     /** Analyze a single class, recursively */
     private void analyze(Class<?> c) {
+        if(alreadySeen.contains(c)) {
+            return;
+        }
+        alreadySeen.add(c);
         final Set<String> deps = new HashSet<String>();
         final String path = "/" + c.getName().replace('.', '/') + ".class";
         final InputStream input = getClass().getResourceAsStream(path);