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());
+  }
+}


Reply via email to