Author: etnu
Date: Thu Jun  5 16:34:15 2008
New Revision: 663784

URL: http://svn.apache.org/viewvc?rev=663784&view=rev
Log:
Implemented requirements for SHINDIG-343, as well as improving tests for 
XmlUtil.

Side note: JsonRpcHandler could stand to be revisited. Comments added.


Added:
    
incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/common/xml/
    
incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/common/xml/XmlUtilTest.java
Modified:
    
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/xml/XmlUtil.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsonRpcHandler.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/ModulePrefs.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/View.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsonRpcHandlerTest.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/ModulePrefsTest.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/ViewTest.java

Modified: 
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/xml/XmlUtil.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/xml/XmlUtil.java?rev=663784&r1=663783&r2=663784&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/xml/XmlUtil.java
 (original)
+++ 
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/common/xml/XmlUtil.java
 Thu Jun  5 16:34:15 2008
@@ -35,6 +35,8 @@
 
 public class XmlUtil {
 
+  private XmlUtil() {}
+
   /**
    * Extracts an attribute from a node.
    *
@@ -104,7 +106,7 @@
     if (value == null) {
       return def;
     }
-    return !"false".equals(value);
+    return Boolean.parseBoolean(value);
   }
 
   /**
@@ -118,6 +120,28 @@
   }
 
   /**
+   * @return An attribute coerced to an integer.
+   */
+  public static int getIntAttribute(Node node, String attr, int def) {
+    String value = getAttribute(node, attr);
+    if (value == null) {
+      return def;
+    }
+    try {
+      return Integer.parseInt(value);
+    } catch (NumberFormatException e) {
+      return def;
+    }
+  }
+
+  /**
+   * @return An attribute coerced to an integer.
+   */
+  public static int getIntAttribute(Node node, String attr) {
+    return getIntAttribute(node, attr, 0);
+  }
+
+  /**
    * Attempts to parse the input xml into a single element.
    * @param xml
    * @return The document object

Added: 
incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/common/xml/XmlUtilTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/common/xml/XmlUtilTest.java?rev=663784&view=auto
==============================================================================
--- 
incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/common/xml/XmlUtilTest.java
 (added)
+++ 
incubator/shindig/trunk/java/common/src/test/java/org/apache/shindig/common/xml/XmlUtilTest.java
 Thu Jun  5 16:34:15 2008
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.shindig.common.xml;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.w3c.dom.Element;
+
+import java.net.URI;
+
+/**
+ * Tests for XmlUtil
+ */
+public class XmlUtilTest {
+  private final static String STRING_ATTR = "string";
+  private final static String STRING_VALUE = "some string value";
+  private final static String INT_ATTR = "int";
+  private final static int INT_VALUE = 10;
+  private final static String BOOL_TRUE_ATTR = "bool-true";
+  private final static String BOOL_FALSE_ATTR = "bool-false";
+  private final static String URI_ATTR = "uri";
+  private final static URI URI_VALUE = URI.create("http://example.org/file";);
+  private final static String URI_MALFORMED_ATTR = "uri-malformed";
+  private final static String FAKE_ATTR = "fake";
+
+  private final static String XML
+      = "<Element " +
+      STRING_ATTR + "='" + STRING_VALUE + "' " +
+      INT_ATTR + "='" + INT_VALUE + "' " +
+      BOOL_TRUE_ATTR + "='true' " +
+      BOOL_FALSE_ATTR + "='false' " +
+      URI_ATTR + "='" + URI_VALUE + "' " +
+      URI_MALFORMED_ATTR + "='$#%$^$^$^$%$%!! '" +
+      "/>";
+
+  private Element node;
+
+  @Before
+  public void makeElement() throws XmlException {
+    node = XmlUtil.parse(XML);
+  }
+
+  @Test
+  public void getAttribute() {
+    assertEquals(STRING_VALUE, XmlUtil.getAttribute(node, STRING_ATTR));
+    assertEquals(STRING_VALUE, XmlUtil.getAttribute(node, FAKE_ATTR, 
STRING_VALUE));
+    assertNull("getAttribute must return null for undefined attributes.",
+        XmlUtil.getAttribute(node, FAKE_ATTR));
+  }
+
+  @Test
+  public void getIntAttribute() {
+    assertEquals(INT_VALUE, XmlUtil.getIntAttribute(node, INT_ATTR));
+    assertEquals(INT_VALUE, XmlUtil.getIntAttribute(node, FAKE_ATTR, 
INT_VALUE));
+    assertEquals(INT_VALUE, XmlUtil.getIntAttribute(node, STRING_ATTR, 
INT_VALUE));
+    assertEquals("getIntAttribute must return 0 for undefined attributes.",
+        0, XmlUtil.getIntAttribute(node, FAKE_ATTR));
+  }
+
+  @Test
+  public void getBoolAttribute() {
+    assertTrue(XmlUtil.getBoolAttribute(node, BOOL_TRUE_ATTR));
+    assertFalse(XmlUtil.getBoolAttribute(node, BOOL_FALSE_ATTR));
+    assertTrue(XmlUtil.getBoolAttribute(node, FAKE_ATTR, true));
+    assertFalse(XmlUtil.getBoolAttribute(node, FAKE_ATTR, false));
+    assertFalse("getBoolAttribute must return false for undefined attributes.",
+        XmlUtil.getBoolAttribute(node, FAKE_ATTR));
+  }
+
+  @Test
+  public void getUriAttribute() {
+    assertEquals(URI_VALUE, XmlUtil.getUriAttribute(node, URI_ATTR));
+    assertEquals(URI_VALUE, XmlUtil.getUriAttribute(node, FAKE_ATTR, 
URI_VALUE));
+    assertEquals(URI_VALUE, XmlUtil.getUriAttribute(node, URI_MALFORMED_ATTR, 
URI_VALUE));
+    assertNull("getUriAttribute must return null for undefined attributes.",
+        XmlUtil.getUriAttribute(node, FAKE_ATTR));
+  }
+
+  @Test(expected=XmlException.class)
+  public void parseBadXmlThrows() throws XmlException {
+    XmlUtil.parse("malformed xml");
+  }
+}

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsonRpcHandler.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsonRpcHandler.java?rev=663784&r1=663783&r2=663784&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsonRpcHandler.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/servlet/JsonRpcHandler.java
 Thu Jun  5 16:34:15 2008
@@ -143,7 +143,9 @@
           views.put(view.getName(), new JSONObject()
                // .put("content", view.getContent())
                .put("type", view.getType().toString().toLowerCase())
-               .put("quirks", view.getQuirks()));
+               .put("quirks", view.getQuirks())
+               .put("preferredHeight", view.getPreferredHeight())
+               .put("preferredWidth", view.getPreferredWidth()));
         }
 
         // Features.
