craigmcc 2002/06/22 17:07:16 Modified: doc/userGuide struts-bean.xml src/share/org/apache/struts/taglib/bean DefineTag.java LocalStrings.properties Log: Envorce the restriction that you can only set the value of the attribute and scripting variable created by <bean:define> in exactly one of the three possible ways (name/property/scope, value, or nested body content). PR: Bugzilla #8484 Submitted by: David M. Karr <dmkarr at earthlink.net> Revision Changes Path 1.3 +23 -17 jakarta-struts/doc/userGuide/struts-bean.xml Index: struts-bean.xml =================================================================== RCS file: /home/cvs/jakarta-struts/doc/userGuide/struts-bean.xml,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- struts-bean.xml 21 Feb 2002 17:49:02 -0000 1.2 +++ struts-bean.xml 23 Jun 2002 00:07:15 -0000 1.3 @@ -120,21 +120,27 @@ <teiclass>org.apache.struts.taglib.bean.DefineTei</teiclass> <bodycontent>JSP</bodycontent> <info> - <p>Retrieve the value of a specified bean property, and define it - as an attribute (in the scope specified by the <code>toScope</code> - property) accessible to the remainder of the current - page. No type conversion is performed on the returned property value, - unless it is a Java primitive type, in which case it is wrapped in the - appropriate wrapper class (i.e. int is wrapped by java.lang.Integer).</p> - - <p>If you specify a "value" attribute, the exposed bean will be of type - <code>java.lang.String</code> and initialized to the specified value.</p> - - <p>If you specify a body, the exposed bean will be of type - <code>java.lang.String</code> and initialized to the body content.</p> - - <p>You can not specify a "value" attribute and body simultaneously - - JspException will be thrown.</p> + <p>Create a new attribute (in the scope specified by the + <code>toScope</code> property, if any), and a corresponding scripting + variable, both of which are named by the value of the <code>id</code> + attribute. The corresponding value to which this new attribute (and + scripting variable) is set are specified via use of exactly one of the + following approaches (trying to use more than one will result in a + JspException being thrown):</p> + <ul> + <li>Specify a <code>name</code> attribute (plus optional + <code>property</code> and <code>scope</code> attributes) - + The created attribute and scripting variable will be of the type of the + retrieved JavaBean property, unless it is a Java primitive type, + in which case it will be wrapped in the appropriate wrapper class + (i.e. int is wrapped by java.lang.Integer).</li> + <li>Specify a <code>value</code> attribute - The created attribute and + scripting variable will be of type <code>java.lang.String</code>, + set to the value of this attribute.</li> + <li>Specify nested body content - The created attribute and scripting + variable will be of type <code>java.lang.String</code>, set to + the value of the nested body content.</li> + </ul> <p>If a problem occurs while retrieving the specified bean property, a request time exception will be thrown.</p> @@ -188,7 +194,7 @@ specified) or the attribute name of the bean that is duplicated with the new reference created by this tag (if <code>property</code> is not also specified). This attribute is required unless you specify - a <code>value</code> attribute.</p> + a <code>value</code> attribute or nested body content.</p> </info> </attribute> @@ -246,7 +252,7 @@ <info> <p>The <code>java.lang.String</code> value to which the exposed bean should be set. This attribute is required unless you specify the - <code>name</code> attribute.</p> + <code>name</code> attribute or nested body content.</p> </info> </attribute> 1.17 +59 -23 jakarta-struts/src/share/org/apache/struts/taglib/bean/DefineTag.java Index: DefineTag.java =================================================================== RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/bean/DefineTag.java,v retrieving revision 1.16 retrieving revision 1.17 diff -u -r1.16 -r1.17 --- DefineTag.java 16 Mar 2002 05:04:33 -0000 1.16 +++ DefineTag.java 23 Jun 2002 00:07:16 -0000 1.17 @@ -91,6 +91,13 @@ MessageResources.getMessageResources ("org.apache.struts.taglib.bean.LocalStrings"); + + /** + * The body content of this tag (if any). + */ + protected String body = null; + + // ------------------------------------------------------------- Properties @@ -195,20 +202,38 @@ // --------------------------------------------------------- Public Methods + /** - * - * Check if we need to evaluate the body of the tag - * - * @exception JspException if a JSP exception has occurred - */ + * Check if we need to evaluate the body of the tag + * + * @exception JspException if a JSP exception has occurred + */ public int doStartTag() throws JspException { - if( this.name!=null || this.value!=null ) - return (SKIP_BODY); - else - return (EVAL_BODY_TAG); + return (EVAL_BODY_TAG); + + } + + + /** + * Save the body content of this tag (if any), or throw a JspException + * if the value was already defined. + * + * @exception JspException if value was defined by an attribute + */ + public int doAfterBody() throws JspException { + + if (bodyContent != null) { + body = bodyContent.getString(); + if (body != null) { + body = body.trim(); + } + } + return (SKIP_BODY); + } + /** * Retrieve the required property and expose it as a scripting variable. * @@ -216,21 +241,31 @@ */ public int doEndTag() throws JspException { - if( ( this.value!=null || - this.name!=null ) && - bodyContent!=null ) - throw new JspException( messages.getMessage("define.value", name) ); + // Enforce restriction on ways to declare the new value + int n = 0; + if (this.body != null) { + n++; + } + if (this.name != null) { + n++; + } + if (this.value != null) { + n++; + } + if (n != 1) { + JspException e = + new JspException(messages.getMessage("define.value")); + RequestUtils.saveException(pageContext, e); + throw e; + } // Retrieve the required property value Object value = this.value; - if ((value == null) && (name!=null)) { + if ((value == null) && (name != null)) { value = RequestUtils.lookup(pageContext, name, property, scope); } - if (value == null) { - value = bodyContent.getString(); - if (value != null) { - value = ((String) value).trim(); - } + if ((value == null) && (body != null)) { + value = body; } if (value == null) { JspException e = @@ -260,6 +295,7 @@ public void release() { super.release(); + body = null; id = null; name = null; property = null; 1.18 +1 -1 jakarta-struts/src/share/org/apache/struts/taglib/bean/LocalStrings.properties Index: LocalStrings.properties =================================================================== RCS file: /home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/bean/LocalStrings.properties,v retrieving revision 1.17 retrieving revision 1.18 diff -u -r1.17 -r1.18 --- LocalStrings.properties 16 Mar 2002 05:04:33 -0000 1.17 +++ LocalStrings.properties 23 Jun 2002 00:07:16 -0000 1.18 @@ -1,6 +1,6 @@ cookie.get=No cookie {0} was included in this request define.null=Define tag cannot set a null value -define.value=Define tag can contain value/name attributes or body. +define.value=Define tag can contain only one of name attribute, value attribute, or body content header.get=No header {0} was included in this request include.destination=You must specify exactly one of forward, href, or page include.forward=Missing ActionForward entry {0}
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>