Author: jboynes
Date: Sun Oct 24 00:43:55 2010
New Revision: 1026723

URL: http://svn.apache.org/viewvc?rev=1026723&view=rev
Log:
Add JSTL 1.0 Out tag that uses javax.el to process EL expressions
Refactor existing tags for deferred evaluation to avoid memory leak from 
retained references

Added:
    
tomcat/taglibs/standard/trunk/compat/src/main/java/org/apache/taglibs/standard/tag/compat/core/OutTag.java
Modified:
    tomcat/taglibs/standard/trunk/compat/pom.xml
    
tomcat/taglibs/standard/trunk/impl/src/main/java/org/apache/taglibs/standard/tag/common/core/OutSupport.java
    
tomcat/taglibs/standard/trunk/impl/src/main/java/org/apache/taglibs/standard/tag/rt/core/OutTag.java
    
tomcat/taglibs/standard/trunk/jstlel/src/main/java/org/apache/taglibs/standard/tag/el/core/OutTag.java

Modified: tomcat/taglibs/standard/trunk/compat/pom.xml
URL: 
http://svn.apache.org/viewvc/tomcat/taglibs/standard/trunk/compat/pom.xml?rev=1026723&r1=1026722&r2=1026723&view=diff
==============================================================================
--- tomcat/taglibs/standard/trunk/compat/pom.xml (original)
+++ tomcat/taglibs/standard/trunk/compat/pom.xml Sun Oct 24 00:43:55 2010
@@ -70,9 +70,13 @@
   <dependencies>
       <dependency>
       <groupId>org.apache.taglibs</groupId>
+      <artifactId>taglibs-standard-spec</artifactId>
+      <version>1.2-SNAPSHOT</version>
+    </dependency>
+      <dependency>
+      <groupId>org.apache.taglibs</groupId>
       <artifactId>taglibs-standard-impl</artifactId>
       <version>1.2-SNAPSHOT</version>
-      <scope>provided</scope>
     </dependency>
 
     <dependency>

Added: 
tomcat/taglibs/standard/trunk/compat/src/main/java/org/apache/taglibs/standard/tag/compat/core/OutTag.java
URL: 
http://svn.apache.org/viewvc/tomcat/taglibs/standard/trunk/compat/src/main/java/org/apache/taglibs/standard/tag/compat/core/OutTag.java?rev=1026723&view=auto
==============================================================================
--- 
tomcat/taglibs/standard/trunk/compat/src/main/java/org/apache/taglibs/standard/tag/compat/core/OutTag.java
 (added)
+++ 
tomcat/taglibs/standard/trunk/compat/src/main/java/org/apache/taglibs/standard/tag/compat/core/OutTag.java
 Sun Oct 24 00:43:55 2010
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ * 
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.taglibs.standard.tag.compat.core;
+
+import javax.el.ValueExpression;
+import javax.servlet.jsp.JspException;
+
+import org.apache.taglibs.standard.tag.common.core.OutSupport;
+import org.apache.taglibs.standard.util.ExpressionUtil;
+
+/**
+ */
+public class OutTag extends OutSupport {
+
+    private ValueExpression valueExpression;
+    private ValueExpression defaultExpression;
+    private ValueExpression escapeXmlExpression;
+
+    public OutTag() {
+    }
+
+    @Override
+    public void release() {
+        valueExpression = null;
+        defaultExpression = null;
+        escapeXmlExpression = null;
+        super.release();
+    }
+
+    public void setValue(String value) {
+        valueExpression = ExpressionUtil.createValueExpression(pageContext, 
value, Object.class);
+    }
+
+    public void setDefault(String def) {
+        defaultExpression = ExpressionUtil.createValueExpression(pageContext, 
def, String.class);
+    }
+
+    public void setEscapeXml(String escapeXml) {
+        escapeXmlExpression = 
ExpressionUtil.createValueExpression(pageContext, escapeXml, Boolean.TYPE);
+    }
+
+    @Override
+    protected Object evalValue() throws JspException {
+        if (valueExpression == null) {
+            return null;
+        }
+        return valueExpression.getValue(pageContext.getELContext());
+    }
+
+    @Override
+    protected String evalDefault() throws JspException {
+        if (defaultExpression == null) {
+            return null;
+        }
+        return (String) defaultExpression.getValue(pageContext.getELContext());
+    }
+
+    @Override
+    protected boolean evalEscapeXml() throws JspException {
+        if (escapeXmlExpression == null) {
+            return true;
+        }
+        return (Boolean) 
escapeXmlExpression.getValue(pageContext.getELContext());
+    }
+}

Modified: 
tomcat/taglibs/standard/trunk/impl/src/main/java/org/apache/taglibs/standard/tag/common/core/OutSupport.java
URL: 
http://svn.apache.org/viewvc/tomcat/taglibs/standard/trunk/impl/src/main/java/org/apache/taglibs/standard/tag/common/core/OutSupport.java?rev=1026723&r1=1026722&r2=1026723&view=diff
==============================================================================
--- 
tomcat/taglibs/standard/trunk/impl/src/main/java/org/apache/taglibs/standard/tag/common/core/OutSupport.java
 (original)
