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