Author: etnu
Date: Sun May 25 00:43:42 2008
New Revision: 659934

URL: http://svn.apache.org/viewvc?rev=659934&view=rev
Log:
Added support for multiple container config paths at startup to make extension 
easier in the same manner as for features, and provided a facility to use more 
complex inheritance models for container configuration. This allows you to 
support situations such as a development environment that inherits from the 
production environment which in turn inherits from the default configuration.


Modified:
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/ContainerConfig.java
    
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/HashLockedDomainService.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/ContainerConfigTest.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/HashLockedDomainServiceTest.java
    
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetRenderingTaskTest.java

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/ContainerConfig.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/ContainerConfig.java?rev=659934&r1=659933&r2=659934&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/ContainerConfig.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/ContainerConfig.java
 Sun May 25 00:43:42 2008
@@ -24,19 +24,17 @@
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
 
+import org.apache.commons.lang.StringUtils;
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
-import java.util.Set;
-import java.util.logging.Level;
 import java.util.logging.Logger;
 
 /**
@@ -49,7 +47,11 @@
  */
 public class ContainerConfig {
   private final Map<String, JSONObject> config;
+  public static final char FILE_SEPARATOR = ',';
   public static final String DEFAULT_CONTAINER = "default";
+  public static final String PARENT_KEY = "parent";
+  public static final String FINAL_KEY = "final";
+  // TODO: Rename this to simply "container", gadgets.container is unnecessary.
   public static final String CONTAINER_KEY = "gadgets.container";
   private static final Logger logger
       = Logger.getLogger("org.apache.shindig.gadgets");
@@ -57,7 +59,7 @@
   /**
    * @return The set of all containers that are currently registered.
    */
-  public Set<String> getContainers() {
+  public Collection<String> getContainers() {
     return Collections.unmodifiableSet(config.keySet());
   }
 
@@ -92,7 +94,6 @@
       }
       return data;
     } catch (JSONException e) {
-      logger.log(Level.WARNING, "Failed to get JSON config for " + parameter, 
e);
       return null;
     }
   }
@@ -161,7 +162,7 @@
       throw new GadgetException(GadgetException.Code.INVALID_PATH, e);
     }
   }
