You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by jo...@apache.org on 2011/05/26 00:56:17 UTC

svn commit: r1127714 - in /shindig/trunk/java/gadgets/src: main/java/org/apache/shindig/gadgets/js/ConfigInjectionProcessor.java test/java/org/apache/shindig/gadgets/js/ConfigInjectionProcessorTest.java

Author: johnh
Date: Wed May 25 22:56:16 2011
New Revision: 1127714

URL: http://svn.apache.org/viewvc?rev=1127714&view=rev
Log:
Config injection improvements:

1. Only inject config for newly-served libs.
2. Set global config if gadgets.config lib is not present.


Modified:
    shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/ConfigInjectionProcessor.java
    shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/ConfigInjectionProcessorTest.java

Modified: shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/ConfigInjectionProcessor.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/ConfigInjectionProcessor.java?rev=1127714&r1=1127713&r2=1127714&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/ConfigInjectionProcessor.java (original)
+++ shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/js/ConfigInjectionProcessor.java Wed May 25 22:56:16 2011
@@ -17,8 +17,6 @@
  */
 package org.apache.shindig.gadgets.js;
 
-import java.util.Map;
-
 import org.apache.shindig.common.JsonSerializer;
 import org.apache.shindig.gadgets.GadgetContext;
 import org.apache.shindig.gadgets.RenderingContext;
@@ -27,12 +25,25 @@ import org.apache.shindig.gadgets.featur
 import org.apache.shindig.gadgets.uri.JsUriManager.JsUri;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 public class ConfigInjectionProcessor implements JsProcessor {
   private static final String CONFIG_INIT_ID = "[config-injection]";
   @VisibleForTesting
   static final String GADGETS_FEATURES_KEY = "gadgets.features";
+  @VisibleForTesting
+  static final String CONFIG_INIT_TPL = "gadgets.config.init(%s);\n";
+  @VisibleForTesting
+  static final String GLOBAL_CONFIG_KEY_TPL = "window['___cfg']=%s;\n";
+  @VisibleForTesting
+  static final String CONFIG_FEATURE = "core.config.base";
 
   private final FeatureRegistry registry;
   private final ConfigProcessor configProcessor;
@@ -51,15 +62,33 @@ public class ConfigInjectionProcessor im
 
     // Append gadgets.config initialization if not in standard gadget mode.
     if (ctx.getRenderingContext() != RenderingContext.GADGET) {
-      // TODO: subtract already-loaded from features passed to getConfig
+      List<String> allReq = registry.getFeatures(jsUri.getLibs());
+      Collection<String> loaded = jsUri.getLoadedLibs();
+      
+      // Only inject config for features not already present and configured.
+      List<String> newReq = subtractCollection(allReq, loaded);
+      
       Map<String, Object> config = configProcessor.getConfig(
-          ctx.getContainer(), registry.getFeatures(jsUri.getLibs()), request.getHost(), null);
+          ctx.getContainer(), newReq, request.getHost(), null);
       if (!config.isEmpty()) {
-        builder.appendJs(
-            "gadgets.config.init(" + JsonSerializer.serialize(config) + ");\n", CONFIG_INIT_ID);
+        String configJson = JsonSerializer.serialize(config);
+        if (allReq.contains(CONFIG_FEATURE) || loaded.contains(CONFIG_FEATURE)) {
+          // config lib is present: pass it data
+          builder.appendJs(String.format(CONFIG_INIT_TPL, configJson), CONFIG_INIT_ID);
+        } else {
+          // config lib not available: use global variable
+          builder.appendJs(String.format(GLOBAL_CONFIG_KEY_TPL, configJson), CONFIG_INIT_ID);
+        }
       }
     }
     return true;
   }
+  
+  private List<String> subtractCollection(Collection<String> root, Collection<String> subtracted) {
+    // Obtain set of common elements.
+    Set<String> result = Sets.newHashSet(root);
+    result.removeAll(subtracted);
+    return Lists.newArrayList(result);
+  }
 
 }

