cached the external dependency view

This commit is contained in:
Jeremy Long
2017-09-04 08:52:20 -04:00
parent 3bf69651fd
commit a967735e11

View File

@@ -152,6 +152,10 @@ public class Engine implements FileFilter, AutoCloseable {
* The list of dependencies. * The list of dependencies.
*/ */
private final List<Dependency> dependencies = Collections.synchronizedList(new ArrayList<Dependency>()); private final List<Dependency> dependencies = Collections.synchronizedList(new ArrayList<Dependency>());
/**
* The external view of the dependency list.
*/
private Dependency[] dependenciesExternalView = null;
/** /**
* A Map of analyzers grouped by Analysis phase. * A Map of analyzers grouped by Analysis phase.
*/ */
@@ -291,20 +295,6 @@ public class Engine implements FileFilter, AutoCloseable {
return analyzers.get(phase); return analyzers.get(phase);
} }
/**
* Get the dependencies identified. The returned list is a reference to the
* engine's synchronized list. <b>You must synchronize on the returned
* list</b> when you modify and iterate over it from multiple threads. E.g.
* this holds for analyzers supporting parallel processing during their
* analysis phase.
*
* @return the dependencies identified
* @see Collections#synchronizedList(List)
* @see Analyzer#supportsParallelProcessing()
*/
// public synchronized List<Dependency> getDependencies() {
// return dependencies;
// }
/** /**
* Adds a dependency. * Adds a dependency.
* *
@@ -312,6 +302,7 @@ public class Engine implements FileFilter, AutoCloseable {
*/ */
public synchronized void addDependency(Dependency dependency) { public synchronized void addDependency(Dependency dependency) {
dependencies.add(dependency); dependencies.add(dependency);
dependenciesExternalView = null;
} }
/** /**
@@ -320,6 +311,7 @@ public class Engine implements FileFilter, AutoCloseable {
public synchronized void sortDependencies() { public synchronized void sortDependencies() {
//TODO - is this actually necassary???? //TODO - is this actually necassary????
Collections.sort(dependencies); Collections.sort(dependencies);
dependenciesExternalView = null;
} }
/** /**
@@ -329,6 +321,7 @@ public class Engine implements FileFilter, AutoCloseable {
*/ */
public synchronized void removeDependency(Dependency dependency) { public synchronized void removeDependency(Dependency dependency) {
dependencies.remove(dependency); dependencies.remove(dependency);
dependenciesExternalView = null;
} }
/** /**
@@ -337,7 +330,10 @@ public class Engine implements FileFilter, AutoCloseable {
* @return the dependencies identified * @return the dependencies identified
*/ */
public synchronized Dependency[] getDependencies() { public synchronized Dependency[] getDependencies() {
return dependencies.toArray(new Dependency[dependencies.size()]); if (dependenciesExternalView == null) {
dependenciesExternalView = dependencies.toArray(new Dependency[dependencies.size()]);
}
return dependenciesExternalView;
} }
/** /**
@@ -348,6 +344,7 @@ public class Engine implements FileFilter, AutoCloseable {
public synchronized void setDependencies(List<Dependency> dependencies) { public synchronized void setDependencies(List<Dependency> dependencies) {
this.dependencies.clear(); this.dependencies.clear();
this.dependencies.addAll(dependencies); this.dependencies.addAll(dependencies);
dependenciesExternalView = null;
} }
/** /**
@@ -614,6 +611,7 @@ public class Engine implements FileFilter, AutoCloseable {
} }
if (!found) { if (!found) {
dependencies.add(dependency); dependencies.add(dependency);
dependenciesExternalView = null;
} }
} }
} else { } else {