- 
+
   /**
    * Loads resources recursively.
    * @param files The base paths to look for container.xml
@@ -180,39 +181,21 @@
   }
 
   /**
-   * Returns names on the json object. Used instead of JSONObject.getNames to
-   * provide backwards compatibility with older JSON releases.
-   *
-   * @param obj
-   * @return An array of all keys in the object.
-   * @throws org.json.JSONException
-   */
-  private static String[] getNames(JSONObject obj) throws JSONException {
-    JSONArray arr = obj.names();
-    List<String> items = new ArrayList<String>(arr.length());
-    for (int i = 0, j = arr.length(); i < j; ++i) {
-      items.add(i, arr.getString(i));
-    }
-
-    return items.toArray(new String[items.size()]);
-  }
-
-  /**
    * Merges two JSON objects together (recursively), with values from "merge"
-   * replacing values from "base".
+   * replacing values in "base" to produce a new object.
+   *
+   * @param base The base object that values will be replaced into.
+   * @param merge The object to merge values from.
    *
-   * @param base
-   * @param merge
-   * @return The merged object.
    * @throws JSONException if the two objects can't be merged for some reason.
    */
   private JSONObject mergeObjects(JSONObject base, JSONObject merge)
       throws JSONException {
     // Clone the initial object (JSONObject doesn't support "clone").
 
-    JSONObject clone = new JSONObject(base, getNames(base));
+    JSONObject clone = new JSONObject(base, JSONObject.getNames(base));
     // Walk parameter list for the merged object and merge recursively.
-    String[] fields = getNames(merge);
+    String[] fields = JSONObject.getNames(merge);
     for (String field : fields) {
       Object existing = clone.opt(field);
       Object update = merge.get(field);
@@ -236,30 +219,59 @@
   }
 
   /**
+   * Recursively merge values from parent objects in the prototype chain.
+   * This will modify the value currently stored for the specified container.
+   *
+   * @param base The base configuration of the container being merged into.
+   *
+   * @throws GadgetException If there is an invalid parent parameter
+   *    in the prototype chain.
+   */
+  private void mergeParents(String container, JSONObject base)
+      throws GadgetException, JSONException {
+    //String container = base.getString(CONTAINER_KEY);
+    if (base.optBoolean(FINAL_KEY) || DEFAULT_CONTAINER.equals(container)) {
+      // No inheritance (or already done).
+      return;
+    }
+
+    String parent = base.optString(PARENT_KEY);
+    if (parent == null) {
+      parent = DEFAULT_CONTAINER;
+    }
+
+    JSONObject parentData = config.get(parent);
+    if (parentData == null) {
+      throw new GadgetException(GadgetException.Code.INVALID_CONFIG,
+          "Unable to locate parent " + parent + " required by "
+          + base.getString(CONTAINER_KEY));
+    }
+    mergeParents(parent, parentData);
+    JSONObject newBase = mergeObjects(parentData, base);
+    config.put(container, newBase);
+    // Copy values back to base.
+    //for (String key : JSONObject.getNames(newBase)) {
+    //  base.put(key, newBase.get(key));
+    //}
+
+    base.put(FINAL_KEY, true);
+  }
+
+  /**
    * Processes a container file.
+   *
    * @param json
    * @throws GadgetException
    */
-  public void loadFromString(String json) throws GadgetException {
+  private void loadFromString(String json) throws GadgetException {
     try {
       JSONObject contents = new JSONObject(json);
       JSONArray containers = contents.getJSONArray(CONTAINER_KEY);
-      JSONObject defaultContainer = config.get(DEFAULT_CONTAINER);
-      if (defaultContainer == null) {
-        if (DEFAULT_CONTAINER.equals(containers.get(0))) {
-          defaultContainer = contents;
-          config.put(DEFAULT_CONTAINER, contents);
-        } else {
-          throw new GadgetException(GadgetException.Code.INVALID_CONFIG,
-                                    "No default config registered");
-        }
-      }
+
       for (int i = 0, j = containers.length(); i < j; ++i) {
         // Copy the default object and produce a new one.
         String container = containers.getString(i);
-        if (!DEFAULT_CONTAINER.equals(container)) {
-          config.put(container, mergeObjects(defaultContainer, contents));
-        }
+        config.put(container, contents);
       }
     } catch (JSONException e) {
       throw new GadgetException(GadgetException.Code.INVALID_CONFIG, e);
@@ -269,29 +281,37 @@
   /**
    * Loads containers from the specified resource. Follows the same rules
    * as [EMAIL PROTECTED] JsFeatureLoader.loadFeatures} for locating resources.
-   * This call is not thread safe, so you should only call loadContainers()
-   * from within the GadgetServerConfig.
    *
    * @param path
    * @throws GadgetException
    */
-  public void loadContainers(String path) throws GadgetException {
+  private void loadContainers(String path) throws GadgetException {
     try {
-      if (path.startsWith("res://")) {
-        path = path.substring(6);
-        logger.info("Loading resources from: " + path);
-        if (path.endsWith(".txt")) {
-          loadResources(ResourceLoader.getContent(path).split("[\r\n]+"));
+      for (String location : StringUtils.split(path, FILE_SEPARATOR)) {
+        if (location.startsWith("res://")) {
+          location = location.substring(6);
+          logger.info("Loading resources from: " + location);
+          if (path.endsWith(".txt")) {
+            
loadResources(ResourceLoader.getContent(location).split("[\r\n]+"));
+          } else {
+            loadResources(new String[]{location});
+          }
         } else {
-          loadResources(new String[]{path});
+          logger.info("Loading files from: " + location);
+          File file = new File(location);
+          loadFiles(new File[]{file});
         }
-      } else {
-        logger.info("Loading files from: " + path);
-        File file = new File(path);
-        loadFiles(new File[]{file});
+      }
+
+      // Now that all containers are loaded, we go back through them and merge
+      // recursively. This is done at startup to simplify lookups.
+      for (Map.Entry<String,JSONObject> container : config.entrySet()) {
+        mergeParents(container.getKey(), container.getValue());
       }
     } catch (IOException e) {
       throw new GadgetException(GadgetException.Code.INVALID_PATH, e);
+    } catch (JSONException e) {
+      throw new GadgetException(GadgetException.Code.INVALID_CONFIG, e);
     }
   }
 
@@ -308,4 +328,4 @@
       loadContainers(containers);
     }
   }
-}
+}
\ No newline at end of file

Modified: 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/HashLockedDomainService.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/HashLockedDomainService.java?rev=659934&r1=659933&r2=659934&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/HashLockedDomainService.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/main/java/org/apache/shindig/gadgets/HashLockedDomainService.java
 Sun May 25 00:43:42 2008
@@ -17,45 +17,46 @@
  */
 package org.apache.shindig.gadgets;
 
-import org.apache.commons.codec.digest.DigestUtils;
-
 import org.apache.shindig.common.util.Base32;
 import org.apache.shindig.gadgets.spec.Feature;
 
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
 
+import org.apache.commons.codec.digest.DigestUtils;
+
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
 /**
  * Locked domain implementation based on sha1.
- * 
+ *
  * The generated domain takes the form:
  *
  * base32(sha1(gadget url)).
- * 
+ *
  * Other domain locking schemes are possible as well.
  */
 public class HashLockedDomainService implements LockedDomainService {
-  
+
   private final ContainerConfig config;
 
   private final String embedHost;
 
   private final boolean enabled;
-  
+
   private final Set<String> suffixes;
-  
+
   private GadgetReader gadgetReader = new GadgetReader();
-  
+
   public static final String LOCKED_DOMAIN_REQUIRED_KEY =
       "gadgets.lockedDomainRequired";
 
   public static final String LOCKED_DOMAIN_SUFFIX_KEY =
       "gadgets.lockedDomainSuffix";
-  
+
   /**
    * Create a LockedDomainService
    * @param config per-container configuration
@@ -71,7 +72,7 @@
     this.embedHost = embedHost;
     this.enabled = enabled;
     suffixes = new HashSet<String>();
-    Set<String> containers = config.getContainers();
+    Collection<String> containers = config.getContainers();
     if (enabled) {
       for (String container : containers) {
         String suffix = config.get(container, LOCKED_DOMAIN_SUFFIX_KEY);
@@ -102,38 +103,38 @@
         containerWantsLockedDomain(container)) {
       String neededHost = getLockedDomainForGadget(
           gadgetReader.getGadgetUrl(gadget), container);
-      return (neededHost.equals(host));    
+      return (neededHost.equals(host));
     }
     // Make sure gadgets that don't ask for locked domain aren't allowed
     // to render on one.
     return !gadgetUsingLockedDomain(host, gadget);
   }
-  
+
   // Simple class for dependency injection, so we don't need a full-fledged
   // Gadget mock for these test cases
   static class GadgetReader {
     protected boolean gadgetWantsLockedDomain(Gadget gadget) {
       Map<String, Feature> prefs =
         gadget.getSpec().getModulePrefs().getFeatures();
-      return prefs.containsKey("locked-domain");      
+      return prefs.containsKey("locked-domain");
     }
-    
+
     protected String getGadgetUrl(Gadget gadget) {
       return gadget.getContext().getUrl().toString();
     }
   }
-  
+
   // For testing only
   void setSpecReader(GadgetReader gadgetReader) {
     this.gadgetReader = gadgetReader;
   }
-  
+
   private boolean containerWantsLockedDomain(String container) {
     String required = config.get(
         container, LOCKED_DOMAIN_REQUIRED_KEY);
     return ("true".equals(required));
   }
-  
+
   private boolean gadgetUsingLockedDomain(String host, Gadget gadget) {
     for (String suffix : suffixes) {
       if (host.endsWith(suffix)) {
@@ -142,7 +143,7 @@
     }
     return false;
   }
-  
+
   public String getLockedDomainForGadget(String gadget, String container) {
     String suffix = config.get(container, LOCKED_DOMAIN_SUFFIX_KEY);
     if (suffix == null) {

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/ContainerConfigTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/ContainerConfigTest.java?rev=659934&r1=659933&r2=659934&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/ContainerConfigTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/ContainerConfigTest.java
 Sun May 25 00:43:42 2008
@@ -19,19 +19,20 @@
 
 package org.apache.shindig.gadgets;
 
-import static org.apache.shindig.gadgets.ContainerConfig.DEFAULT_CONTAINER;
 import static org.apache.shindig.gadgets.ContainerConfig.CONTAINER_KEY;
+import static org.apache.shindig.gadgets.ContainerConfig.DEFAULT_CONTAINER;
+import static org.apache.shindig.gadgets.ContainerConfig.PARENT_KEY;
+import static org.junit.Assert.assertEquals;
 
 import org.json.JSONArray;
 import org.json.JSONObject;
+import org.junit.Test;
 
-import junit.framework.TestCase;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileWriter;
 
-/**
- *
- */
-public class ContainerConfigTest extends TestCase {
-  private ContainerConfig config;
+public class ContainerConfigTest {
 
   private static final String TOP_LEVEL_NAME = "Top level name";
   private static final String TOP_LEVEL_VALUE = "Top level value";
@@ -47,10 +48,17 @@
   private static final String[] ARRAY_VALUE = new String[]{"Hello", "World"};
   private static final String ARRAY_ALT_VALUE = "Not an array";
 
-  @Override
-  public void setUp() throws Exception {
-    super.setUp();
-    config = new ContainerConfig(null);
+  private File createContainer(JSONObject json) throws Exception {
+    File file = File.createTempFile(getClass().getName(), ".json");
+    file.deleteOnExit();
+    BufferedWriter out = new BufferedWriter(new FileWriter(file));
+    out.write(json.toString());
+    out.close();
+    return file;
+  }
+
+  private File createDefaultContainer() throws Exception {
+
     // We use a JSON Object here to guarantee that we're well formed up front.
     JSONObject json = new JSONObject();
     json.put(CONTAINER_KEY, new String[]{DEFAULT_CONTAINER});
@@ -62,12 +70,14 @@
     nested.put(NESTED_NAME, NESTED_VALUE);
 
     json.put(NESTED_KEY, nested);
-
-    config.loadFromString(json.toString());
+    return createContainer(json);
   }
 
-  public void testBasic() throws Exception {
-    // check to make sure that the default config was processed correctly.
+  @Test
+  public void parseBasicConfig() throws Exception {
+    ContainerConfig config
+        = new ContainerConfig(createDefaultContainer().getAbsolutePath());
+
     assertEquals(1, config.getContainers().size());
     for (String container : config.getContainers()) {
       assertEquals(DEFAULT_CONTAINER, container);
@@ -83,9 +93,11 @@
     assertEquals(NESTED_VALUE, nestedValue);
   }
 
-  public void testCascade() throws Exception {
+  @Test
+  public void parseWithDefaultInheritance() throws Exception {
     JSONObject json = new JSONObject();
     json.put(CONTAINER_KEY, new String[]{CHILD_CONTAINER});
+    json.put(PARENT_KEY, DEFAULT_CONTAINER);
     json.put(ARRAY_NAME, ARRAY_ALT_VALUE);
 
     // small nested data.
@@ -94,7 +106,10 @@
 
     json.put(NESTED_KEY, nested);
 
-    config.loadFromString(json.toString());
+    File childFile = createContainer(json);
+    File parentFile = createDefaultContainer();
+    ContainerConfig config = new ContainerConfig(childFile.getAbsolutePath() +
+        ContainerConfig.FILE_SEPARATOR + parentFile.getAbsolutePath());
 
     String value = config.get(CHILD_CONTAINER, TOP_LEVEL_NAME);
     assertEquals(TOP_LEVEL_VALUE, value);
@@ -109,12 +124,25 @@
     // Verify that the parent value wasn't overwritten as well.
 
     JSONArray defaultArrayTest = config.getJsonArray(DEFAULT_CONTAINER,
-                                                      ARRAY_NAME);
+                                                     ARRAY_NAME);
     JSONArray defaultArray = new JSONArray(ARRAY_VALUE);
     assertEquals(defaultArrayTest.toString(), defaultArray.toString());
   }
 
+  @Test(expected = GadgetException.class)
+  public void badConfigThrows() throws Exception {
+    JSONObject json = new JSONObject();
+    json.put(CONTAINER_KEY, new String[]{CHILD_CONTAINER});
+    json.put(PARENT_KEY, "bad bad bad parent!");
+    json.put(ARRAY_NAME, ARRAY_ALT_VALUE);
+
+    ContainerConfig config
+        = new ContainerConfig(createContainer(json).getAbsolutePath());
+  }
+
   public void testPathQuery() throws Exception {
+    ContainerConfig config
+        = new ContainerConfig(createDefaultContainer().getAbsolutePath());
     String path = NESTED_KEY + '/' + NESTED_NAME;
     String data = config.get(DEFAULT_CONTAINER, path);
     assertEquals(NESTED_VALUE, data);

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=659934&r1=659933&r2=659934&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
 Sun May 25 00:43:42 2008
@@ -44,7 +44,7 @@
   public final MessageBundleFactory bundleFactory =
       new BasicMessageBundleFactory(fetcher, 0, 0L);
   public GadgetFeatureRegistry registry;
-  public ContainerConfig containerConfig;
+  public ContainerConfig containerConfig = mock(ContainerConfig.class);
   public final Executor executor = new Executor() {
     public void execute(Runnable r) {
       r.run();
@@ -60,13 +60,6 @@
       fail("Failed to create feature registry");
     }
 
-    try {
-      containerConfig = new ContainerConfig(null);
-    } catch (Exception e) {
-      e.printStackTrace();
-      fail("Failed to create container config");
-    }
-
     gadgetServer = new GadgetServer(executor, registry, blacklist,
         fetcherFactory, specFactory, bundleFactory);
   }

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/HashLockedDomainServiceTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/HashLockedDomainServiceTest.java?rev=659934&r1=659933&r2=659934&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/HashLockedDomainServiceTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/HashLockedDomainServiceTest.java
 Sun May 25 00:43:42 2008
@@ -18,10 +18,16 @@
  */
 package org.apache.shindig.gadgets;
 
-import org.json.JSONArray;
-import org.json.JSONObject;
+import static 
org.apache.shindig.gadgets.HashLockedDomainService.LOCKED_DOMAIN_REQUIRED_KEY;
+import static 
org.apache.shindig.gadgets.HashLockedDomainService.LOCKED_DOMAIN_SUFFIX_KEY;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.isA;
+
 import org.apache.shindig.gadgets.HashLockedDomainService.GadgetReader;
 
+import java.util.Arrays;
+
 public class HashLockedDomainServiceTest extends EasyMockTestCase {
 
   HashLockedDomainService domainLocker;
@@ -32,7 +38,7 @@
       false, "http://somehost.com/somegadget.xml";);
   ContainerConfig containerEnabledConfig;
   ContainerConfig containerRequiredConfig;
-  
+
   /**
    * Mocked out spec reader, rather than mocking the whole
    * Gadget object.
@@ -40,55 +46,63 @@
   public static class FakeSpecReader extends GadgetReader {
     private boolean wantsLockedDomain;
     private String gadgetUrl;
-    
+
     public FakeSpecReader(boolean wantsLockedDomain, String gadgetUrl) {
       this.wantsLockedDomain = wantsLockedDomain;
       this.gadgetUrl = gadgetUrl;
     }
-    
+
     @Override
     protected boolean gadgetWantsLockedDomain(Gadget gadget) {
       return wantsLockedDomain;
     }
-    
+
     @Override
     protected String getGadgetUrl(Gadget gadget) {
       return gadgetUrl;
     }
   }
-  
+
   @Override
   protected void setUp() throws Exception {
     super.setUp();
-    JSONObject json = new JSONObject();
-    json.put("gadgets.container",
-             new JSONArray().put(ContainerConfig.DEFAULT_CONTAINER));
-    json.put("gadgets.lockedDomainRequired", true);
-    json.put("gadgets.lockedDomainSuffix", "-a.example.com:8080");
-    containerRequiredConfig  = new ContainerConfig(null);
-    containerRequiredConfig.loadFromString(json.toString());
-    
-    json.put("gadgets.lockedDomainRequired", false);
-    containerEnabledConfig = new ContainerConfig(null);
-    containerEnabledConfig.loadFromString(json.toString());
-    gadget = mock(Gadget.class);
+    containerRequiredConfig  = mock(ContainerConfig.class);
+    expect(containerRequiredConfig.get(ContainerConfig.DEFAULT_CONTAINER,
+        LOCKED_DOMAIN_REQUIRED_KEY)).andReturn("true").anyTimes();
+    expect(containerRequiredConfig.get(ContainerConfig.DEFAULT_CONTAINER,
+        LOCKED_DOMAIN_SUFFIX_KEY)).andReturn("-a.example.com:8080").anyTimes();
+    expect(containerRequiredConfig.getContainers())
+        
.andReturn(Arrays.asList(ContainerConfig.DEFAULT_CONTAINER)).anyTimes();
+
+    containerEnabledConfig = mock(ContainerConfig.class);
+    expect(containerEnabledConfig.get(ContainerConfig.DEFAULT_CONTAINER,
+        LOCKED_DOMAIN_REQUIRED_KEY)).andReturn("false").anyTimes();
+    expect(containerEnabledConfig.get(ContainerConfig.DEFAULT_CONTAINER,
+        LOCKED_DOMAIN_SUFFIX_KEY)).andReturn("-a.example.com:8080").anyTimes();
+    expect(containerEnabledConfig.getContainers())
+        
.andReturn(Arrays.asList(ContainerConfig.DEFAULT_CONTAINER)).anyTimes();
   }
 
+
   public void testDisabledGlobally() {
+    replay();
+
     domainLocker = new HashLockedDomainService(
         containerRequiredConfig, "embed.com", false);
     assertTrue(domainLocker.embedCanRender("anywhere.com"));
     assertTrue(domainLocker.embedCanRender("embed.com"));
     assertTrue(domainLocker.gadgetCanRender("embed.com", gadget, "default"));
-    
+
     domainLocker = new HashLockedDomainService(
         containerEnabledConfig, "embed.com", false);
     assertTrue(domainLocker.embedCanRender("anywhere.com"));
     assertTrue(domainLocker.embedCanRender("embed.com"));
-    assertTrue(domainLocker.gadgetCanRender("embed.com", gadget, "default"));  
  
+    assertTrue(domainLocker.gadgetCanRender("embed.com", gadget, "default"));
   }
-  
+
   public void testEnabledForGadget() {
+    replay();
+
     domainLocker = new HashLockedDomainService(
         containerEnabledConfig, "embed.com", true);
     assertFalse(domainLocker.embedCanRender("anywhere.com"));
@@ -106,8 +120,10 @@
         "8uhr00296d2o3sfhqilj387krjmgjv3v-a.example.com:8080",
         target);
   }
-  
+
   public void testNotEnabledForGadget() {
+    replay();
+
     domainLocker = new HashLockedDomainService(
         containerEnabledConfig, "embed.com", true);
     domainLocker.setSpecReader(noLocked);
@@ -129,10 +145,12 @@
         wantsLocked.getGadgetUrl(gadget), "default");
     assertEquals(
         "8uhr00296d2o3sfhqilj387krjmgjv3v-a.example.com:8080",
-        target);    
+        target);
   }
-  
+
   public void testRequiredForContainer() {
+    replay();
+
     domainLocker = new HashLockedDomainService(
         containerRequiredConfig, "embed.com", true);
     domainLocker.setSpecReader(noLocked);
@@ -148,30 +166,30 @@
         "8uhr00296d2o3sfhqilj387krjmgjv3v-a.example.com:8080",
         target);
   }
-  
+
   public void testMissingConfig() throws Exception {
-    JSONObject json = new JSONObject();
-    json.put("gadgets.container",
-             new JSONArray().put(ContainerConfig.DEFAULT_CONTAINER));
-    ContainerConfig containerMissingConfig  = new ContainerConfig(null);
-    containerMissingConfig.loadFromString(json.toString());
+    ContainerConfig containerMissingConfig = mock(ContainerConfig.class);
+    expect(containerMissingConfig.getContainers())
+      .andReturn(Arrays.asList(ContainerConfig.DEFAULT_CONTAINER));
+    replay();
+
     domainLocker = new HashLockedDomainService(
         containerMissingConfig, "embed.com", false);
     domainLocker.setSpecReader(wantsLocked);
     assertTrue(domainLocker.gadgetCanRender(
         "www.example.com", gadget, "default"));
   }
-  
+
   public void testMultiContainer() throws Exception {
-    JSONObject json = new JSONObject();
-    json.put("gadgets.container",
-             new JSONArray()
-             .put(ContainerConfig.DEFAULT_CONTAINER)
-             .put("other"));
-    json.put("gadgets.lockedDomainRequired", true);
-    json.put("gadgets.lockedDomainSuffix", "-a.example.com:8080");
-    ContainerConfig inheritsConfig  = new ContainerConfig(null);
-    inheritsConfig.loadFromString(json.toString());
+    ContainerConfig inheritsConfig  = mock(ContainerConfig.class);
+    expect(inheritsConfig.getContainers())
+        .andReturn(Arrays.asList(ContainerConfig.DEFAULT_CONTAINER, "other"));
+    expect(inheritsConfig.get(isA(String.class), 
eq(LOCKED_DOMAIN_REQUIRED_KEY)))
+        .andReturn("true").anyTimes();
+    expect(inheritsConfig.get(isA(String.class), eq(LOCKED_DOMAIN_SUFFIX_KEY)))
+        .andReturn("-a.example.com:8080").anyTimes();
+    replay();
+
     domainLocker = new HashLockedDomainService(
         inheritsConfig, "embed.com", true);
     domainLocker.setSpecReader(wantsLocked);

Modified: 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetRenderingTaskTest.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetRenderingTaskTest.java?rev=659934&r1=659933&r2=659934&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetRenderingTaskTest.java
 (original)
+++ 
incubator/shindig/trunk/java/gadgets/src/test/java/org/apache/shindig/gadgets/servlet/GadgetRenderingTaskTest.java
 Sun May 25 00:43:42 2008
@@ -24,13 +24,12 @@
 import org.apache.shindig.gadgets.ContainerConfig;
 import org.apache.shindig.gadgets.Gadget;
 import org.apache.shindig.gadgets.GadgetContext;
-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.easymock.EasyMock;
 import org.json.JSONArray;
-import org.json.JSONObject;
 
 import java.io.ByteArrayOutputStream;
 import java.io.PrintWriter;
@@ -136,15 +135,9 @@
   }
 
   public void testViewAliases() throws Exception {
-    JSONObject json = new JSONObject();
-    json.put("gadgets.container",
-             new JSONArray().put(ContainerConfig.DEFAULT_CONTAINER));
     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);
-    containerConfig.loadFromString(json.toString());
+    expect(containerConfig.getJsonArray(ContainerConfig.DEFAULT_CONTAINER,
+        "gadgets.features/views/dummy/aliases")).andReturn(aliases);
 
     String content = parseBasicGadget("dummy");
 


Reply via email to