Author: jogep
Date: Tue Feb  7 19:41:45 2012
New Revision: 1241573

URL: http://svn.apache.org/viewvc?rev=1241573&view=rev
Log:
WW-3750: ScopesHashModel calls OgnlValueStack.findValue too many times during 
rendering freemarker templates
Patch provided by Pelladi Gabor

Modified:
    
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/ScopesHashModel.java

Modified: 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/ScopesHashModel.java
URL: 
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/ScopesHashModel.java?rev=1241573&r1=1241572&r2=1241573&view=diff
==============================================================================
--- 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/ScopesHashModel.java
 (original)
+++ 
struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/ScopesHashModel.java
 Tue Feb  7 19:41:45 2012
@@ -21,19 +21,18 @@
 
 package org.apache.struts2.views.freemarker;
 
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-
 import com.opensymphony.xwork2.util.ValueStack;
-
 import freemarker.template.ObjectWrapper;
 import freemarker.template.SimpleHash;
 import freemarker.template.TemplateModel;
 import freemarker.template.TemplateModelException;
 
-import java.util.Map;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
 import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
 
 /**
@@ -53,7 +52,8 @@ public class ScopesHashModel extends Sim
     private ServletContext servletContext;
     private ValueStack stack;
     private final Map<String,TemplateModel> unlistedModels = new 
HashMap<String,TemplateModel>();
-
+    private final Map<String, Object> stackCache = new 
ConcurrentHashMap<String, Object>();
+    private static final Object NULL_OBJECT = new Object();
 
     public ScopesHashModel(ObjectWrapper objectWrapper, ServletContext 
context, HttpServletRequest request, ValueStack stack) {
         super(objectWrapper);
@@ -90,7 +90,7 @@ public class ScopesHashModel extends Sim
 
 
         if (stack != null) {
-            Object obj = stack.findValue(key);
+            Object obj = findValueOnStack(key);
 
             if (obj != null) {
                 return wrap(obj);
@@ -142,6 +142,24 @@ public class ScopesHashModel extends Sim
         return null;
     }
 
+    private Object findValueOnStack(final String key) {
+        if (this.stackCache.containsKey(key)) {
+            final Object value = this.stackCache.get(key);
+            if (value == NULL_OBJECT) {
+                return null;
+            }
+            return value;
+        }
+
+        final Object value = this.stack.findValue(key);
+        if (value == null) {
+            this.stackCache.put(key, NULL_OBJECT);
+        } else {
+            this.stackCache.put(key, value);
+        }
+        return value;
+    }
+
     public void put(String string, boolean b) {
         super.put(string, b);
     }


Reply via email to