Author: awiner
Date: Wed Apr  8 04:27:53 2009
New Revision: 763099

URL: http://svn.apache.org/viewvc?rev=763099&view=rev
Log:
SHINDIG-1010: Race condition in JsonContainerConfig EL evaluation
- Aggressively evaluate all EL in the container configs, avoiding attempts to 
use ELContexts from multiple threads

Modified:
    
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/config/JsonContainerConfig.java

Modified: 
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/config/JsonContainerConfig.java
URL: 
http://svn.apache.org/viewvc/incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/config/JsonContainerConfig.java?rev=763099&r1=763098&r2=763099&view=diff
==============================================================================
--- 
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/config/JsonContainerConfig.java
 (original)
+++ 
incubator/shindig/trunk/java/common/src/main/java/org/apache/shindig/config/JsonContainerConfig.java
 Wed Apr  8 04:27:53 2009
@@ -24,6 +24,8 @@
 import org.apache.shindig.common.util.ResourceLoader;
 import org.apache.shindig.expressions.Expressions;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -80,6 +82,7 @@
       throws ContainerConfigException {
     this.expressions = expressions;
     config = createContainers(loadContainers(containers));
+    evaluateConfig();
   }
 
   /**
@@ -88,6 +91,7 @@
   public JsonContainerConfig(JSONObject json, Expressions expressions) {
     this.expressions = expressions;
     config = createContainers(json);
+    evaluateConfig();
   }
 
   @Override
@@ -350,4 +354,34 @@
   public String toString() {
     return JsonSerializer.serialize(config);
   }
+
+  private void evaluateConfig() {
+    for (Map.Entry<String, Map<String, Object>> configEntry : 
config.entrySet()) {
+      @SuppressWarnings("unchecked")
+      Map<String, Object> value = (Map<String, Object>) 
evaluateAll(configEntry.getValue());
+      configEntry.setValue(value);
+    }
+  }
+  
+  private Object evaluateAll(Object value) {
+    if (value instanceof CharSequence) {
+      return value.toString();
+    } else if (value instanceof Map) {
+      ImmutableMap.Builder<Object, Object> newMap = ImmutableMap.builder();
+      for (Map.Entry<?, ?> entry : ((Map<?, ?>) value).entrySet()) {
+        newMap.put(entry.getKey(), evaluateAll(entry.getValue()));
+      }
+      
+      return newMap.build();
+    } else if (value instanceof List) {
+      ImmutableList.Builder<Object> newList = ImmutableList.builder(); 
+      for (Object entry : (List<?>) value) {
+        newList.add(evaluateAll(entry));
+      }
+      
+      return newList.build();
+    } else {
+      return value;
+    }
+  }
 }


Reply via email to