Author: johnh
Date: Wed Nov  4 19:09:14 2009
New Revision: 832844

URL: http://svn.apache.org/viewvc?rev=832844&view=rev
Log:
Adding optional flag to ignore transitive deps when retrieving 
FeatureResources. Useful for debug functionality (status servlets) and 
one-offs, but typically ignored.


Modified:
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/features/FeatureRegistry.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/features/FeatureRegistryTest.java

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/features/FeatureRegistry.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/features/FeatureRegistry.java?rev=832844&r1=832843&r2=832844&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/features/FeatureRegistry.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/features/FeatureRegistry.java
 Wed Nov  4 19:09:14 2009
@@ -160,7 +160,7 @@
   
   /**
    * For the given list of needed features, retrieves all the FeatureResource 
objects that
-   * contain their content and that of their transitive dependencies.
+   * contain their content and, if requested, that of their transitive 
dependencies.
    * 
    * Resources are returned in order of their place in the dependency tree, 
with "bottom"/
    * depended-on resources returned before those that depend on them. Resource 
objects
@@ -177,22 +177,29 @@
    * @throws GadgetException
    */
   public List<FeatureResource> getFeatureResources(
-      GadgetContext ctx, Collection<String> needed, List<String> unsupported) {
-    Map<Collection<String>, List<FeatureResource>> useCache =
-      (unsupported != null) ? cache : cacheIgnoreUnsupported;
+      GadgetContext ctx, Collection<String> needed, List<String> unsupported, 
boolean transitive) {
+    Map<Collection<String>, List<FeatureResource>> useCache = null;
+    if (transitive) {
+      useCache = (unsupported != null) ? cache : cacheIgnoreUnsupported;
+    }
     
     List<FeatureResource> resources = Lists.newLinkedList();
     
-    if (useCache.containsKey(needed)) {
+    if (useCache != null && useCache.containsKey(needed)) {
       return useCache.get(needed);
     }
     
-    List<FeatureNode> fullTree = getTransitiveDeps(needed, unsupported);
+    List<FeatureNode> featureNodes = null;
+    if (transitive) {
+      featureNodes = getTransitiveDeps(needed, unsupported);
+    } else {
+      featureNodes = getRequestedNodes(needed, unsupported);
+    }
 
     String targetBundleType =
         ctx.getRenderingContext() == RenderingContext.CONTAINER ? "container" 
: "gadget";
     
-    for (FeatureNode entry : fullTree) {
+    for (FeatureNode entry : featureNodes) {
       for (FeatureBundle bundle : entry.getBundles()) {
         if (bundle.getType().equals(targetBundleType)) {
           if (containerMatch(bundle.getAttribs().get("container"), 
ctx.getContainer())) {
@@ -202,7 +209,7 @@
       }
     }
     
-    if (unsupported == null || unsupported.isEmpty()) {
+    if (useCache != null && (unsupported == null || unsupported.isEmpty())) {
       useCache.put(needed, resources);
     }
       
@@ -210,6 +217,18 @@
   }
   
   /**
+   * Helper method retrieving feature resources, including transitive 
dependencies.
+   * @param ctx Context for the request.
+   * @param needed List of all needed features.
+   * @param unsupported If non-null, a List populated with unknown features 
from the needed list.
+   * @return List of FeatureResources that may be used to render the needed 
features.
+   */
+  public List<FeatureResource> getFeatureResources(
+      GadgetContext ctx, Collection<String> needed, List<String> unsupported) {
+    return getFeatureResources(ctx, needed, unsupported, true);
+  }
+  
+  /**
    * Returns all known FeatureResources in dependency order, as described in 
getFeatureResources.
    * Returns only GADGET-context resources. This is a convenience method 
largely for calculating
    * JS checksum.
@@ -255,14 +274,7 @@
   }
   
   private List<FeatureNode> getTransitiveDeps(Collection<String> needed, 
List<String> unsupported) {
-    final List<FeatureNode> requested = Lists.newArrayList();
-    for (String featureName : needed) {
-      if (featureMap.containsKey(featureName)) {
-        requested.add(featureMap.get(featureName));
-      } else {
-        if (unsupported != null) unsupported.add(featureName);
-      }
-    }
+    final List<FeatureNode> requested = getRequestedNodes(needed, unsupported);
     
     Comparator<FeatureNode> nodeDepthComparator = new 
Comparator<FeatureNode>() {
       public int compare(FeatureNode one, FeatureNode two) {
@@ -298,6 +310,18 @@
     return fullDeps;
   }
   
+  private List<FeatureNode> getRequestedNodes(Collection<String> needed, 
List<String> unsupported) {
+    List<FeatureNode> requested = Lists.newArrayList();
+    for (String featureName : needed) {
+      if (featureMap.containsKey(featureName)) {
+        requested.add(featureMap.get(featureName));
+      } else {
+        if (unsupported != null) unsupported.add(featureName);
+      }
+    }
+    return requested;
+  }
+  
   private boolean containerMatch(String containerAttrib, String container) {
     if (containerAttrib == null || containerAttrib.length() == 0) {
       // Nothing specified = all match.

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/features/FeatureRegistryTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/features/FeatureRegistryTest.java?rev=832844&r1=832843&r2=832844&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/features/FeatureRegistryTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/features/FeatureRegistryTest.java
 Wed Nov  4 19:09:14 2009
@@ -319,6 +319,19 @@
     assertEquals(0, unsupported.size());
   }
   
+  @Test
+  public void getFeatureResourcesNoTransitiveSingle() throws Exception {
+    setupFullRegistry("gadget", null);
+    GadgetContext ctx = getCtx(RenderingContext.GADGET, null);
+    List<String> needed = Lists.newArrayList("top", "bottom");
+    List<String> unsupported = Lists.<String>newLinkedList();
+    List<FeatureResource> resources = registry.getFeatureResources(ctx, 
needed, unsupported, false);
+    // Should return in order requested.
+    assertEquals(2, resources.size());
+    assertEquals("top", resources.get(0).getContent());
+    assertEquals("bottom", resources.get(1).getContent());
+    assertEquals(0, unsupported.size());
+  }
   
   @Test
   public void getAllFeatures() throws Exception {


Reply via email to