+++ 
tomcat/taglibs/standard/trunk/impl/src/main/java/org/apache/taglibs/standard/tag/common/core/OutSupport.java
 Sun Oct 24 00:43:55 2010
@@ -34,7 +34,7 @@ import javax.servlet.jsp.tagext.BodyTagS
  *
  * @author Shawn Bayern
  */
-public class OutSupport extends BodyTagSupport {
+public abstract class OutSupport extends BodyTagSupport {
 
     /*
      * (One almost wishes XML and JSP could support "anonymous tags,"
@@ -44,9 +44,6 @@ public class OutSupport extends BodyTagS
     //*********************************************************************
     // Internal state
 
-    protected Object value;                     // tag attribute
-    protected String def;                      // tag attribute
-    protected boolean escapeXml;               // tag attribute
     private Object output;
 
     //*********************************************************************
@@ -59,20 +56,12 @@ public class OutSupport extends BodyTagS
      */
     public OutSupport() {
         super();
-        init();
-    }
-
-    // resets local state
-    private void init() {
-        value = def = null;
-        output = null;
-        escapeXml = true;
     }
 
     // Releases any resources we may have (or inherit)
     public void release() {
+        output = null;
         super.release();
-        init();
     }
 
 
@@ -85,14 +74,14 @@ public class OutSupport extends BodyTagS
         this.bodyContent = null;  // clean-up body (just in case container is 
pooling tag handlers)
 
         // output value if not null
-        if (value != null) {
-            output = value;
+        output = evalValue();
+        if (output != null) {
             return SKIP_BODY;
         }
 
         // output default if supplied
-        if (def != null ) {
-            output = def;
+        output = evalDefault();
+        if (output != null ) {
             return SKIP_BODY;
         }
 
@@ -102,6 +91,30 @@ public class OutSupport extends BodyTagS
         return EVAL_BODY_BUFFERED;
     }
 
+    /**
+     * Evaluates the "value" attribute.
+     *
+     * @return the actual value of the "value" attribute
+     * @throws JspException if there was a problem evaluating the expression
+     */
+    protected abstract Object evalValue() throws JspException;
+
+    /**
+     * Evaluates the "default" attribute.
+     *
+     * @return the actual value of the "default" attribute
+     * @throws JspException if there was a problem evaluating the expression
+     */
+    protected abstract String evalDefault() throws JspException;
+
+    /**
+     * Evaluates the "escapeXml" attribute.
+     *
+     * @return the actual value of the "escapeXml" attribute
+     * @throws JspException if there was a problem evaluating the expression
+     */
+    protected abstract boolean evalEscapeXml() throws JspException;
+
     @Override
     public int doAfterBody() throws JspException {
         output = bodyContent.getString().trim();
@@ -111,9 +124,12 @@ public class OutSupport extends BodyTagS
     @Override
     public int doEndTag() throws JspException {
         try {
+            boolean escapeXml = evalEscapeXml();
             EscapeXML.emit(output, escapeXml, pageContext.getOut());
         } catch (IOException e) {
             throw new JspTagException(e);
+        } finally {
+            output = null;
         }
         return EVAL_PAGE;
     }

Modified: 
tomcat/taglibs/standard/trunk/impl/src/main/java/org/apache/taglibs/standard/tag/rt/core/OutTag.java
URL: 
http://svn.apache.org/viewvc/tomcat/taglibs/standard/trunk/impl/src/main/java/org/apache/taglibs/standard/tag/rt/core/OutTag.java?rev=1026723&r1=1026722&r2=1026723&view=diff
==============================================================================
--- 
tomcat/taglibs/standard/trunk/impl/src/main/java/org/apache/taglibs/standard/tag/rt/core/OutTag.java
 (original)
+++ 
tomcat/taglibs/standard/trunk/impl/src/main/java/org/apache/taglibs/standard/tag/rt/core/OutTag.java
 Sun Oct 24 00:43:55 2010
@@ -27,9 +27,21 @@ import org.apache.taglibs.standard.tag.c
 
 public class OutTag extends OutSupport {
 
+    private Object value;
+    private String def;
+    private boolean escapeXml;
+
     //*********************************************************************
     // Accessors
-       
+
+    @Override
+    public void release() {
+        value = null;
+        def = null;
+        escapeXml = false;
+        super.release();
+    }
+
     // for tag attribute
     public void setValue(Object value) {
         this.value = value;
@@ -44,4 +56,19 @@ public class OutTag extends OutSupport {
     public void setEscapeXml(boolean escapeXml) {
         this.escapeXml = escapeXml;
     }
+
+    @Override
+    protected Object evalValue() {
+        return value;
+    }
+
+    @Override
+    protected String evalDefault() {
+        return def;
+    }
+
+    @Override
+    protected boolean evalEscapeXml() {
+        return escapeXml;
+    }
 }

Modified: 
tomcat/taglibs/standard/trunk/jstlel/src/main/java/org/apache/taglibs/standard/tag/el/core/OutTag.java
URL: 
http://svn.apache.org/viewvc/tomcat/taglibs/standard/trunk/jstlel/src/main/java/org/apache/taglibs/standard/tag/el/core/OutTag.java?rev=1026723&r1=1026722&r2=1026723&view=diff
==============================================================================
--- 
tomcat/taglibs/standard/trunk/jstlel/src/main/java/org/apache/taglibs/standard/tag/el/core/OutTag.java
 (original)
+++ 
tomcat/taglibs/standard/trunk/jstlel/src/main/java/org/apache/taglibs/standard/tag/el/core/OutTag.java
 Sun Oct 24 00:43:55 2010
@@ -19,6 +19,7 @@ package org.apache.taglibs.standard.tag.
 
 import javax.servlet.jsp.JspException;
 
+import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager;
 import org.apache.taglibs.standard.tag.common.core.NullAttributeException;
 import org.apache.taglibs.standard.tag.common.core.OutSupport;
 
@@ -34,86 +35,62 @@ public class OutTag extends OutSupport {
     //*********************************************************************
     // 'Private' state (implementation details)
 
-    private String value_;                     // stores EL-based property
-    private String default_;                   // stores EL-based property
-    private String escapeXml_;                 // stores EL-based property
+    private String valueExpression;                    // stores EL-based 
property
+    private String defaultExpression;                  // stores EL-based 
property
+    private String escapeXmlExpression;                        // stores 
EL-based property
 
 
     //*********************************************************************
     // Constructor
 
     public OutTag() {
-        super();
-        init();
     }
 
-
-    //*********************************************************************
-    // Tag logic
-
-    // evaluates expression and chains to parent
-    public int doStartTag() throws JspException {
-
-        // evaluate any expressions we were passed, once per invocation
-        evaluateExpressions();
-
-       // chain to the parent implementation
-       return super.doStartTag();
-    }
-
-
-    // Releases any resources we may have (or inherit)
+    @Override
     public void release() {
+        valueExpression = null;
+        defaultExpression = null;
+        escapeXmlExpression = null;
         super.release();
-        init();
     }
 
-
-    //*********************************************************************
-    // Accessor methods
-
-    public void setValue(String value_) {
-        this.value_ = value_;
+    public void setValue(String value) {
+        this.valueExpression = value;
     }
 
-    public void setDefault(String default_) {
-        this.default_ = default_;
+    public void setDefault(String def) {
+        this.defaultExpression = def;
     }
 
-    public void setEscapeXml(String escapeXml_) {
-        this.escapeXml_ = escapeXml_;
+    public void setEscapeXml(String escapeXml) {
+        this.escapeXmlExpression = escapeXml;
     }
 
+    @Override
+    protected Object evalValue() throws JspException {
+        if (valueExpression == null) {
+            return null;
+        }
+        return ExpressionEvaluatorManager.evaluate("value", valueExpression, 
Object.class, this, pageContext);
+    }
 
-    //*********************************************************************
-    // Private (utility) methods
+    @Override
+    protected String evalDefault() throws JspException {
+        if (defaultExpression == null) {
+            return null;
+        }
+        return (String) ExpressionEvaluatorManager.evaluate("default", 
defaultExpression, String.class, this, pageContext);
+    }
 
-    // (re)initializes state (during release() or construction)
-    private void init() {
-        // null implies "no expression"
-       value_ = default_ = escapeXml_ = null;
-    }
-
-    /* Evaluates expressions as necessary */
-    private void evaluateExpressions() throws JspException {
-       try {
-           value = ExpressionUtil.evalNotNull(
-               "out", "value", value_, Object.class, this, pageContext);
-       } catch (NullAttributeException ex) {
-           // explicitly allow 'null' for value
-           value = null;
-       }
-       try { 
-           def = (String) ExpressionUtil.evalNotNull(
-               "out", "default", default_, String.class, this, pageContext);
-       } catch (NullAttributeException ex) {
-           // explicitly allow 'null' for def
-           def = null;
-       }
-       escapeXml = true;
-       Boolean escape = ((Boolean) ExpressionUtil.evalNotNull(
-           "out", "escapeXml", escapeXml_, Boolean.class, this, pageContext));
-       if (escape != null)
-           escapeXml = escape.booleanValue();
+    @Override
+    protected boolean evalEscapeXml() throws JspException {
+        if (escapeXmlExpression == null) {
+            return true;
+        }
+        Boolean result = (Boolean) 
ExpressionEvaluatorManager.evaluate("escapeXml", escapeXmlExpression, 
Boolean.class, this, pageContext);
+        if (result == null) {
+            return true;
+        }
+        return result;
     }
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to