Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java?rev=610196&r1=610195&r2=610196&view=diff ============================================================================== --- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java (original) +++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/GadgetRenderingServlet.java Tue Jan 8 14:15:54 2008 @@ -22,12 +22,12 @@ import org.apache.shindig.gadgets.GadgetServer; import org.apache.shindig.gadgets.GadgetSpec; import org.apache.shindig.gadgets.GadgetView; +import org.apache.shindig.gadgets.JsFeatureLoader; import org.apache.shindig.gadgets.JsLibrary; import org.apache.shindig.gadgets.MessageBundle; import org.apache.shindig.gadgets.RemoteContentFetcher; +import org.apache.shindig.gadgets.RenderingContext; import org.apache.shindig.gadgets.UserPrefs; -import org.json.JSONException; -import org.json.JSONObject; import java.io.IOException; import java.io.UnsupportedEncodingException; @@ -36,11 +36,13 @@ import java.net.URLEncoder; import java.util.Enumeration; import java.util.HashMap; -import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.Executor; import java.util.concurrent.Executors; +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -49,16 +51,14 @@ * Servlet for rendering Gadgets, typically in an IFRAME. */ public class GadgetRenderingServlet extends HttpServlet { - private final GadgetServer gadgetServer; - private final String jsServicePath; + private GadgetServer gadgetServer; + private String jsServicePath; + private GadgetFeatureRegistry registry; private static final String USERPREF_PARAM_PREFIX = "up_"; private static final String LIBS_PARAM_NAME = "libs"; private static final String JS_FILE_SUFFIX = ".js"; public static final String DEFAULT_JS_SERVICE_PATH = "js/"; - static { - GadgetFeatureRegistry.register("analytics", null, AnalyticsFeature.class); - } /** * Creates a [EMAIL PROTECTED] GadgetRenderingServlet} with default executor, @@ -71,6 +71,30 @@ new BasicRemoteContentFetcher(1024 * 1024)); } + @Override + @SuppressWarnings("unchecked") + public void init(ServletConfig config) { + ServletContext context = config.getServletContext(); + String coreFeatures = context.getInitParameter("core-js-features"); + String otherFeatures = context.getInitParameter("other-js-features"); + String jsPath = context.getInitParameter("js-service-path"); + if (jsPath == null) { + jsPath = DEFAULT_JS_SERVICE_PATH; + } + jsServicePath = jsPath; + try { + registry = new GadgetFeatureRegistry(coreFeatures); + gadgetServer.setGadgetFeatureRegistry(registry); + if (otherFeatures != null) { + JsFeatureLoader jsLoader = new JsFeatureLoader(); + jsLoader.loadFeatures(otherFeatures, registry); + } + } catch (GadgetException e) { + e.printStackTrace(); + System.exit(1); + } + } + /** * A la carte rendering server creation. * @param executor @@ -86,8 +110,6 @@ gadgetServer.setMessageBundleCache(mbCache); gadgetServer.setSpecCache(specCache); gadgetServer.setContentFetcher(fetcher); - // TODO: make injectable - jsServicePath = DEFAULT_JS_SERVICE_PATH; } @Override @@ -125,12 +147,11 @@ gadget = gadgetServer.processGadget(gadgetId, getPrefsFromRequest(req), context.getLocale(), - GadgetServer.RenderingContext.GADGET); + RenderingContext.GADGET); + outputGadget(gadget, resp); } catch (GadgetServer.GadgetProcessException e) { outputErrors(e, resp); } - - outputGadget(gadget, resp); } private void outputGadget(Gadget gadget, HttpServletResponse resp) @@ -162,20 +183,25 @@ "body{margin: 0px;padding: 0px;background-color:white;}" + "</style>"); markup.append("</head><body>"); + StringBuilder externJs = new StringBuilder(); + StringBuilder inlineJs = new StringBuilder(); + String externFmt = "<script src=\"%s\"></script>\n"; for (JsLibrary library : gadget.getJsLibraries()) { - markup.append(library.toString()); + if (library.getType() == JsLibrary.Type.URL) { + externJs.append(String.format(externFmt, library.getContent())); + } else { + inlineJs.append(library.getContent()).append("\n"); + } } - JSONObject json = new JSONObject(); - try { - json.put("proxyUrl", "http://www.gmodules.com/ig/proxy?url=%url%"); - json.put("jsonProxyUrl", "/gadgets/proxy?url=%url%&output=js"); - } catch (JSONException e) { - // This shouldn't ever happen. + if (inlineJs.length() > 0) { + markup.append("<script><!--\n").append(inlineJs) + .append("\n-->\n</script>"); + } + if (externJs.length() > 0) { + markup.append(externJs); } - markup.append("<script>gadgets.IO.init(" +json.toString()+ ");</script>"); markup.append(gadget.getContentData()); - // TODO: use renamespaced API - + markup.append("<script>gadgets.util.runOnLoadHandlers();</script>"); markup.append("</body></html>"); resp.getOutputStream().print(markup.toString()); @@ -188,12 +214,8 @@ // TODO: userprefs on the fragment rather than query string String prefsQuery = getPrefsQueryString(gadget.getUserPrefValues()); String libsQuery = null; - try { - libsQuery = getLibsQueryString(gadget.getJsLibraries()); - } catch (GadgetException e) { - resp.sendError(HttpServletResponse.SC_BAD_REQUEST, e.getMessage()); - return; - } + + libsQuery = getLibsQueryString(gadget.getRequires().keySet()); URI redirURI = gadget.getContentHref(); try { @@ -228,11 +250,12 @@ resp.getOutputStream().print(markup.toString()); } + @SuppressWarnings("unchecked") private UserPrefs getPrefsFromRequest(HttpServletRequest req) { Map<String, String> prefs = new HashMap<String, String>(); - Enumeration paramNames = req.getParameterNames(); + Enumeration<String> paramNames = req.getParameterNames(); while (paramNames.hasMoreElements()) { - String paramName = (String)paramNames.nextElement(); + String paramName = paramNames.nextElement(); if (paramName.startsWith(USERPREF_PARAM_PREFIX)) { String prefName = paramName.substring(USERPREF_PARAM_PREFIX.length()); prefs.put(prefName, req.getParameter(paramName)); @@ -241,55 +264,43 @@ return new UserPrefs(prefs); } - private String getPrefsQueryString(Map<String, String> prefVals) { - StringBuilder builder = new StringBuilder(); - for (Map.Entry<String, String> prefEntry : prefVals.entrySet()) { - builder.append("&"); + private String getPrefsQueryString(UserPrefs prefVals) { + StringBuilder buf = new StringBuilder(); + for (Map.Entry<String, String> prefEntry : prefVals.getPrefs().entrySet()) { + buf.append("&"); try { - builder.append(USERPREF_PARAM_PREFIX + - URLEncoder.encode(prefEntry.getKey(), "UTF8") + - "=" + - URLEncoder.encode(prefEntry.getValue(), "UTF8")); + buf.append(USERPREF_PARAM_PREFIX) + .append(URLEncoder.encode(prefEntry.getKey(), "UTF8")) + .append("=") + .append(URLEncoder.encode(prefEntry.getValue(), "UTF8")); } catch (UnsupportedEncodingException e) { // If UTF8 is somehow not supported, we may as well bail. // Not a whole lot we can do without such support. throw new RuntimeException("Unexpected error: UTF8 not supported."); } } - return builder.toString(); + return buf.toString(); } - private String getLibsQueryString(List<JsLibrary> jsLibs) - throws GadgetException { - StringBuilder libBuilder = new StringBuilder(); - libBuilder.append("&").append(LIBS_PARAM_NAME).append("="); - libBuilder.append(jsServicePath); - StringBuilder errBuilder = new StringBuilder(); - int numErrs = 0; - for (int i = 0; i < jsLibs.size(); ++i) { - if (i > 0) { - // Builds a consolidated lib spec, collapsing several features into - // a single <script src="libspec"/> tag load for type=URL gadgets - libBuilder.append(JsLibrary.ALIAS_SEPARATOR); - } - JsLibrary jsLib = jsLibs.get(i); - String alias = jsLib.getAlias(); - if (alias == null) { - numErrs++; - errBuilder.append(" ").append(jsLib.getFeature()); + private String getLibsQueryString(Set<String> features) { + StringBuilder buf = new StringBuilder(); + buf.append("&").append(LIBS_PARAM_NAME).append("="); + buf.append(jsServicePath); + if (features.size() == 0) { + buf.append("core"); + } else { + boolean first = false; + for (String feature : features) { + if (first) { + first = false; + } else { + buf.append(":"); + } + buf.append(feature); } } - libBuilder.append(JS_FILE_SUFFIX); - - if (numErrs > 0) { - throw new GadgetException( - GadgetException.Code.UNSUPPORTED_FEATURE, - String.format("The following feature%s not supported " + - "for type=url gadgets:%s", - numErrs == 1 ? " is" : "s are", - errBuilder.toString())); - } + buf.append(JS_FILE_SUFFIX); - return libBuilder.toString(); + return buf.toString(); } }
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=610196&r1=610195&r2=610196&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 Tue Jan 8 14:15:54 2008 @@ -13,10 +13,21 @@ */ package org.apache.shindig.gadgets.http; +import org.apache.shindig.gadgets.GadgetException; +import org.apache.shindig.gadgets.GadgetFeatureFactory; +import org.apache.shindig.gadgets.GadgetFeatureRegistry; +import org.apache.shindig.gadgets.JsFeatureLoader; import org.apache.shindig.gadgets.JsLibrary; +import org.apache.shindig.gadgets.JsLibraryFeatureFactory; +import org.apache.shindig.gadgets.RenderingContext; import java.io.IOException; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; +import javax.servlet.ServletConfig; +import javax.servlet.ServletContext; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -26,11 +37,31 @@ * Used by type=URL gadgets in loading JavaScript resources. */ public class JsServlet extends HttpServlet { + private GadgetFeatureRegistry registry; + + @Override + public void init(ServletConfig config) { + ServletContext context = config.getServletContext(); + String coreFeatures = context.getInitParameter("core-js-features"); + String otherFeatures = context.getInitParameter("other-js-features"); + String jsPath = context.getInitParameter("js-service-path"); + try { + registry = new GadgetFeatureRegistry(coreFeatures); + if (otherFeatures != null) { + JsFeatureLoader jsLoader = new JsFeatureLoader(); + jsLoader.loadFeatures(otherFeatures, registry); + } + } catch (GadgetException e) { + e.printStackTrace(); + throw new RuntimeException(e); + } + } + @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { // Use the last component as filename; prefix is ignored - String path = req.getServletPath(); + String path = req.getPathTranslated(); String[] pathComponents = path.split("/"); String resourceName = pathComponents[pathComponents.length-1]; if (resourceName.endsWith(".js")) { @@ -38,24 +69,59 @@ resourceName = resourceName.substring( 0, resourceName.length() - ".js".length()); } - - String containerParam = req.getParameter("c"); - boolean isContainer = - (containerParam != null && containerParam.equals("1")); - String jsData = null; - if (isContainer) { - jsData = JsLibrary.getContainerJs(resourceName); + + Set<String> needed = new HashSet<String>(); + if (resourceName.contains(":")) { + needed.addAll(Arrays.asList(resourceName.split(":"))); } else { - jsData = JsLibrary.getGadgetJs(resourceName); + needed.add(resourceName); } - - if (jsData == null) { + + Set<GadgetFeatureRegistry.Entry> found + = new HashSet<GadgetFeatureRegistry.Entry>(); + Set<String> missing = new HashSet<String>(); + + if (registry.getIncludedFeatures(needed, found, missing)) { + String containerParam = req.getParameter("c"); + RenderingContext context; + context = containerParam != null && containerParam.equals("1") ? + RenderingContext.CONTAINER : + RenderingContext.GADGET; + + StringBuilder jsData = new StringBuilder(); + + Set<GadgetFeatureRegistry.Entry> done + = new HashSet<GadgetFeatureRegistry.Entry>(); + do { + for (GadgetFeatureRegistry.Entry entry : found) { + if (!done.contains(entry) && + done.containsAll(entry.getDependencies())) { + GadgetFeatureFactory feature = entry.getFeature(); + if (feature instanceof JsLibraryFeatureFactory) { + JsLibraryFeatureFactory jsLib = (JsLibraryFeatureFactory)feature; + for (JsLibrary lib : jsLib.getLibraries(context)) { + // TODO: type url js files fail here. + // TODO: resolve dependencies correctly. + if (lib.getType() != JsLibrary.Type.URL) { + jsData.append(lib.getContent()); + } + } + } + done.add(entry); + } + } + } while (done.size() != found.size()); + + if (jsData.length() == 0) { + resp.setStatus(HttpServletResponse.SC_NOT_FOUND); + return; + } + + resp.setContentType("text/javascript"); + resp.setContentLength(jsData.length()); + resp.getOutputStream().write(jsData.toString().getBytes()); + } else { resp.setStatus(HttpServletResponse.SC_NOT_FOUND); - return; } - - resp.setContentType("text/javascript"); - resp.setContentLength(jsData.length()); - resp.getOutputStream().write(jsData.getBytes()); } } Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyHandler.java URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyHandler.java?rev=610196&r1=610195&r2=610196&view=diff ============================================================================== --- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyHandler.java (original) +++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyHandler.java Tue Jan 8 14:15:54 2008 @@ -64,7 +64,7 @@ } catch (JSONException e) { output = ""; } - + response.setStatus(HttpServletResponse.SC_OK); setCachingHeaders(response); response.setContentType("application/json; charset=utf-8"); response.setHeader("Content-Disposition", "attachment;filename=p.txt"); @@ -81,7 +81,7 @@ RemoteContent results = fetcher.fetch(origin); int status = results.getHttpStatusCode(); response.setStatus(status); - if (status == 200) { + if (status == HttpServletResponse.SC_OK) { // Fill out the response. setCachingHeaders(response); Map<String, List<String>> headers = results.getAllHeaders(); Modified: incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyServlet.java URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyServlet.java?rev=610196&r1=610195&r2=610196&view=diff ============================================================================== --- incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyServlet.java (original) +++ incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/http/ProxyServlet.java Tue Jan 8 14:15:54 2008 @@ -26,6 +26,7 @@ public class ProxyServlet extends HttpServlet { private final static ProxyHandler handler = new ProxyHandler(); + @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String output = request.getParameter("output"); Modified: incubator/shindig/trunk/java/gadgets/src/main/webapp/WEB-INF/web.xml URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/webapp/WEB-INF/web.xml?rev=610196&r1=610195&r2=610196&view=diff ============================================================================== --- incubator/shindig/trunk/java/gadgets/src/main/webapp/WEB-INF/web.xml (original) +++ incubator/shindig/trunk/java/gadgets/src/main/webapp/WEB-INF/web.xml Tue Jan 8 14:15:54 2008 @@ -19,7 +19,15 @@ "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> - + <!-- configuration --> + <context-param> + <param-name>core-js-features</param-name> + <param-value>res://core-features/</param-value> + </context-param> + <context-param> + <param-name>other-js-features</param-name> + <param-value>res://features/</param-value> + </context-param> <!-- Render a Gadget --> <servlet> @@ -48,4 +56,14 @@ <url-pattern>/proxy</url-pattern> </servlet-mapping> + <!-- javascript serving --> + <servlet> + <servlet-name>js</servlet-name> + <servlet-class>org.apache.shindig.gadgets.http.JsServlet</servlet-class> + </servlet> + + <servlet-mapping> + <servlet-name>js</servlet-name> + <url-pattern>/js/*</url-pattern> + </servlet-mapping> </web-app> Added: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/BasicGadgetBlacklistTest.java URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/BasicGadgetBlacklistTest.java?rev=610196&view=auto ============================================================================== --- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/BasicGadgetBlacklistTest.java (added) +++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/BasicGadgetBlacklistTest.java Tue Jan 8 14:15:54 2008 @@ -0,0 +1,82 @@ +/* + * Licensed 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.gadgets; + +import junit.framework.TestCase; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.net.URI; +import java.util.regex.PatternSyntaxException; + +public class BasicGadgetBlacklistTest extends TestCase { + + private URI someUri; + + @Override + protected void setUp() throws Exception { + someUri = new URI("http://bla.com/foo.xml"); + } + + private GadgetBlacklist createBlacklist(String contents) throws IOException { + File temp = File.createTempFile("blacklist_test", ".txt"); + BufferedWriter out = new BufferedWriter(new FileWriter(temp)); + out.write(contents); + out.close(); + return new BasicGadgetBlacklist(temp); + } + + public void testEmptyBlacklist() throws Exception { + GadgetBlacklist bl = createBlacklist(""); + assertFalse(bl.isBlacklisted(someUri)); + } + + public void testExactMatches() throws Exception { + GadgetBlacklist bl = createBlacklist(someUri + "\nhttp://baz.com/foo.xml"); + assertFalse(bl.isBlacklisted(new URI("http://random.com/uri.xml"))); + assertTrue(bl.isBlacklisted(someUri)); + } + + public void testExactMatchesWithCaseMixture() throws Exception { + GadgetBlacklist bl = createBlacklist(someUri + "\nhttp://BAZ.com/foo.xml"); + assertTrue(bl.isBlacklisted(someUri)); + assertTrue(bl.isBlacklisted(new URI("http://BLA.com/foo.xml"))); + assertTrue(bl.isBlacklisted(new URI("http://baz.com/foo.xml"))); + } + + public void testIgnoredCommentsAndWhitespace() throws Exception { + GadgetBlacklist bl = createBlacklist( + "# comment\n \t" + someUri + " \n # comment\n\n"); + assertTrue(bl.isBlacklisted(someUri)); + } + + public void testRegexpMatches() throws Exception { + GadgetBlacklist bl = createBlacklist("REGEXP http://bla.com/.*"); + assertTrue(bl.isBlacklisted(someUri)); + assertTrue(bl.isBlacklisted(new URI("http://bla.com/bar.xml"))); + assertFalse(bl.isBlacklisted(new URI("http://blo.com/bar.xml"))); + } + + public void testInvalidRegularExpression() throws Exception { + try { + GadgetBlacklist bl = createBlacklist("REGEXP +http://bla.com/.*"); + fail(); + } catch (PatternSyntaxException ex) { + // success + } + } + +} Modified: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetServerTest.java URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetServerTest.java?rev=610196&r1=610195&r2=610196&view=diff ============================================================================== --- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetServerTest.java (original) +++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetServerTest.java Tue Jan 8 14:15:54 2008 @@ -27,8 +27,6 @@ import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.isA; -import org.apache.shindig.gadgets.EasyMockTestCase; - import java.util.concurrent.Executor; import java.util.concurrent.Executors; @@ -41,7 +39,9 @@ @SuppressWarnings(value="unchecked") final GadgetDataCache<MessageBundle> bundleCache = mock(GadgetDataCache.class); - public GadgetServerTest() { + public GadgetServerTest() throws GadgetException { + GadgetFeatureRegistry registry = new GadgetFeatureRegistry(null); + gadgetServer.setGadgetFeatureRegistry(registry); gadgetServer.setContentFetcher(fetcher); gadgetServer.setSpecCache(specCache); gadgetServer.setMessageBundleCache(bundleCache); @@ -56,7 +56,7 @@ replay(); Gadget gadget = gadgetServer.processGadget(DATETIME_ID, UserPrefs.EMPTY, EN_US_LOCALE, - GadgetServer.RenderingContext.GADGET); + RenderingContext.GADGET); verify(); } @@ -65,7 +65,7 @@ replay(); Gadget gadget = gadgetServer.processGadget(DATETIME_ID, UserPrefs.EMPTY, EN_US_LOCALE, - GadgetServer.RenderingContext.GADGET); + RenderingContext.GADGET); assertSame(DATETIME_SPEC, gadget.getBaseSpec()); verify(); } @@ -79,7 +79,7 @@ replay(); Gadget gadget = gadgetServer.processGadget(DATETIME_ID, UserPrefs.EMPTY, EN_US_LOCALE, - GadgetServer.RenderingContext.GADGET); + RenderingContext.GADGET); assertEquals("Hello, World!", gadget.getTitle()); assertEquals("Goodbye, World!", gadget.getContentData()); verify(); Added: incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetSpecParserTest.java URL: http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetSpecParserTest.java?rev=610196&view=auto ============================================================================== --- incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetSpecParserTest.java (added) +++ incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/GadgetSpecParserTest.java Tue Jan 8 14:15:54 2008 @@ -0,0 +1,52 @@ +/* + * Licensed 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.gadgets; + +import junit.framework.TestCase; + +import java.net.URI; + +public class GadgetSpecParserTest extends TestCase { + + private static final GadgetSpecParser parser = new GadgetSpecParser(); + + private static class BasicGadgetId implements GadgetView.ID { + URI uri; + public URI getURI() { + return uri; + } + int moduleId; + public int getModuleId() { + return moduleId; + } + public String getKey() { + return uri.toString(); + } + } + + public void testBasicGadget() throws Exception { + BasicGadgetId id = new BasicGadgetId(); + id.uri = new URI("http://example.org/text.xml"); + id.moduleId = 1; + byte[] xml = ("<?xml version=\"1.0\"?>" + + "<Module>" + + "<ModulePrefs title=\"Hello, world!\"/>" + + "<Content type=\"html\">Hello!</Content>" + + "</Module>").getBytes(); + GadgetSpec spec = parser.parse(id, xml); + + assertEquals("Hello!", spec.getContentData()); + assertEquals("Hello, world!", spec.getTitle()); + } +}