@@ -162,6 +164,9 @@
           userPrefs.put(pref.getName(), up);
         }
 
+        // TODO: This should probably just copy all data from
+        // ModulePrefs.getAttributes(), but names have to be converted to
+        // camel case.
         gadgetJson.put("iframeUrl", urlGenerator.getIframeUrl(gadget))
                   .put("url", gadget.getContext().getUrl().toString())
                   .put("moduleId", gadget.getContext().getModuleId())
@@ -170,6 +175,7 @@
                   .put("views", views)
                   .put("features", features)
                   .put("userPrefs", userPrefs)
+
                   // extended meta data
                   .put("directoryTitle", prefs.getDirectoryTitle())
                   .put("thumbnail", prefs.getThumbnail().toString())

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/ModulePrefs.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/ModulePrefs.java?rev=663784&r1=663783&r2=663784&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/ModulePrefs.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/ModulePrefs.java
 Thu Jun  5 16:34:15 2008
@@ -17,6 +17,7 @@
  */
 package org.apache.shindig.gadgets.spec;
 import org.apache.shindig.gadgets.Substitutions;
+
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
@@ -67,7 +68,7 @@
 
   private static final URI EMPTY_URI = URI.create("");
 
-  Map<String, String> attributes;
+  private final Map<String, String> attributes;
 
   // Canonical spec items first.
 

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/View.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/View.java?rev=663784&r1=663783&r2=663784&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/View.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/spec/View.java
 Thu Jun  5 16:34:15 2008
