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