private JsUri mockJsUri(boolean debug) { JsUri result = createMock(JsUri.class); expect(result.isDebug()).andReturn(debug).anyTimes(); expect(result.getCompileMode()).andReturn(JsCompileMode.CONCAT_COMPILE_EXPORT_ALL).anyTimes(); expect(result.getStatus()).andReturn(UriStatus.VALID_UNVERSIONED).anyTimes(); expect(result.getContainer()).andReturn("container").anyTimes(); expect(result.getContext()).andReturn(RenderingContext.CONFIGURED_GADGET).anyTimes(); expect(result.getRefresh()).andReturn(1000).anyTimes(); expect(result.isNoCache()).andReturn(false).anyTimes(); expect(result.getGadget()).andReturn("http://foo.com/g.xml").anyTimes(); expect(result.getLibs()).andReturn(ImmutableList.<String>of()).anyTimes(); expect(result.getLoadedLibs()).andReturn(ImmutableList.<String>of()).anyTimes(); expect(result.getOnload()).andReturn("foo").anyTimes(); expect(result.isJsload()).andReturn(true).anyTimes(); expect(result.isNohint()).andReturn(true).anyTimes(); expect(result.getOrigUri()).andReturn(null).anyTimes(); expect(result.getRepository()).andReturn(null).anyTimes(); expect(result.getExtensionParams()).andReturn(null).anyTimes(); replay(result); return result; }
@Test public void versionDifferentForDifferentFeatures() { String feature1 = "feature1"; String feature2 = "feature2"; expectReq(feature1, "content1"); expectReq(feature2, "content2"); replay(registry); Collection<String> libs1 = Lists.newArrayList(feature1); JsUri jsUri1 = new JsUri(UriStatus.VALID_UNVERSIONED, null, libs1, null); String version1 = versioner.version(jsUri1); Collection<String> libs2 = Lists.newArrayList(feature2); JsUri jsUri2 = new JsUri(UriStatus.VALID_UNVERSIONED, null, libs2, null); String version2 = versioner.version(jsUri2); assertNotNull(version1); assertNotNull(version2); assertFalse(version1.equals(version2)); verify(registry); }
private JsUri mockGadgetContext(boolean nocache, boolean debug, List<String> extern, List<String> loaded, boolean isContainer, Map<String, String> params, JsCompileMode compileMode, String repository) { JsUri context = createMock(JsUri.class); expect(context.getContainer()).andStubReturn(CONTAINER); expect(context.isNoCache()).andStubReturn(nocache); expect(context.isDebug()).andStubReturn(debug); expect(context.getGadget()).andStubReturn(GADGET_URI); expect(context.getContext()).andStubReturn( isContainer ? RenderingContext.CONTAINER : RenderingContext.GADGET); expect(context.getLibs()).andStubReturn(extern); expect(context.getLoadedLibs()).andStubReturn( loaded == null ? ImmutableList.<String>of() : loaded); expect(context.getOnload()).andStubReturn(null); expect(context.isJsload()).andStubReturn(false); expect(context.isNohint()).andStubReturn(false); expect(context.getExtensionParams()).andStubReturn(params); expect(context.getOrigUri()).andStubReturn(null); expect(context.getCompileMode()).andStubReturn(compileMode); expect(context.cajoleContent()).andStubReturn(false); expect(context.getRepository()).andStubReturn(repository); replay(context); return context; }
public Uri makeExternJsUri(JsUri ctx) { String container = ctx.getContainer(); String jsHost = getReqConfig(container, JS_HOST_PARAM); String jsPathBase = getReqConfig(container, JS_PATH_PARAM); jsPath.append(addJsLibs(ctx.getLibs())); if (!ctx.getLoadedLibs().isEmpty()) { jsPath.append('!').append(addJsLibs(ctx.getLoadedLibs())); ctx.isNoCache() ? "1" : "0"); ctx.isDebug() ? "1" : "0"); ctx.getContext().getParamValue()); uri.addQueryParameter(Param.URL.getKey(), ctx.getGadget()); if (ctx.getOnload() != null) { uri.addQueryParameter(Param.ONLOAD.getKey(), ctx.getOnload()); if (ctx.isJsload()) { uri.addQueryParameter(Param.JSLOAD.getKey(), "1"); if (ctx.isNohint()) { uri.addQueryParameter(Param.NO_HINT.getKey(), "1"); JsCompileMode mode = ctx.getCompileMode(); if (mode != null && mode != JsCompileMode.getDefault()) { uri.addQueryParameter(Param.COMPILE_MODE.getKey(), mode.getParamValue());
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");
registry = registryProvider.get(jsUri.getRepository()); } catch (GadgetException e) { throw new JsException(e.getHttpStatusCode(), e.getMessage()); ctx, jsUri.getLibs(), null).getBundles(); List<FeatureBundle> loadedBundles = registry.getFeatureResources( ctx, jsUri.getLoadedLibs(), null).getBundles(); UriStatus uriStatus = jsUri.getStatus(); setResponseCacheTtl(builder, uriStatus != null ? uriStatus : UriStatus.VALID_UNVERSIONED); return true;
EasyMock.expect(registry.getFeatures(requested)).andReturn(fullClosure); EasyMock.expect(registry.getFeatures(loaded)).andReturn(loadedClosure); EasyMock.expect(jsUri.getLibs()).andReturn(requested); EasyMock.expect(jsUri.getLoadedLibs()).andReturn(loaded); EasyMock.expect(jsUriManager.processExternJsUri(EasyMock.isA(Uri.class))).andReturn(jsUri); EasyMock.expect(request.getHeader(IMS_HEADER_KEY)).andReturn(null);
EasyMock.expect(registry.getFeatures(requested)).andReturn(fullClosure); EasyMock.expect(registry.getFeatures(loaded)).andReturn(loadedClosure); EasyMock.expect(jsUri.getLibs()).andReturn(requested); EasyMock.expect(jsUri.getLoadedLibs()).andReturn(loaded); EasyMock.expect(jsUriManager.processExternJsUri(EasyMock.isA(Uri.class))).andReturn(jsUri); EasyMock.expect(request.getHeader(IMS_HEADER_KEY)).andReturn(null);
public boolean process(JsRequest request, JsResponseBuilder builder) throws JsException { JsUri jsUri = request.getJsUri(); GadgetContext ctx = new JsGadgetContext(jsUri); FeatureRegistry registry; try { registry = registryProvider.get(jsUri.getRepository()); } catch (GadgetException e) { throw new JsException(e.getHttpStatusCode(), e.getMessage()); } // Append gadgets.config initialization if not in standard gadget mode. if (ctx.getRenderingContext() != RenderingContext.GADGET) { 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(), newReq, request.getHost(), null); if (!config.isEmpty()) { String configJson = JsonSerializer.serialize(config); if (allReq.contains(CONFIG_FEATURE) || loaded.contains(CONFIG_FEATURE)) { // config lib is present: pass it data injectBaseConfig(configJson, builder); } else { // config lib not available: use global variable injectGlobalConfig(configJson, builder); } } } return true; }
@Test public void testJsData() throws Exception { registerGadgetsHandler(null); List<String> features = ImmutableList.of("rpc", "io"); List<String> loadedFeatures = ImmutableList.of("rpc"); Uri jsUri = Uri.parse("http://shindig.com/gadgets/js/rpc:io"); String onload = "do \"this\";"; String repository = "v01"; JSONObject request = makeComplexJsRequest(features, loadedFeatures, onload, repository); Capture<JsUri> captureUri = new Capture<JsUri>(); EasyMock.expect(jsUriManager.makeExternJsUri(EasyMock.capture(captureUri))).andReturn(jsUri); String jsContent = "var b=\"123\";"; EasyMock.expect(jsPipeline.execute(EasyMock.isA(JsRequest.class))).andReturn( new JsResponseBuilder().appendJs(jsContent, "js").build()); replay(); RpcHandler operation = registry.getRpcHandler(request); Object responseObj = operation.execute(emptyFormItems, authContext, converter).get(); JSONObject results = new JSONObject(converter.convertToString(responseObj)); assertEquals(jsUri.toString(), results.getString("jsUrl")); JsUri expectedUri = new JsUri(123, true, true, CONTAINER, GADGET1_URL, features, loadedFeatures, onload, false, false, RenderingContext.CONTAINER, null, repository); assertEquals(expectedUri, captureUri.getValue()); assertFalse(results.has("error")); assertEquals(jsContent, results.getString("jsContent")); verify(); }
@Test public void testGetJsData() throws Exception { List<String> fields = ImmutableList.of("jscontent"); List<String> features = ImmutableList.of("rpc"); Uri resUri = Uri.parse("http://server.com/gadgets/js/rpc"); Capture<JsUri> uriCapture = new Capture<JsUri>(); String jsContent = "var a;"; String onload = "do this"; String repository = "v01"; expect(jsUriManager.makeExternJsUri(capture(uriCapture))).andReturn(resUri); expect(jsPipeline.execute(EasyMock.isA(JsRequest.class))).andReturn( new JsResponseBuilder().appendJs(jsContent, "js").setProxyCacheable(true).build()); GadgetsHandlerApi.JsRequest request = createJsRequest(FakeProcessor.SPEC_URL.toString(), CONTAINER, fields, features, repository); expect(request.getOnload()).andStubReturn(onload); expect(request.getContext()).andStubReturn(GadgetsHandlerApi.RenderingContext.CONTAINER); replay(); GadgetsHandlerApi.JsResponse response = gadgetHandler.getJs(request); JsUri expectedUri = new JsUri(null, false, false, CONTAINER, FakeProcessor.SPEC_URL.toString(), features, null, onload, false, false, RenderingContext.CONTAINER, null, repository); assertEquals(expectedUri, uriCapture.getValue()); assertNull(response.getJsUrl()); assertEquals(jsContent, response.getJsContent()); assertEquals(timeSource.currentTimeMillis() + HttpUtil.getDefaultTtl() * 1000, response .getExpireTimeMs().longValue()); verify(); }
@Test public void makeAndProcessSymmetric() throws GadgetException { // Make... ContainerConfig config = mockConfig("http://www.js.org", "/gadgets/js"); Gadget gadget = mockGadget(false, false); List<String> extern = Lists.newArrayList("feature1", "feature2", "feature3"); String version = "verstring"; Versioner versioner = mockVersioner(extern, version, version); TestDefaultJsUriManager manager = makeManager(config, versioner); Uri jsUri = manager.makeExternJsUri(gadget, extern); assertFalse(manager.hadError()); assertEquals("http", jsUri.getScheme()); assertEquals("www.js.org", jsUri.getAuthority()); assertEquals("/gadgets/js/" + addJsLibs(extern) + JS_SUFFIX, jsUri.getPath()); assertEquals(CONTAINER, jsUri.getQueryParameter(Param.CONTAINER.getKey())); assertEquals(version, jsUri.getQueryParameter(Param.VERSION.getKey())); assertEquals("0", jsUri.getQueryParameter(Param.NO_CACHE.getKey())); assertEquals("0", jsUri.getQueryParameter(Param.DEBUG.getKey())); // ...and process JsUri processed = manager.processExternJsUri(jsUri); assertEquals(UriStatus.VALID_VERSIONED, processed.getStatus()); assertCollectionEquals(extern, processed.getLibs()); }
public boolean process(JsRequest jsRequest, JsResponseBuilder builder) throws JsException { JsUri jsUri = jsRequest.getJsUri(); FeatureRegistry registry = null; String repository = jsUri.getRepository(); try { registry = featureRegistryProvider.get(jsUri.getRepository()); } catch (GadgetException e) { if (LOG.isLoggable(Level.WARNING)) { LOG.log(Level.WARNING, "No registry found for repository: " + repository, e); } } if (registry != null && !jsUri.isNohint()) { Set<String> allfeatures = registry.getAllFeatureNames(); Set<String> libs = Sets.newTreeSet(); libs.addAll(jsUri.getLibs()); libs.removeAll(jsUri.getLoadedLibs()); libs.retainAll(allfeatures); String array = toArrayString(libs); builder.appendJs(String.format(TEMPLATE, array), CODE_ID, true); } return true; }
@Test public void testJsSimple() throws Exception { registerGadgetsHandler(null); List<String> features = ImmutableList.of("rpc", "io"); Uri jsUri = Uri.parse("http://shindig.com/gadgets/js/rpc:io"); JSONObject request = makeSimpleJsRequest(null, features); Capture<JsUri> captureUri = new Capture<JsUri>(); EasyMock.expect(jsUriManager.makeExternJsUri(EasyMock.capture(captureUri))).andReturn(jsUri); replay(); RpcHandler operation = registry.getRpcHandler(request); Object responseObj = operation.execute(emptyFormItems, authContext, converter).get(); JSONObject results = new JSONObject(converter.convertToString(responseObj)); assertEquals(jsUri.toString(), results.getString("jsUrl")); JsUri expectedUri = new JsUri(null, false, false, CONTAINER, GADGET1_URL, features, null, null, false, false, RenderingContext.GADGET, null, null); assertEquals(expectedUri, captureUri.getValue()); assertFalse(results.has("error")); assertFalse(results.has("jsContent")); verify(); }
private JsUri mockGadgetContext(boolean nocache, boolean debug, List<String> extern, List<String> loaded, boolean isContainer, Map<String, String> params, JsCompileMode compileMode, String repository) { JsUri context = createMock(JsUri.class); expect(context.getContainer()).andStubReturn(CONTAINER); expect(context.isNoCache()).andStubReturn(nocache); expect(context.isDebug()).andStubReturn(debug); expect(context.getGadget()).andStubReturn(GADGET_URI); expect(context.getContext()).andStubReturn( isContainer ? RenderingContext.CONTAINER : RenderingContext.GADGET); expect(context.getLibs()).andStubReturn(extern); expect(context.getLoadedLibs()).andStubReturn( loaded == null ? ImmutableList.<String>of() : loaded); expect(context.getOnload()).andStubReturn(null); expect(context.isJsload()).andStubReturn(false); expect(context.isNohint()).andStubReturn(false); expect(context.getExtensionParams()).andStubReturn(params); expect(context.getOrigUri()).andStubReturn(null); expect(context.getCompileMode()).andStubReturn(compileMode); expect(context.cajoleContent()).andStubReturn(false); expect(context.getRepository()).andStubReturn(repository); replay(context); return context; }
private void checkNoMatchingFeaturesDoesNothing(RenderingContext ctx) throws Exception { JsResponseBuilder builder = prepareRequestReturnBuilder(ctx); Map<String, Object> baseConfig = Maps.newHashMap(); baseConfig.put("feature1", "config1"); Map<String, String> f2MapConfig = Maps.newHashMap(); f2MapConfig.put("key1", "val1"); f2MapConfig.put("key2", "val2"); baseConfig.put("feature2", f2MapConfig); expect(containerConfig.getMap(CONTAINER, ConfigInjectionProcessor.GADGETS_FEATURES_KEY)) .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(); assertTrue(processor.process(request, builder)); control.verify(); assertEquals(BASE_CODE, builder.build().toJsString()); }
@Test public void testJsSimple() throws Exception { registerGadgetsHandler(null); List<String> features = ImmutableList.of("rpc", "io"); Uri jsUri = Uri.parse("http://shindig.com/gadgets/js/rpc:io"); JSONObject request = makeSimpleJsRequest(null, features); Capture<JsUri> captureUri = new Capture<JsUri>(); EasyMock.expect(jsUriManager.makeExternJsUri(EasyMock.capture(captureUri))).andReturn(jsUri); replay(); RpcHandler operation = registry.getRpcHandler(request); Object responseObj = operation.execute(emptyFormItems, authContext, converter).get(); JSONObject results = new JSONObject(converter.convertToString(responseObj)); assertEquals(jsUri.toString(), results.getString("jsUrl")); JsUri expectedUri = new JsUri(null, false, false, CONTAINER, GADGET1_URL, features, null, null, false, false, RenderingContext.GADGET, null, null); assertEquals(expectedUri, captureUri.getValue()); assertFalse(results.has("error")); assertFalse(results.has("jsContent")); verify(); }
@Test public void testGetJsUri() throws Exception { List<String> fields = ImmutableList.of("jsurl"); List<String> features = ImmutableList.of("rpc"); Uri resUri = Uri.parse("server.com/gadgets/js/rpc"); GadgetsHandlerApi.JsRequest request = createJsRequest(null, CONTAINER, fields, features, null); Capture<JsUri> uriCapture = new Capture<JsUri>(); expect(jsUriManager.makeExternJsUri(capture(uriCapture))).andReturn(resUri); replay(); GadgetsHandlerApi.JsResponse response = gadgetHandler.getJs(request); JsUri expectedUri = new JsUri(null, false, false, CONTAINER, null, features, null, null, false, false, RenderingContext.GADGET, null, null); assertEquals(expectedUri, uriCapture.getValue()); assertEquals(resUri, response.getJsUrl()); assertNull(response.getJsContent()); assertEquals(timeSource.currentTimeMillis() + HttpUtil.getDefaultTtl() * 1000, response .getExpireTimeMs().longValue()); verify(); }
private void checkNoMatchingFeaturesDoesNothing(RenderingContext ctx) throws Exception { JsResponseBuilder builder = prepareRequestReturnBuilder(ctx); Map<String, Object> baseConfig = Maps.newHashMap(); baseConfig.put("feature1", "config1"); Map<String, String> f2MapConfig = Maps.newHashMap(); f2MapConfig.put("key1", "val1"); f2MapConfig.put("key2", "val2"); baseConfig.put("feature2", f2MapConfig); expect(containerConfig.getMap(CONTAINER, ConfigInjectionProcessor.GADGETS_FEATURES_KEY)) .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(); assertTrue(processor.process(request, builder)); control.verify(); assertEquals(BASE_CODE, builder.build().toJsString()); }
@Test public void testGetJsUri() throws Exception { List<String> fields = ImmutableList.of("jsurl"); List<String> features = ImmutableList.of("rpc"); Uri resUri = Uri.parse("server.com/gadgets/js/rpc"); GadgetsHandlerApi.JsRequest request = createJsRequest(null, CONTAINER, fields, features, null); Capture<JsUri> uriCapture = new Capture<JsUri>(); expect(jsUriManager.makeExternJsUri(capture(uriCapture))).andReturn(resUri); replay(); GadgetsHandlerApi.JsResponse response = gadgetHandler.getJs(request); JsUri expectedUri = new JsUri(null, false, false, CONTAINER, null, features, null, null, false, false, RenderingContext.GADGET, null, null); assertEquals(expectedUri, uriCapture.getValue()); assertEquals(resUri, response.getJsUrl()); assertNull(response.getJsContent()); assertEquals(timeSource.currentTimeMillis() + HttpUtil.getDefaultTtl() * 1000, response .getExpireTimeMs().longValue()); verify(); }