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