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);