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: [email protected]
For additional commands, e-mail: [email protected]