You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@shindig.apache.org by jo...@apache.org on 2010/11/12 02:25:33 UTC

svn commit: r1034231 - in /shindig/trunk/java/common/src: main/java/org/apache/shindig/config/ test/java/org/apache/shindig/config/

Author: johnh
Date: Fri Nov 12 01:25:32 2010
New Revision: 1034231

URL: http://svn.apache.org/viewvc?rev=1034231&view=rev
Log:
Reinstate allowance for null values in ContainerConfig children to delete values from the parent.


Modified:
    shindig/trunk/java/common/src/main/java/org/apache/shindig/config/BasicContainerConfig.java
    shindig/trunk/java/common/src/main/java/org/apache/shindig/config/ExpressionContainerConfig.java
    shindig/trunk/java/common/src/main/java/org/apache/shindig/config/JsonContainerConfigLoader.java
    shindig/trunk/java/common/src/test/java/org/apache/shindig/config/BasicContainerConfigTest.java
    shindig/trunk/java/common/src/test/java/org/apache/shindig/config/JsonContainerConfigLoaderTest.java

Modified: shindig/trunk/java/common/src/main/java/org/apache/shindig/config/BasicContainerConfig.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/common/src/main/java/org/apache/shindig/config/BasicContainerConfig.java?rev=1034231&r1=1034230&r2=1034231&view=diff
==============================================================================
--- shindig/trunk/java/common/src/main/java/org/apache/shindig/config/BasicContainerConfig.java (original)
+++ shindig/trunk/java/common/src/main/java/org/apache/shindig/config/BasicContainerConfig.java Fri Nov 12 01:25:32 2010
@@ -242,11 +242,13 @@ public class BasicContainerConfig implem
      * { 'gadgets.container': ['default'],
      *   'base': '/gadgets/foo',
      *   'user': 'peter',
-     *   'map': { 'latitude': 42, 'longitude': -8 } }
+     *   'map': { 'latitude': 42, 'longitude': -8 },
+     *   'data': [ 'foo', 'bar' ] }
      * { 'gadgets.container': ['new'],
      *   'user': 'anne',
      *   'colour': 'green',
-     *   'map': { 'longitude': 130 } }
+     *   'map': { 'longitude': 130 },
+     *   'data': null }
      *
      * It would result in a merged "new" container that looks like this:
      * { 'gadgets.container': ['new'],
@@ -298,7 +300,11 @@ public class BasicContainerConfig implem
               (Map<String, Object>) fromParents, (Map<String, Object>) fromContainer));
         } else {
           // Otherwise we just overwrite it.
-          clone.put(field, fromContainer);
+          if (fromContainer == null) {
+            clone.remove(field);
+          } else {
+            clone.put(field, fromContainer);
+          }
         }
       }
       return clone;

Modified: shindig/trunk/java/common/src/main/java/org/apache/shindig/config/ExpressionContainerConfig.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/common/src/main/java/org/apache/shindig/config/ExpressionContainerConfig.java?rev=1034231&r1=1034230&r2=1034231&view=diff
==============================================================================
--- shindig/trunk/java/common/src/main/java/org/apache/shindig/config/ExpressionContainerConfig.java (original)
+++ shindig/trunk/java/common/src/main/java/org/apache/shindig/config/ExpressionContainerConfig.java Fri Nov 12 01:25:32 2010
@@ -19,13 +19,13 @@
 
 package org.apache.shindig.config;
 
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.inject.Singleton;
 
 import org.apache.shindig.expressions.Expressions;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -139,17 +139,17 @@ public class ExpressionContainerConfig e
         return new DynamicConfigProperty((String) value, expressions, context);
       } else if (value instanceof Map<?, ?>) {
         Map<?, ?> mapValue = (Map<?, ?>) value;
-        ImmutableMap.Builder<Object, Object> newMap = ImmutableMap.builder();
+        Map<Object, Object> newMap = Maps.newHashMap();
         for (Map.Entry<?, ?> entry : mapValue.entrySet()) {
           newMap.put(entry.getKey(), parseAll(entry.getValue(), context));
         }
-        return newMap.build();
+        return Collections.unmodifiableMap(newMap);
       } else if (value instanceof List<?>) {
-        ImmutableList.Builder<Object> newList = ImmutableList.builder();
+        List<Object> newList = Lists.newArrayList();
         for (Object entry : (List<?>) value) {
           newList.add(parseAll(entry, context));
         }
-        return newList.build();
+        return Collections.unmodifiableList(newList);
       } else {
         return value;
       }