Modified: shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/ConfigInjectionProcessorTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/ConfigInjectionProcessorTest.java?rev=1127714&r1=1127713&r2=1127714&view=diff
==============================================================================
--- shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/ConfigInjectionProcessorTest.java (original)
+++ shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/js/ConfigInjectionProcessorTest.java Wed May 25 22:56:16 2011
@@ -43,9 +43,12 @@ import org.junit.Before;
 import org.junit.Test;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 
 public class ConfigInjectionProcessorTest {
+  private static final List<String> EMPTY_LIST = ImmutableList.of();
+  private static final String HOST = "myHost";
   private static final String BASE_CODE = "code\n";
   private static final String CONTAINER = "container";
   private IMocksControl control;
@@ -93,6 +96,7 @@ public class ConfigInjectionProcessorTes
         .andReturn(null);
     List<String> libs = ImmutableList.of();
     expect(jsUri.getLibs()).andReturn(libs);
+    expect(jsUri.getLoadedLibs()).andReturn(EMPTY_LIST);
     expect(registry.getFeatures(libs)).andReturn(libs);
     expect(request.getHost()).andReturn("host");
     control.replay();
@@ -112,7 +116,7 @@ public class ConfigInjectionProcessorTes
   }
 
   private void checkNoMatchingFeaturesDoesNothing(RenderingContext ctx) throws Exception {
-    JsResponseBuilder builder = prepareRequestReturnBuilder(ctx );
+    JsResponseBuilder builder = prepareRequestReturnBuilder(ctx);
     Map<String, Object> baseConfig = Maps.newHashMap();
     baseConfig.put("feature1", "config1");
     Map<String, String> f2MapConfig = Maps.newHashMap();
@@ -123,6 +127,7 @@ public class ConfigInjectionProcessorTes
         .andReturn(baseConfig);
     List<String> libs = ImmutableList.of("lib1", "lib2");
     expect(jsUri.getLibs()).andReturn(libs);
+    expect(jsUri.getLoadedLibs()).andReturn(EMPTY_LIST);
     expect(registry.getFeatures(libs)).andReturn(libs);
     expect(request.getHost()).andReturn("host");
     control.replay();
@@ -171,15 +176,15 @@ public class ConfigInjectionProcessorTes
     baseConfig.put("feature4", "unused");
     expect(containerConfig.getMap(CONTAINER, ConfigInjectionProcessor.GADGETS_FEATURES_KEY))
         .andReturn(baseConfig);
-    String host = "myHost";
-    expect(request.getHost()).andReturn(host).anyTimes();
+    expect(request.getHost()).andReturn(HOST).anyTimes();
     ImmutableList.Builder<String> libsBuilder =
-        ImmutableList.<String>builder().add("feature1", "feature2");
+        ImmutableList.<String>builder().add(ConfigInjectionProcessor.CONFIG_FEATURE,
+          "feature1", "feature2");
     if (extraContrib) {
       libsBuilder.add("feature3");
       ConfigContributor cc = control.createMock(ConfigContributor.class);
       Capture<Map<String, Object>> captureConfig = new Capture<Map<String, Object>>();
-      cc.contribute(capture(captureConfig), eq(CONTAINER), eq(host));
+      cc.contribute(capture(captureConfig), eq(CONTAINER), eq(HOST));
       expectLastCall().andAnswer(new IAnswer<Void>() {
         @SuppressWarnings("unchecked")
         public Void answer() throws Throwable {
@@ -193,6 +198,7 @@ public class ConfigInjectionProcessorTes
     }
     List<String> libs = libsBuilder.build();
     expect(jsUri.getLibs()).andReturn(libs);
+    expect(jsUri.getLoadedLibs()).andReturn(EMPTY_LIST);
     expect(registry.getFeatures(libs)).andReturn(libs);
     
     control.replay();
@@ -233,4 +239,46 @@ public class ConfigInjectionProcessorTes
     expect(request.getJsUri()).andReturn(jsUri);
     return new JsResponseBuilder().appendJs(BASE_CODE, "source");
   }
+  
+  @Test
+  public void newGlobalConfigAdded() throws Exception {
+    List<String> requested = ImmutableList.of("reqfeature1", "reqfeature2", "already1");
+    List<String> alreadyHas = ImmutableList.of("already1");
+    expect(jsUri.getLibs()).andReturn(requested);
+    expect(jsUri.getLoadedLibs()).andReturn(alreadyHas);
+    Map<String, Object> config =
+        ImmutableMap.<String, Object>of("reqfeature1", "reqval1", "already1", "alval1");
+    expect(containerConfig.getMap(CONTAINER, ConfigInjectionProcessor.GADGETS_FEATURES_KEY))
+        .andReturn(config);
+    expect(request.getHost()).andReturn(HOST).anyTimes();
+    expect(registry.getFeatures(requested)).andReturn(requested);
+    
+    JsResponseBuilder builder = prepareRequestReturnBuilder(RenderingContext.CONFIGURED_GADGET);
+
+    ConfigContributor cc = control.createMock(ConfigContributor.class);
+    Capture<Map<String, Object>> captureConfig = new Capture<Map<String, Object>>();
+    cc.contribute(capture(captureConfig), eq(CONTAINER), eq(HOST));
+    expectLastCall().andAnswer(new IAnswer<Void>() {
+      @SuppressWarnings("unchecked")
+      public Void answer() throws Throwable {
+        Map<String, Object> config = (Map<String, Object>)getCurrentArguments()[0];
+        String f3Value = (String)config.get("reqfeature1");
+        config.put("reqfeature1", f3Value + ":MODIFIED");
+        return null;
+      }
+    });
+    configContributors.put("reqfeature1", cc);
+    
+    control.replay();
+    assertTrue(processor.process(request, builder));
+    control.verify();
+    
+    String jsCode = builder.build().toJsString();
+    String startCode = BASE_CODE + "window['___cfg']=";
+    assertTrue(jsCode.startsWith(startCode));
+    String json = jsCode.substring(startCode.length(), jsCode.length() - ";\n".length());
+    JSONObject configObj = new JSONObject(json);
+    assertEquals(1, configObj.names().length());
+    assertEquals("reqval1:MODIFIED", configObj.getString("reqfeature1"));
+  }
 }