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.