[jboss-cvs] JBossAS SVN: r103683 - projects/scanning/trunk/scanning-impl/src/main/java/org/jboss/scanning/plugins/filter.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Apr 8 05:02:46 EDT 2010


Author: alesj
Date: 2010-04-08 05:02:45 -0400 (Thu, 08 Apr 2010)
New Revision: 103683

Modified:
   projects/scanning/trunk/scanning-impl/src/main/java/org/jboss/scanning/plugins/filter/ScanningMetaDataRecurseFilter.java
Log:
Smarter recurse filter.

Modified: projects/scanning/trunk/scanning-impl/src/main/java/org/jboss/scanning/plugins/filter/ScanningMetaDataRecurseFilter.java
===================================================================
--- projects/scanning/trunk/scanning-impl/src/main/java/org/jboss/scanning/plugins/filter/ScanningMetaDataRecurseFilter.java	2010-04-08 08:49:18 UTC (rev 103682)
+++ projects/scanning/trunk/scanning-impl/src/main/java/org/jboss/scanning/plugins/filter/ScanningMetaDataRecurseFilter.java	2010-04-08 09:02:45 UTC (rev 103683)
@@ -22,45 +22,114 @@
 package org.jboss.scanning.plugins.filter;
 
 import java.net.URL;
-import java.util.List;
+import java.util.*;
 
 import org.jboss.classloading.spi.visitor.ResourceContext;
 import org.jboss.classloading.spi.visitor.ResourceFilter;
+import org.jboss.scanning.spi.metadata.PathEntryMetaData;
 import org.jboss.scanning.spi.metadata.PathMetaData;
 import org.jboss.scanning.spi.metadata.ScanningMetaData;
+import org.jboss.vfs.util.PathTokenizer;
 
 /**
  * Simple recurse filter.
- * It searches for path substring in url string.
+ *
+ * It searches for path substring in url string,
+ * and tries to match the tree structure as far as it goes.
  */
 public class ScanningMetaDataRecurseFilter implements ResourceFilter
 {
-   private ScanningMetaData smd;
+   private Set<Node> roots;
 
    public ScanningMetaDataRecurseFilter(ScanningMetaData smd)
    {
       if (smd == null)
          throw new IllegalArgumentException("Null metadata");
-      this.smd = smd;
+
+      List<PathMetaData> paths = smd.getPaths();
+      if (paths != null && paths.isEmpty() == false)
+      {
+         roots = new HashSet<Node>();
+         for (PathMetaData pmd : paths)
+         {
+            Node pathNode = new Node(pmd.getPathName());
+            roots.add(pathNode);
+            Set<PathEntryMetaData> includes = pmd.getIncludes();
+            if (includes != null && includes.isEmpty() == false)
+            {
+               for (PathEntryMetaData pemd : includes)
+               {
+                  String name = pemd.getName();
+                  String[] tokens = name.split("\\.");
+                  Node current = pathNode;
+                  for (String token : tokens)
+                     current = current.addChild(token);
+               }
+            }
+         }
+      }
    }
 
    public boolean accepts(ResourceContext resource)
    {
+      if (roots == null)
+         return false;
+
       URL url = resource.getUrl();
       String urlString = url.toExternalForm();
-      List<PathMetaData> paths = smd.getPaths();
-      if (paths != null && paths.isEmpty() == false)
+      for (Node root : roots)
       {
-         for (PathMetaData pmd : paths)
+         if (urlString.contains(root.value))
          {
-            String name = pmd.getPathName();
-            // url contains path
-            if (urlString.contains(name))
+            String resourceName = resource.getResourceName();
+            List<String> tokens = PathTokenizer.getTokens(resourceName);
+            Node current = root;
+            // let's try to walk some tree path
+            for (String token : tokens)
             {
-               return true;
+               current = current.getChild(token);
+               // no fwd path
+               if (current == null)
+                  return false;
             }
+            return true;
          }
       }
       return false;
    }
+
+   private static class Node
+   {
+      private String value;
+      private Map<String, Node> children;
+
+      private Node(String value)
+      {
+         this.value = value;
+      }
+
+      public Node addChild(String value)
+      {
+         if (children == null)
+            children = new HashMap<String, Node>();
+
+         Node child = children.get(value);
+         if (child == null)
+         {
+            child = new Node(value);
+            children.put(value, child);
+         }
+         return child;
+      }
+
+      public String getValue()
+      {
+         return value;
+      }
+
+      public Node getChild(String child)
+      {
+         return children != null ? children.get(child) : null;
+      }
+   }
 }




More information about the jboss-cvs-commits mailing list