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>";