@@ -160,17 +160,17 @@ public class ExpressionContainerConfig e
         return value.toString();
       } else if (value instanceof Map<?, ?>) {
         Map<?, ?> mapValue = (Map<?, ?>) value;
-        ImmutableMap.Builder<Object, Object> newMap = ImmutableMap.builder();
+        Map<Object, Object> newMap = Maps.newHashMap();
         for (Map.Entry<?, ?> entry : mapValue.entrySet()) {
           newMap.put(entry.getKey(), evaluateAll(entry.getValue()));
         }
-        return newMap.build();
+        return Collections.unmodifiableMap(newMap);
       } else if (value instanceof List<?>) {
-        ImmutableList.Builder<Object> newList = ImmutableList.builder();
+        List<Object> newList = Lists.newArrayList();
         for (Object entry : (List<?>) value) {
           newList.add(evaluateAll(entry));
         }
-        return newList.build();
+        return Collections.unmodifiableList(newList);
       } else {
         return value;
       }

Modified: shindig/trunk/java/common/src/main/java/org/apache/shindig/config/JsonContainerConfigLoader.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/common/src/main/java/org/apache/shindig/config/JsonContainerConfigLoader.java?rev=1034231&r1=1034230&r2=1034231&view=diff
==============================================================================
--- shindig/trunk/java/common/src/main/java/org/apache/shindig/config/JsonContainerConfigLoader.java (original)
+++ shindig/trunk/java/common/src/main/java/org/apache/shindig/config/JsonContainerConfigLoader.java Fri Nov 12 01:25:32 2010
@@ -19,8 +19,8 @@
 
 package org.apache.shindig.config;
 
-import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.shindig.common.util.ResourceLoader;
@@ -255,9 +255,7 @@ public class JsonContainerConfigLoader {
     Map<String, Object> values = new HashMap<String, Object>(json.length(), 1);
     for (String key : JSONObject.getNames(json)) {
       Object val = jsonToConfig(json.opt(key));
-      if (val != null) {
-        values.put(key, val);
-      }
+      values.put(key, val);
     }
     return Collections.unmodifiableMap(values);
   }
@@ -269,13 +267,11 @@ public class JsonContainerConfigLoader {
       @SuppressWarnings("unchecked")
       List<String> names = (List<String>) container.get(ContainerConfig.CONTAINER_KEY);
       if (names != null && names.contains(ContainerConfig.DEFAULT_CONTAINER)) {
-        container = ImmutableMap
-            .<String, Object>builder()
-            .putAll(container)
-            .put(SERVER_PORT, port)
-            .put(SERVER_HOST, host)
-            .build();
-        config.set(i, container);
+        Map<String, Object> newContainer = Maps.newHashMap();
+        newContainer.putAll(container);
+        newContainer.put(SERVER_PORT, port);
+        newContainer.put(SERVER_HOST, host);
+        config.set(i, Collections.unmodifiableMap(newContainer));
       }
     }
   }

