You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by we...@apache.org on 2009/12/21 22:18:00 UTC
svn commit: r892981 - in /myfaces/extensions/scripting/trunk/core/core/src:
main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassDependencies.java
test/java/org/apache/myfaces/extensions/scripting/dependencyScan/DependencyScannerTest.java
Author: werpu
Date: Mon Dec 21 21:17:59 2009
New Revision: 892981
URL: http://svn.apache.org/viewvc?rev=892981&view=rev
Log:
https://issues.apache.org/jira/browse/EXTSCRIPT-39
adding a reverse index for the class dependencies
Added:
myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassDependencies.java (with props)
Modified:
myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/DependencyScannerTest.java
Added: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassDependencies.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassDependencies.java?rev=892981&view=auto
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassDependencies.java (added)
+++ myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassDependencies.java Mon Dec 21 21:17:59 2009
@@ -0,0 +1,85 @@
+package org.apache.myfaces.scripting.core.dependencyScan;
+
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+
+
+/**
+ * class dependency maps
+ * note this class is thread save
+ */
+public class ClassDependencies {
+
+ /**
+ * reverse index which shows which
+ * a class name and which classes in the system depend on that
+ * classname
+ * <p/>
+ * <p/>
+ * the key is a depenency a class has the value is a set of classes which depend on the current class
+ */
+ private Map<String, Set<String>> reverseIndex = new ConcurrentHashMap<String, Set<String>>();
+
+ public void addDependency(String referencingClass, String referencedClass) {
+ Set<String> reverseDependencies = getReverseDependencies(referencedClass);
+ reverseDependencies.add(referencingClass);
+ }
+
+ /**
+ * adds a set of dependencies to the
+ * reverse lookup index
+ *
+ * @param referencingClass
+ * @param referencedClasses
+ */
+ public void addDependencies(String referencingClass, Collection<String> referencedClasses) {
+ for (String referencedClass : referencedClasses) {
+ addDependency(referencingClass, referencedClass);
+ }
+ }
+
+ /**
+ * removes a referenced class an all its referencing classes!
+ *
+ * @param clazz the referenced class to be deleted
+ */
+ public void removeReferenced(String clazz) {
+ reverseIndex.remove(clazz);
+ }
+
+ /**
+ * removes a referencing class
+ * and deletes the referenced
+ * entry if it is not referenced anymore
+ *
+ * @param clazz the referencing class to delete
+ */
+ public void removeReferencing(String clazz) {
+ List<String> emptyReferences = new ArrayList<String>(reverseIndex.size());
+ for (Map.Entry<String, Set<String>> entry : reverseIndex.entrySet()) {
+ Set<String> entrySet = entry.getValue();
+ entrySet.remove(clazz);
+ if (entrySet.isEmpty()) {
+ emptyReferences.add(entry.getKey());
+ }
+ }
+ for (String toDelete : emptyReferences) {
+ removeReferenced(toDelete);
+ }
+ }
+
+
+ public Set<String> getReferencedClasses(String referencingClass) {
+ return reverseIndex.get(referencingClass);
+ }
+
+ private final Set<String> getReverseDependencies(String dependency) {
+ Set<String> dependencies = reverseIndex.get(dependency);
+ if (dependencies == null) {
+ dependencies = Collections.synchronizedSet(new HashSet<String>());
+ reverseIndex.put(dependency, dependencies);
+ }
+ return dependencies;
+ }
+
+}
Propchange: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassDependencies.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: myfaces/extensions/scripting/trunk/core/core/src/main/java/org/apache/myfaces/scripting/core/dependencyScan/ClassDependencies.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Modified: myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/DependencyScannerTest.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/DependencyScannerTest.java?rev=892981&r1=892980&r2=892981&view=diff
==============================================================================
--- myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/DependencyScannerTest.java (original)
+++ myfaces/extensions/scripting/trunk/core/core/src/test/java/org/apache/myfaces/extensions/scripting/dependencyScan/DependencyScannerTest.java Mon Dec 21 21:17:59 2009
@@ -18,44 +18,74 @@
*/
package org.apache.myfaces.extensions.scripting.dependencyScan;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.myfaces.scripting.core.dependencyScan.ClassDependencies;
import org.apache.myfaces.scripting.core.dependencyScan.DefaultDependencyScanner;
import org.junit.Test;
-import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+
/**
* @author Werner Punz (latest modification by $Author$)
* @version $Revision$ $Date$
*/
public class DependencyScannerTest {
+ Log log = LogFactory.getLog(DependencyScannerTest.class.getName());
+ private static final String PROBE1 = "org.apache.myfaces.extensions.scripting.dependencyScan.probes.Probe";
+ private static final String PROBE2 = "org.apache.myfaces.extensions.scripting.dependencyScan.probes.Probe2";
+ private static final String PROBE3 = "org.apache.myfaces.extensions.scripting.dependencyScan.probes.Probe3";
+ private static final String PROBE4 = "org.apache.myfaces.extensions.scripting.dependencyScan.probes.Probe4";
+ private static final String PROBE_PAR = "org.apache.myfaces.extensions.scripting.dependencyScan.probes.ProbeParent";
+ private static final String STRING = "java.lang.String";
+ private static final String DUMMY = "org.apache.xxx";
+ private static final String PROBE_NAMESPACE = "org.apache.myfaces.extensions.scripting";
+
@Test
public void testScan() {
Set<String> whiteList = new HashSet<String>();
-
- whiteList.add("org.apache.xxx");
- whiteList.add("org.apache.myfaces.extensions.scripting");
+ whiteList.add(DUMMY);
+ whiteList.add(PROBE_NAMESPACE);
long before = System.currentTimeMillis();
- Set<String> retVal = (new DefaultDependencyScanner()).fetchDependencies("org.apache.myfaces.extensions.scripting.dependencyScan.probes.Probe", whiteList);
+ Set<String> retVal = (new DefaultDependencyScanner()).fetchDependencies(PROBE1, whiteList);
long after = System.currentTimeMillis();
- System.out.println(after-before);
+ log.info("execution time" + (after - before));
assertTrue(retVal.size() > 0);
- assertFalse(retVal.contains("java.lang.String"));
+ assertFalse(retVal.contains(STRING));
- assertTrue(retVal.contains("org.apache.myfaces.extensions.scripting.dependencyScan.probes.Probe2"));
- assertTrue(retVal.contains("org.apache.myfaces.extensions.scripting.dependencyScan.probes.Probe3"));
- assertTrue(retVal.contains("org.apache.myfaces.extensions.scripting.dependencyScan.probes.Probe4"));
- assertTrue(retVal.contains("org.apache.myfaces.extensions.scripting.dependencyScan.probes.ProbeParent"));
+ assertTrue(retVal.contains(PROBE2));
+ assertTrue(retVal.contains(PROBE3));
+ assertTrue(retVal.contains(PROBE4));
+ assertTrue(retVal.contains(PROBE_PAR));
}
+
+ public void testClassDependencies() {
+ Set<String> whiteList = new HashSet<String>();
+ whiteList.add(DUMMY);
+ whiteList.add(PROBE_NAMESPACE);
+
+ Set<String> retVal = (new DefaultDependencyScanner()).fetchDependencies(PROBE1, whiteList);
+ ClassDependencies dependencyMap = new ClassDependencies();
+
+ dependencyMap.addDependencies(PROBE1, retVal);
+
+ assertTrue("Dependency Test1", dependencyMap.getReferencedClasses(PROBE2).contains(PROBE1));
+ assertTrue("Dependency Test2", dependencyMap.getReferencedClasses(PROBE3).contains(PROBE1));
+ assertTrue("Dependency Test3", dependencyMap.getReferencedClasses(PROBE4).contains(PROBE1));
+ assertTrue("Dependency Test4", dependencyMap.getReferencedClasses(PROBE_PAR).contains(PROBE1));
+
+ }
+
}