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 {