@@ -19,6 +19,7 @@
 
 import org.apache.shindig.common.xml.XmlUtil;
 import org.apache.shindig.gadgets.Substitutions;
+
 import org.w3c.dom.Element;
 
 import java.net.URI;
@@ -73,6 +74,22 @@
   }
 
   /**
+   * [EMAIL PROTECTED]
+   */
+  private final int preferredHeight;
+  public int getPreferredHeight() {
+    return preferredHeight;
+  }
+
+  /**
+   * [EMAIL PROTECTED]
+   */
+  private final int preferredWidth;
+  public int getPreferredWidth() {
+    return preferredWidth;
+  }
+
+  /**
    * Content#CDATA
    *
    * All substitutions
@@ -117,6 +134,12 @@
        .append(href)
        .append("\" view=\"")
        .append(name)
+       .append("\" quirks=\"")
+       .append(quirks)
+       .append("\" preferredHeight=\"")
+       .append(preferredHeight)
+       .append("\" preferredWidth=\"")
+       .append(preferredWidth)
        .append("\">")
        .append(content)
        .append("</Content>");
@@ -136,6 +159,8 @@
     URI href = null;
     String contentType = null;
     ContentType type = null;
+    int preferredHeight = 0;
+    int preferredWidth = 0;
     StringBuilder content = new StringBuilder();
     for (Element element : elements) {
       contentType = XmlUtil.getAttribute(element, "type");
@@ -150,6 +175,8 @@
       }
       href = XmlUtil.getUriAttribute(element, "href", href);
       quirks = XmlUtil.getBoolAttribute(element, "quirks", quirks);
+      preferredHeight = XmlUtil.getIntAttribute(element, "preferred_height");
+      preferredWidth = XmlUtil.getIntAttribute(element, "preferred_width");
       content.append(element.getTextContent());
     }
     this.content = content.toString();
@@ -158,6 +185,8 @@
     this.href = href;
     this.rawType = contentType;
     this.type = type;
+    this.preferredHeight = preferredHeight;
+    this.preferredWidth = preferredWidth;
     if (type == ContentType.URL && this.href == null) {
       throw new SpecParserException(
           "[EMAIL PROTECTED] must be set when [EMAIL PROTECTED] is \"url\".");
@@ -179,6 +208,8 @@
     rawType = view.rawType;
     type = view.type;
     quirks = view.quirks;
+    preferredHeight = view.preferredHeight;
+    preferredWidth = view.preferredWidth;
   }
 
   /**

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsonRpcHandlerTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsonRpcHandlerTest.java?rev=663784&r1=663783&r2=663784&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsonRpcHandlerTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/JsonRpcHandlerTest.java
 Thu Jun  5 16:34:15 2008
@@ -22,8 +22,8 @@
 import static org.easymock.EasyMock.isA;
 
 import org.apache.shindig.gadgets.Gadget;
-import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.http.HttpRequest;
+import org.apache.shindig.gadgets.http.HttpResponse;
 import org.apache.shindig.gadgets.spec.GadgetSpec;
 
 import org.json.JSONArray;
@@ -36,17 +36,20 @@
 
 public class JsonRpcHandlerTest extends HttpTestFixture {
   private static final URI SPEC_URL = URI.create("http://example.org/g.xml";);
-  private static final HttpRequest SPEC_REQUEST
-      = new HttpRequest(SPEC_URL);
+  private static final HttpRequest SPEC_REQUEST = new HttpRequest(SPEC_URL);
   private static final URI SPEC_URL2 = URI.create("http://example.org/g2.xml";);
-  private static final HttpRequest SPEC_REQUEST2
-      = new HttpRequest(SPEC_URL2);
+  private static final HttpRequest SPEC_REQUEST2 = new HttpRequest(SPEC_URL2);
   private static final String SPEC_TITLE = "JSON-TEST";
   private static final String SPEC_TITLE2 = "JSON-TEST2";
+  private static final int PREFERRED_HEIGHT = 100;
+  private static final int PREFERRED_WIDTH = 242;
   private static final String SPEC_XML
       = "<Module>" +
         "<ModulePrefs title=\"" + SPEC_TITLE + "\"/>" +
-        "<Content type=\"html\">Hello, world</Content>" +
+        "<Content type=\"html\"" +
+        " preferred_height = \"" + PREFERRED_HEIGHT + "\"" +
+        " preferred_width = \"" + PREFERRED_WIDTH + "\"" +
+        ">Hello, world</Content>" +
         "</Module>";
   private static final String SPEC_XML2
       = "<Module>" +
@@ -89,6 +92,10 @@
     assertEquals(SPEC_URL.toString(), gadget.getString("iframeUrl"));
     assertEquals(SPEC_TITLE, gadget.getString("title"));
     assertEquals(0, gadget.getInt("moduleId"));
+    JSONObject view = gadget.getJSONObject("views")
+        .getJSONObject(GadgetSpec.DEFAULT_VIEW);
+    assertEquals(PREFERRED_HEIGHT, view.getInt("preferredHeight"));
+    assertEquals(PREFERRED_WIDTH, view.getInt("preferredWidth"));
   }
 
   public void testMultipleGadgets() throws Exception {

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/ModulePrefsTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/ModulePrefsTest.java?rev=663784&r1=663783&r2=663784&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/ModulePrefsTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/ModulePrefsTest.java
 Thu Jun  5 16:34:15 2008
@@ -29,6 +29,7 @@
 
 public class ModulePrefsTest extends TestCase {
   private static final URI SPEC_URL = URI.create("http://example.org/g.xml";);
+
   public void testBasic() throws Exception {
     String xml = "<ModulePrefs" +
                  " title=\"title\"" +
@@ -51,6 +52,7 @@
                  "  <Locale/>" +
                  "</ModulePrefs>";
     ModulePrefs prefs = new ModulePrefs(XmlUtil.parse(xml), SPEC_URL);
+
     assertEquals("title", prefs.getTitle());
     assertEquals("title_url", prefs.getTitleUrl().toString());
     assertEquals("description", prefs.getDescription());

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/ViewTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/ViewTest.java?rev=663784&r1=663783&r2=663784&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/ViewTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/spec/ViewTest.java
 Thu Jun  5 16:34:15 2008
@@ -19,12 +19,12 @@
 
 package org.apache.shindig.gadgets.spec;
 
-import junit.framework.TestCase;
-
 import org.apache.shindig.common.xml.XmlUtil;
 import org.apache.shindig.gadgets.Substitutions;
 import org.apache.shindig.gadgets.Substitutions.Type;
 
+import junit.framework.TestCase;
+
 import java.util.Arrays;
 
 public class ViewTest extends TestCase {
@@ -122,6 +122,22 @@
     assertEquals(true, view.getQuirks());
   }
 
+  public void testPreferredHeight() throws Exception {
+    String content1 = "<Content type=\"html\" preferred_height=\"100\"/>";
+    String content2 = "<Content type=\"html\" preferred_height=\"300\"/>";
+    View view = new View("test", Arrays.asList(XmlUtil.parse(content1),
+                                               XmlUtil.parse(content2)));
+    assertEquals(300, view.getPreferredHeight());
+  }
+
+  public void testPreferredWidth() throws Exception {
+    String content1 = "<Content type=\"html\" preferred_width=\"300\"/>";
+    String content2 = "<Content type=\"html\" preferred_width=\"172\"/>";
+    View view = new View("test", Arrays.asList(XmlUtil.parse(content1),
+                                               XmlUtil.parse(content2)));
+    assertEquals(172, view.getPreferredWidth());
+  }
+
   public void testContentSubstitution() throws Exception {
     String xml
         = "<Content type=\"html\">Hello, __MSG_world__ 
__MODULE_ID__</Content>";


Reply via email to