You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by et...@apache.org on 2008/03/22 09:39:55 UTC
svn commit: r639963 - in /incubator/shindig/trunk/java/gadgets/src:
main/java/org/apache/shindig/gadgets/
main/java/org/apache/shindig/gadgets/http/
main/java/org/apache/shindig/gadgets/spec/
test/java/org/apache/shindig/gadgets/ test/java/org/apache/s...
Author: etnu
Date: Sat Mar 22 01:39:53 2008
New Revision: 639963
URL: http://svn.apache.org/viewvc?rev=639963&view=rev
Log:
Introduced x-path like querying of syndicator configuration, as discussed in SHINDIG-140, and implemented view alias support (SHINDIG-132) using this technique.
Modified:
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/SyndicatorConfig.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/DefaultCrossServletState.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderer.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpUtil.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/JsServlet.java
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/GadgetSpec.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetTestFixture.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/SyndicatorConfigTest.java
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/GadgetRendererTest.java
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/SyndicatorConfig.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/SyndicatorConfig.java?rev=639963&r1=639962&r2=639963&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/SyndicatorConfig.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/SyndicatorConfig.java Sat Mar 22 01:39:53 2008
@@ -33,6 +33,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.logging.Level;
import java.util.logging.Logger;
/**
@@ -59,41 +60,52 @@
}
/**
- * Attempts to fetch a parameter for the given syndicator, or the default
- * syndicator if the specified syndicator is not supported.
- *
- * @param syndicator
- * @param parameter
- * @return A configuration parameter as a string, or null if not set.
- */
- public String get(String syndicator, String parameter) {
- JSONObject syndicatorData = config.get(syndicator);
- if (syndicatorData == null) {
- return null;
- }
- Object value = syndicatorData.opt(parameter);
- return value == null ? null : value.toString();
- }
-
- /**
* Fetches a configuration parameter as a JSON object, array, string, or
* number, ensuring that it can be safely passed to javascript without any
* additional filtering.
*
* @param syndicator
- * @param parameter
+ * @param parameter The value to fetch. May be specified as an x-path like
+ * object reference such as "gadgets/features/views".
* @return A configuration parameter as a JSON object or null if not set or
* can't be interpreted as JSON.
*/
public Object getJson(String syndicator, String parameter) {
- JSONObject syndicatorData = config.get(syndicator);
- if (syndicatorData == null) {
+ JSONObject data = config.get(syndicator);
+ if (data == null) {
return null;
}
if (parameter == null) {
- return syndicatorData;
+ return data;
+ }
+
+ try {
+ for (String param : parameter.split("/")) {
+ Object next = data.get(param);
+ if (next instanceof JSONObject) {
+ data = (JSONObject)next;
+ } else {
+ return next;
+ }
+ }
+ return data;
+ } catch (JSONException e) {
+ logger.log(Level.WARNING, "Failed to get JSON config", e);
+ return null;
}
- return syndicatorData.opt(parameter);
+ }
+
+ /**
+ * Attempts to fetch a parameter for the given syndicator, or the default
+ * syndicator if the specified syndicator is not supported.
+ *
+ * @param syndicator
+ * @param parameter
+ * @return A configuration parameter as a string, or null if not set.
+ */
+ public String get(String syndicator, String parameter) {
+ Object data = getJson(syndicator, parameter);
+ return data == null ? null : data.toString();
}
/**
@@ -103,14 +115,11 @@
* can't be interpreted as JSON.
*/
public JSONObject getJsonObject(String syndicator, String parameter) {
- JSONObject syndicatorData = config.get(syndicator);
- if (syndicatorData == null) {
- return null;
- }
- if (parameter == null) {
- return syndicatorData;
+ Object data = getJson(syndicator, parameter);
+ if (data instanceof JSONObject) {
+ return (JSONObject)data;
}
- return syndicatorData.optJSONObject(parameter);
+ return null;
}
/**
@@ -120,11 +129,11 @@
* can't be interpreted as JSON.
*/
public JSONArray getJsonArray(String syndicator, String parameter) {
- JSONObject syndicatorData = config.get(syndicator);
- if (syndicatorData == null) {
- return null;
+ Object data = getJson(syndicator, parameter);
+ if (data instanceof JSONArray) {
+ return (JSONArray)data;
}
- return syndicatorData.optJSONArray(parameter);
+ return null;
}
/**
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/DefaultCrossServletState.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/DefaultCrossServletState.java?rev=639963&r1=639962&r2=639963&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/DefaultCrossServletState.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/DefaultCrossServletState.java Sat Mar 22 01:39:53 2008
@@ -96,7 +96,11 @@
try {
GadgetSpec spec = gadget.getSpec();
String url = context.getUrl().toString();
- View view = spec.getView(context.getView());
+ View view = HttpUtil.getView(gadget,
+ gadgetServer.getConfig().getSyndicatorConfig());
+ if (view == null) {
+ return "";
+ }
if (view.getType().equals(View.ContentType.HTML)) {
buf.append(iframePath)
.append("url=")
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderer.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderer.java?rev=639963&r1=639962&r2=639963&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderer.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderer.java Sat Mar 22 01:39:53 2008
@@ -120,10 +120,11 @@
*/
private void outputGadget(Gadget gadget) throws IOException, GadgetException {
String viewName = context.getView();
- View view = gadget.getSpec().getView(viewName);
+ View view = HttpUtil.getView(gadget,
+ state.getGadgetServer().getConfig().getSyndicatorConfig());
if (view == null) {
- throw new GadgetException(GadgetException.Code.UNKNOWN_VIEW_SPECIFIED,
- "No appropriate view could be found for this gadget");
+ throw new GadgetException(GadgetException.Code.UNKNOWN_VIEW_SPECIFIED,
+ "No appropriate view could be found for this gadget");
}
switch(view.getType()) {
case HTML:
@@ -215,9 +216,9 @@
} else {
inlineJs.append(library.getContent());
}
+ inlineJs.append(";\n");
}
}
- inlineJs.append(";\n");
}
for (JsLibrary library : gadget.getJsLibraries()) {
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpUtil.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpUtil.java?rev=639963&r1=639962&r2=639963&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpUtil.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/HttpUtil.java Sat Mar 22 01:39:53 2008
@@ -19,9 +19,13 @@
package org.apache.shindig.gadgets.http;
+import org.apache.shindig.gadgets.Gadget;
import org.apache.shindig.gadgets.GadgetContext;
import org.apache.shindig.gadgets.SyndicatorConfig;
+import org.apache.shindig.gadgets.spec.GadgetSpec;
+import org.apache.shindig.gadgets.spec.View;
+import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
@@ -91,5 +95,42 @@
}
}
return new JSONObject();
+ }
+
+ /**
+ * Fetches the most appropriate view for the given gadget and syndicator
+ * configuration.
+ *
+ * @param gadget
+ * @param config
+ * @return
+ */
+ public static View getView(Gadget gadget, SyndicatorConfig config) {
+ GadgetContext context = gadget.getContext();
+ String viewName = context.getView();
+ GadgetSpec spec = gadget.getSpec();
+ View view = spec.getView(viewName);
+ if (view == null) {
+ JSONArray aliases = config.getJsonArray(context.getSyndicator(),
+ "gadgets.features/views/" + viewName + "/aliases");
+ if (aliases != null) {
+ try {
+ for (int i = 0, j = aliases.length(); i < j; ++i) {
+ viewName = aliases.getString(i);
+ view = spec.getView(viewName);
+ if (view != null) {
+ break;
+ }
+ }
+ } catch (JSONException e) {
+ view = null;
+ }
+ }
+
+ if (view == null) {
+ view = gadget.getSpec().getView(GadgetSpec.DEFAULT_VIEW);
+ }
+ }
+ return view;
}
}
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/JsServlet.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/JsServlet.java?rev=639963&r1=639962&r2=639963&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/JsServlet.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/JsServlet.java Sat Mar 22 01:39:53 2008
@@ -96,7 +96,7 @@
GadgetFeatureFactory factory = entry.getFeature();
GadgetFeature feature = factory.create();
for (JsLibrary lib : feature.getJsLibraries(context)) {
- if (lib.getType() != JsLibrary.Type.URL) {
+ if (!lib.getType().equals(JsLibrary.Type.URL)) {
if (context.getDebug()) {
jsData.append(lib.getDebugContent());
} else {
Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/GadgetSpec.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/GadgetSpec.java?rev=639963&r1=639962&r2=639963&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/GadgetSpec.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/GadgetSpec.java Sat Mar 22 01:39:53 2008
@@ -91,11 +91,7 @@
* @return The view object, if it exists, or null.
*/
public View getView(String name) {
- View view = views.get(name);
- if (view == null && !name.equals(DEFAULT_VIEW)) {
- return views.get(DEFAULT_VIEW);
- }
- return view;
+ return views.get(name);
}
/**
Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetTestFixture.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetTestFixture.java?rev=639963&r1=639962&r2=639963&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetTestFixture.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetTestFixture.java Sat Mar 22 01:39:53 2008
@@ -45,7 +45,8 @@
public final DataFetcher<MessageBundle> bundleFetcher
= mock(DataFetcher.class);
public final GadgetBlacklist blacklist = mock(GadgetBlacklist.class, true);
- public final GadgetFeatureRegistry registry;
+ public GadgetFeatureRegistry registry;
+ public SyndicatorConfig syndicatorConfig;
public final CrossServletState state = new CrossServletState() {
@Override
public GadgetServer getGadgetServer() {
@@ -127,14 +128,21 @@
config.setGadgetSpecFetcher(specFetcher);
config.setMessageBundleFetcher(bundleFetcher);
config.setContentFetcher(fetcher);
- GadgetFeatureRegistry temp = null;
try {
- temp = new GadgetFeatureRegistry(null, fetcher);
+ registry = new GadgetFeatureRegistry(null, fetcher);
} catch (Exception e) {
e.printStackTrace();
fail("Failed to create feature registry");
}
- registry = temp;
+
+ try {
+ syndicatorConfig = new SyndicatorConfig(null);
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail("Failed to create syndicator config");
+ }
+
+ config.setSyndicatorConfig(syndicatorConfig);
config.setFeatureRegistry(registry);
config.setGadgetBlacklist(blacklist);
gadgetServer = new GadgetServer(config);
Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/SyndicatorConfigTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/SyndicatorConfigTest.java?rev=639963&r1=639962&r2=639963&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/SyndicatorConfigTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/SyndicatorConfigTest.java Sat Mar 22 01:39:53 2008
@@ -22,11 +22,11 @@
import static org.apache.shindig.gadgets.SyndicatorConfig.DEFAULT_SYNDICATOR;
import static org.apache.shindig.gadgets.SyndicatorConfig.SYNDICATOR_KEY;
-import junit.framework.TestCase;
-
import org.json.JSONArray;
import org.json.JSONObject;
+import junit.framework.TestCase;
+
/**
*
*/
@@ -111,5 +111,11 @@
ARRAY_NAME);
JSONArray defaultArray = new JSONArray(ARRAY_VALUE);
assertEquals(defaultArrayTest.toString(), defaultArray.toString());
+ }
+
+ public void testPathQuery() throws Exception {
+ String path = NESTED_KEY + "/" + NESTED_NAME;
+ String data = config.get(DEFAULT_SYNDICATOR, path);
+ assertEquals(NESTED_VALUE, data);
}
}
Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/GadgetRendererTest.java
URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/GadgetRendererTest.java?rev=639963&r1=639962&r2=639963&view=diff
==============================================================================
--- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/GadgetRendererTest.java (original)
+++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/http/GadgetRendererTest.java Sat Mar 22 01:39:53 2008
@@ -23,15 +23,19 @@
import static org.easymock.EasyMock.expect;
import org.apache.shindig.gadgets.GadgetTestFixture;
+import org.apache.shindig.gadgets.SyndicatorConfig;
import org.apache.shindig.gadgets.spec.GadgetSpec;
+import org.json.JSONArray;
+import org.json.JSONObject;
+
import java.io.ByteArrayOutputStream;
import java.io.PrintWriter;
import java.net.URI;
+import java.util.Arrays;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Set;
-import java.util.Arrays;
public class GadgetRendererTest extends GadgetTestFixture {
@@ -49,11 +53,13 @@
final static URI SPEC_URL = URI.create("http://example.org/gadget.xml");
final static String CONTENT = "Hello, world!";
+ final static String ALT_CONTENT = "Goodbye, city.";
final static String SPEC_XML
= "<Module>" +
"<ModulePrefs title=\"hello\"/>" +
"<Content type=\"html\" quirks=\"false\">" + CONTENT + "</Content>" +
"<Content type=\"html\" view=\"quirks\" quirks=\"true\"/>" +
+ "<Content type=\"html\" view=\"ALIAS\">" + ALT_CONTENT + "</Content>" +
"</Module>";
final static String LIBS = "dummy:blah";
@@ -62,10 +68,11 @@
* @return Output of the rendering request
* @throws Exception
*/
- private String parseBasicGadget() throws Exception {
+ private String parseBasicGadget(String view) throws Exception {
GadgetSpec spec = new GadgetSpec(SPEC_URL, SPEC_XML);
expect(request.getParameter("url")).andReturn(SPEC_URL.toString());
expect(request.getParameter("libs")).andReturn(LIBS);
+ expect(request.getParameter("view")).andReturn(view);
expect(request.getParameterNames()).andReturn(EMPTY_PARAMS);
expect(specFetcher.fetch(eq(SPEC_URL), eq(false))).andReturn(spec);
expect(response.getWriter()).andReturn(writer);
@@ -77,22 +84,44 @@
return new String(baos.toByteArray(), "UTF-8");
}
- public void testHasCorrectDocType() throws Exception {
- String content = parseBasicGadget();
+ public void testStandardsMode() throws Exception {
+ String content = parseBasicGadget(GadgetSpec.DEFAULT_VIEW);
assertTrue(-1 != content.indexOf(GadgetRenderer.STRICT_MODE_DOCTYPE));
}
+ public void testQuirksMode() throws Exception {
+ String content = parseBasicGadget("quirks");
+ assertTrue(-1 == content.indexOf(GadgetRenderer.STRICT_MODE_DOCTYPE));
+ }
+
+
public void testContentRendered() throws Exception {
- String content = parseBasicGadget();
+ String content = parseBasicGadget(GadgetSpec.DEFAULT_VIEW);
assertTrue(-1 != content.indexOf(CONTENT));
}
public void testForcedLibsIncluded() throws Exception {
- String content = parseBasicGadget();
+ String content = parseBasicGadget(GadgetSpec.DEFAULT_VIEW);
Set<String> libs = new HashSet<String>();
libs.addAll(Arrays.asList(LIBS.split(":")));
String libStr = state.getJsUrl(libs, null);
assertTrue(-1 != content.indexOf("<script src=\"" + libStr + "\">"));
+ }
+
+ public void testViewAliases() throws Exception {
+ JSONObject json = new JSONObject();
+ json.put("gadgets.syndicator",
+ new JSONArray().put(SyndicatorConfig.DEFAULT_SYNDICATOR));
+ JSONArray aliases = new JSONArray().put("ALIAS");
+ JSONObject dummy = new JSONObject().put("aliases", aliases);
+ JSONObject views = new JSONObject().put("dummy", dummy);
+ JSONObject features = new JSONObject().put("views", views);
+ json.put("gadgets.features", features);
+ syndicatorConfig.loadFromString(json.toString());
+
+ String content = parseBasicGadget("dummy");
+
+ assertTrue(-1 != content.indexOf(ALT_CONTENT));
}
// TODO: Lots of ugly tests on html content.