Return-Path: X-Original-To: apmail-struts-commits-archive@minotaur.apache.org Delivered-To: apmail-struts-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 866119B36 for ; Tue, 7 Feb 2012 19:42:08 +0000 (UTC) Received: (qmail 80021 invoked by uid 500); 7 Feb 2012 19:42:08 -0000 Delivered-To: apmail-struts-commits-archive@struts.apache.org Received: (qmail 79954 invoked by uid 500); 7 Feb 2012 19:42:07 -0000 Mailing-List: contact commits-help@struts.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@struts.apache.org Delivered-To: mailing list commits@struts.apache.org Received: (qmail 79947 invoked by uid 99); 7 Feb 2012 19:42:06 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 07 Feb 2012 19:42:06 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 07 Feb 2012 19:42:05 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id BD122238897D for ; Tue, 7 Feb 2012 19:41:45 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1241573 - /struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/freemarker/ScopesHashModel.java Date: Tue, 07 Feb 2012 19:41:45 -0000 To: commits@struts.apache.org From: jogep@apache.org X-Mailer: svnmailer-1.0.8-patched Message-Id: <20120207194145.BD122238897D@eris.apache.org> 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 unlistedModels = new HashMap(); - + private final Map stackCache = new ConcurrentHashMap(); + 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); }