Modified: shindig/trunk/java/common/src/test/java/org/apache/shindig/config/BasicContainerConfigTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/common/src/test/java/org/apache/shindig/config/BasicContainerConfigTest.java?rev=1034231&r1=1034230&r2=1034231&view=diff
==============================================================================
--- shindig/trunk/java/common/src/test/java/org/apache/shindig/config/BasicContainerConfigTest.java (original)
+++ shindig/trunk/java/common/src/test/java/org/apache/shindig/config/BasicContainerConfigTest.java Fri Nov 12 01:25:32 2010
@@ -23,14 +23,15 @@ import static org.junit.Assert.*;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableMap.Builder;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
 
 import org.apache.shindig.config.ContainerConfig.ConfigObserver;
 import org.easymock.EasyMock;
 import org.junit.Before;
 import org.junit.Test;
 
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -50,21 +51,23 @@ public class BasicContainerConfigTest {
   protected ContainerConfig config;
 
   protected static Map<String, Object> makeContainer(String name, Object... values) {
-    Builder<String, Object> newCtr = ImmutableMap.builder();
+    // Not using ImmutableMap to allow null values
+    Map<String, Object> newCtr = Maps.newHashMap();
     newCtr.put("gadgets.container", ImmutableList.of(name));
     for (int i = 0; i < values.length / 2; ++i) {
       newCtr.put(values[i * 2].toString(), values[i * 2 + 1]);
     }
-    return newCtr.build();
+    return Collections.unmodifiableMap(newCtr);
   }
 
   protected static Map<String, Object> makeContainer(List<String> name, Object... values) {
-    Builder<String, Object> newCtr = ImmutableMap.builder();
+    // Not using ImmutableMap to allow null values
+    Map<String, Object> newCtr = Maps.newHashMap();
     newCtr.put("gadgets.container", name);
     for (int i = 0; i < values.length / 2; ++i) {
       newCtr.put(values[i * 2].toString(), values[i * 2 + 1]);
     }
-    return newCtr.build();
+    return Collections.unmodifiableMap(newCtr);
   }
 
   @Before
@@ -122,11 +125,13 @@ public class BasicContainerConfigTest {
     Map<String, Object> defaultContainer = makeContainer("default",
         "base", "/gadgets/foo",
         "user", "peter",
-        "map", ImmutableMap.of("latitude", 42, "longitude", -8));
+        "map", ImmutableMap.of("latitude", 42, "longitude", -8),
+        "data", ImmutableList.of("foo", "bar"));
     Map<String, Object> newContainer = makeContainer("new",
         "user", "anne",
         "colour", "green",
-        "map", ImmutableMap.of("longitude", 130));
+        "map", ImmutableMap.of("longitude", 130),
+        "data", null);
     Map<String, Object> expectedContainer = makeContainer("new",
         "base", "/gadgets/foo",
         "user", "anne",

Modified: shindig/trunk/java/common/src/test/java/org/apache/shindig/config/JsonContainerConfigLoaderTest.java
URL: http://svn.apache.org/viewvc/shindig/trunk/java/common/src/test/java/org/apache/shindig/config/JsonContainerConfigLoaderTest.java?rev=1034231&r1=1034230&r2=1034231&view=diff
==============================================================================
--- shindig/trunk/java/common/src/test/java/org/apache/shindig/config/JsonContainerConfigLoaderTest.java (original)
+++ shindig/trunk/java/common/src/test/java/org/apache/shindig/config/JsonContainerConfigLoaderTest.java Fri Nov 12 01:25:32 2010
@@ -254,4 +254,15 @@ public class JsonContainerConfigLoaderTe
     createConfigForTest(createContainer(json).getAbsolutePath());
     assertNull(config.getMap("default", "features").get("osapi"));
   }
+  
+  @Test
+  public void testNullEntriesOverrideEntriesInParent() throws Exception {
+    // We use JSON Objects here to guarantee that we're well formed up front.
+    JSONObject parent = new JSONObject("{ 'gadgets.container' : ['default'], features : { osapi : 'foo' }}");    
+    JSONObject child = new JSONObject("{ 'gadgets.container' : ['child'], features : null}");    
+    createConfigForTest(createContainer(parent).getAbsolutePath());
+    createConfigForTest(createContainer(child).getAbsolutePath());
+    assertEquals("foo", config.getMap("default", "features").get("osapi"));
+    assertNull(config.getProperty("child", "features"));
+  }
 }