You are viewing a plain text version of this content. The canonical link for it is here.
Posted to taglibs-dev@jakarta.apache.org by Mike Cantrell <Mi...@ind.alcatel.com> on 2002/10/22 22:40:45 UTC

[PATCH] Re: release() methods for jakarta taglibs (fwd)

I added release() methods to all classes that needed their member vars 
reset to their initial values.

Henri Yandell wrote:

>Some important questions on the Users list.
>
>dbtags and mailer getting the exact focus, but a more general question
>being asked. Obviously patches would be nice, or even just bug reports.
>
>Any views?
>
>Hen
>
>---------- Forwarded message ----------
>Date: Tue, 22 Oct 2002 12:59:10 -0500
>From: "Halvorson, Loren" <Lo...@firepond.com>
>Reply-To: Tag Libraries Users List <ta...@jakarta.apache.org>
>To: 'Tag Libraries Users List' <ta...@jakarta.apache.org>
>Subject: RE: release() methods for jakarta taglibs
>
>This seems very similar to the bug I filed for dbtags last week.
>http://nagoya.apache.org/bugzilla/show_bug.cgi?id=13667
>Is someone going to go through and clean up these pooling issues?  Or should
>we be submitting patches?
>-----Original Message-----
>From: Mike Cantrell [mailto:Mike.Cantrell@ind.alcatel.com]
>Sent: Tuesday, October 22, 2002 12:31 PM
>To: Tag Libraries Users List
>Subject: release() methods for jakarta taglibs
>
>
>We are encountering some problems with the Jakarta Taglibs with newer
>servlet containers that pool the tag objects (Tomcat  4.1.x and JRun
>4.0). Most of the tags I looked through don't override the release()
>method to reset the initial values and do cleanup.
>
>For instance, the mailer taglib has a tag called mt:addrecipient. If you
>use this tag, each time the page is called the value is just appended to
>the original value. Are there any plans to go through these tags and
>make them "pool safe"?
>
>Example:
>
>    <mt:mail server="smtp">
>        <mt:from><c:out value="${param.mail_from}"
>escapeXml="false"/></mt:from>
>        <mt:subject><c:out value="${param.subject}"
>escapeXml="false"/></mt:subject>
>        <c:forEach var="email" items="${emailList}">
>            <mt:addrecipient type="to"><c:out value="${email}"
>escapeXml="false"/></mt:setrecipient>
>        </c:forEach>
>        <mt:message type="html">
>            <div style="width: 500px;">
>                <c:out value="${param.body}" escapeXml="false"/>
>            </div>
>        </mt:message>
>        <mt:send/>
>    </mt:mail>
>
>Let's assume that emailList contains the addresess: jsmith@foo.com and
>johns@bar.com.
>
>The first time the page is processed, the email sends out emails to:
>
>     jsmith@foo.com, johns@bar.com.
>
>If you hit reload, the email sends out to:
>
>     jsmith@foo.com, johns@bar.com, jsmith@foo.com, johns@bar.com
>
>and if you hit reload again, the email sends out to:
>     jsmith@foo.com, johns@bar.com, jsmith@foo.com,
>johns@bar.com, jsmith@foo.com,
>     johns@bar.com, jsmith@foo.com, johns@bar.com.
>
>
>I've double checked the emailList  and it only contains the original 2
>elements each time the page reloads. It appears that the taglib is
>simply adding  the list to the old list from the Object obtained from
>the pool since there's no release() method to reset the tag's initial data.
>
>
>
>--
>To unsubscribe, e-mail:
><ma...@jakarta.apache.org>
>For additional commands, e-mail:
><ma...@jakarta.apache.org>
>
>--
>To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
>For additional commands, e-mail: <ma...@jakarta.apache.org>
>
>
>
>
>--
>To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
>For additional commands, e-mail: <ma...@jakarta.apache.org>
>
>  
>

Re: [PATCH] Re: release() methods for jakarta taglibs (fwd)

Posted by Glenn Nielsen <gl...@mail.more.net>.
Adding a release() method does not guarantee that the tags state will
be reset between invocations when tag pooling is used.  Please review
http://jakarta.apache.org/taglibs/guidelines.html and the JSP Specification
custom tag lifecycle when developing or modifying tag libraries to support
Servlet Container JSP custom tag pooling.

Regards,

Glenn

Mike Cantrell wrote:
> I added release() methods to all classes that needed their member vars 
> reset to their initial values.
> 
> Henri Yandell wrote:
> 
>> Some important questions on the Users list.
>>
>> dbtags and mailer getting the exact focus, but a more general question
>> being asked. Obviously patches would be nice, or even just bug reports.
>>
>> Any views?
>>
>> Hen
>>
>> ---------- Forwarded message ----------
>> Date: Tue, 22 Oct 2002 12:59:10 -0500
>> From: "Halvorson, Loren" <Lo...@firepond.com>
>> Reply-To: Tag Libraries Users List <ta...@jakarta.apache.org>
>> To: 'Tag Libraries Users List' <ta...@jakarta.apache.org>
>> Subject: RE: release() methods for jakarta taglibs
>>
>> This seems very similar to the bug I filed for dbtags last week.
>> http://nagoya.apache.org/bugzilla/show_bug.cgi?id=13667
>> Is someone going to go through and clean up these pooling issues?  Or 
>> should
>> we be submitting patches?
>> -----Original Message-----
>> From: Mike Cantrell [mailto:Mike.Cantrell@ind.alcatel.com]
>> Sent: Tuesday, October 22, 2002 12:31 PM
>> To: Tag Libraries Users List
>> Subject: release() methods for jakarta taglibs
>>
>>
>> We are encountering some problems with the Jakarta Taglibs with newer
>> servlet containers that pool the tag objects (Tomcat  4.1.x and JRun
>> 4.0). Most of the tags I looked through don't override the release()
>> method to reset the initial values and do cleanup.
>>
>> For instance, the mailer taglib has a tag called mt:addrecipient. If you
>> use this tag, each time the page is called the value is just appended to
>> the original value. Are there any plans to go through these tags and
>> make them "pool safe"?
>>
>> Example:
>>
>>    <mt:mail server="smtp">
>>        <mt:from><c:out value="${param.mail_from}"
>> escapeXml="false"/></mt:from>
>>        <mt:subject><c:out value="${param.subject}"
>> escapeXml="false"/></mt:subject>
>>        <c:forEach var="email" items="${emailList}">
>>            <mt:addrecipient type="to"><c:out value="${email}"
>> escapeXml="false"/></mt:setrecipient>
>>        </c:forEach>
>>        <mt:message type="html">
>>            <div style="width: 500px;">
>>                <c:out value="${param.body}" escapeXml="false"/>
>>            </div>
>>        </mt:message>
>>        <mt:send/>
>>    </mt:mail>
>>
>> Let's assume that emailList contains the addresess: jsmith@foo.com and
>> johns@bar.com.
>>
>> The first time the page is processed, the email sends out emails to:
>>
>>     jsmith@foo.com, johns@bar.com.
>>
>> If you hit reload, the email sends out to:
>>
>>     jsmith@foo.com, johns@bar.com, jsmith@foo.com, johns@bar.com
>>
>> and if you hit reload again, the email sends out to:
>>     jsmith@foo.com, johns@bar.com, jsmith@foo.com,
>> johns@bar.com, jsmith@foo.com,
>>     johns@bar.com, jsmith@foo.com, johns@bar.com.
>>
>>
>> I've double checked the emailList  and it only contains the original 2
>> elements each time the page reloads. It appears that the taglib is
>> simply adding  the list to the old list from the Object obtained from
>> the pool since there's no release() method to reset the tag's initial 
>> data.
>>
>>
>>
>> -- 
>> To unsubscribe, e-mail:
>> <ma...@jakarta.apache.org>
>> For additional commands, e-mail:
>> <ma...@jakarta.apache.org>
>>
>> -- 
>> To unsubscribe, e-mail:   
>> <ma...@jakarta.apache.org>
>> For additional commands, e-mail: 
>> <ma...@jakarta.apache.org>
>>
>>
>>
>>
>> -- 
>> To unsubscribe, e-mail:   
>> <ma...@jakarta.apache.org>
>> For additional commands, e-mail: 
>> <ma...@jakarta.apache.org>
>>
>>  
>>
> 
> ------------------------------------------------------------------------
> 
> --- AddRecipientTag.java	Tue Oct 22 13:55:31 2002
> +++ /home/mikec/src/jakarta-taglibs/mailer/src/org/apache/taglibs/mailer/AddRecipientTag.java	Tue Oct 22 12:54:32 2002
> @@ -66,10 +66,10 @@
>  import javax.servlet.jsp.tagext.*;
>  
>  /**
> - * AddRecipientTag - JSP tag <b>addrecipient</b> is used to add any type of 
> - *                recipient to an already existant list of recipients in an 
> + * AddRecipientTag - JSP tag <b>addrecipient</b> is used to add any type of
> + *                recipient to an already existant list of recipients in an
>   *                e-mail message. Two attributes are required, type and address.
> - *                Type may be either "to", "cc", or "bcc" and address should be 
> + *                Type may be either "to", "cc", or "bcc" and address should be
>   *                a string representation of the recipients e-mail address.
>   *
>   * <tag>
> @@ -133,8 +133,8 @@
>  	if (myparent == null)
>  	    throw new JspException("addrecipient tag not nested within mail tag");
>  	// Make sure type is set..either "to", "cc", or "bcc"
> -	if ((type != null) && (type.equalsIgnoreCase("to") || 
> -		type.equalsIgnoreCase("cc") || type.equalsIgnoreCase("bcc"))) { 
> +	if ((type != null) && (type.equalsIgnoreCase("to") ||
> +		type.equalsIgnoreCase("cc") || type.equalsIgnoreCase("bcc"))) {
>  
>  	    if (address != null) {
>  		// Try to see if the address attribute was used.
> @@ -149,10 +149,10 @@
>  		    myparent.addBcc(address);
>  		address = null;  // reset address
>  		return SKIP_BODY;
> -	    } else 
> +	    } else
>  	        return EVAL_BODY_TAG;
>  	} else
> -	    throw new JspException("The type attribute is not set. " + 
> +	    throw new JspException("The type attribute is not set. " +
>  				 " Specify either \"to\", \"cc\", or \"bcc\".");
>      }
>  
> @@ -169,7 +169,7 @@
>       *
>       */
>      public final int doAfterBody() throws JspException {
> -        if ((address = bodyContent.getString()) != null) { 
> +        if ((address = bodyContent.getString()) != null) {
>  	    // Try to see if the body was used for the address.
>  	    if (type.equalsIgnoreCase("to"))
>  		// set to in the parent tag
> @@ -182,7 +182,7 @@
>  		myparent.addBcc(address);
>  	    address = null;  // reset address so tag can be reused
>  	    return SKIP_BODY;
> -	} else 
> +	} else
>  	    throw new JspException("Address was not found. set " +
>  			     " the address attribute, or place the address in" +
>  			     " the body of the tag.");
> @@ -191,7 +191,7 @@
>      /**
>       * set the type of recipient for the address
>       *
> -     * @param type  string that is the type of the address either 
> +     * @param type  string that is the type of the address either
>       *   "to", "cc", or "bcc".
>       *
>       */
> @@ -202,11 +202,20 @@
>      /**
>       * set the value for an address to be later added to the email
>       *
> -     * @param address  string that is an address to be added to the 
> +     * @param address  string that is an address to be added to the
>       *   "to", "cc", or "bcc" lists of addresses.
>       *
>       */
>      public final void setAddress(String address) {
>        this.address = address.trim();
>      }
> +
> +    /**
> +     * reset the initial member values
> +     */
> +    public final void release() {
> +      this.myparent = null;
> +      this.address = null;
> +      this.type = null;
> +    }
>  }
> --- AttachTag.java	Tue Oct 22 13:55:31 2002
> +++ /home/mikec/src/jakarta-taglibs/mailer/src/org/apache/taglibs/mailer/AttachTag.java	Tue Oct 22 12:55:40 2002
> @@ -282,4 +282,14 @@
>  
>  // End of added
>      }
> +
> +    /**
> +     * reset the initial member values
> +     */
> +    public final void release() {
> +      this.file = null;
> +      this.mbp = null;
> +      this.type = null;
> +      this.url = null;
> +    }
>  }
> --- ErrorTag.java	Tue Oct 22 13:55:31 2002
> +++ /home/mikec/src/jakarta-taglibs/mailer/src/org/apache/taglibs/mailer/ErrorTag.java	Tue Oct 22 12:57:20 2002
> @@ -136,11 +136,11 @@
>      }
>  
>      /**
> -     * Implementation of the method from the tag interface that gets called at 
> +     * Implementation of the method from the tag interface that gets called at
>       * end of each error tag.
>       *
>       * @return EVAL_BODY_TAG if there is another error, or SKIP_BODY if there
> -     *                      are no more errors 
> +     *                      are no more errors
>       */
>      public final int doAfterBody() throws JspException
>      {
> @@ -190,11 +190,15 @@
>      }
>  
>      /**
> -     * Remove the script variable after error tag is closed out
> +     * Remove the script variable after error tag is closed out.
> +     * Reset the initial member values
>       */
> -    public final void release()
> -    {
> -	if( id != null && id.length() > 0 )
> -	    pageContext.removeAttribute(id,PageContext.PAGE_SCOPE);
> +    public final void release() {
> +      if( id != null && id.length() > 0 )
> +          pageContext.removeAttribute(id,PageContext.PAGE_SCOPE);
> +
> +      this.error = null;
> +      this.errorlist = null;
> +      this.errors = null;
>      }
>  }
> --- HeaderTag.java	Tue Oct 22 13:55:31 2002
> +++ /home/mikec/src/jakarta-taglibs/mailer/src/org/apache/taglibs/mailer/HeaderTag.java	Tue Oct 22 12:59:05 2002
> @@ -127,7 +127,7 @@
>  		// set header value in the parent tag
>  		myparent.setHeaderValue(value);
>  	    else if ((value = bodyContent.getString()) != null) {
> -		// if value was set in body of header tag 
> +		// if value was set in body of header tag
>  		myparent.setHeaderValue(value);
>  	    } else
>  		throw new JspException("The header tag is empty");
> @@ -154,4 +154,12 @@
>      public final void setValue(String value) {
>  	this.value = value;
>      }
> +
> +    /**
> +     * reset the initial member values
> +     */
> +    public final void release() {
> +      this.name = null;
> +      this.value = null;
> +    }
>  }
> --- MailTag.java	Tue Oct 22 13:55:31 2002
> +++ /home/mikec/src/jakarta-taglibs/mailer/src/org/apache/taglibs/mailer/MailTag.java	Tue Oct 22 13:11:23 2002
> @@ -225,7 +225,7 @@
>      private boolean error = false;
>      /**
>       * flag that determines if the session for sending mail should have an
> -     * authenticator so that user name and password can be entered if it is 
> +     * authenticator so that user name and password can be entered if it is
>       * required for the mail server
>       */
>      private boolean authentication = false;
> @@ -262,12 +262,12 @@
>  		// get initial context from which to lookup session
>  		Context ctx = new InitialContext();
>  
> -		// create the mail message using the preconfigured jndi 
> +		// create the mail message using the preconfigured jndi
>  		// named session
>  		sessionobj = (Session)ctx.lookup(session);
>  		message = new MimeMessage(sessionobj);
>  	    } catch (NamingException ne) {
> -		throw new JspException("Naming Exception " + 
> +		throw new JspException("Naming Exception " +
>  					   ne.getExplanation());
>  	    }
>  	} else {
> @@ -286,14 +286,14 @@
>  	    props.put("mail.smtp.dsn.notify", "FAILURE");
>  	    // set amount of message to get returned
>  	    props.put("mail.smtp.dsn.ret", "FULL");
> -	    // create new piece of mail for the smtp mail session check if 
> +	    // create new piece of mail for the smtp mail session check if
>  	    // authentication is required for the mail server
>  
>  	    if (authentication) {
>  		    // create the session with an authenticator object
>  		    // better way to do authentication
>  		    props.put("mail.smtp.auth", "true");
> -		    sessionobj = Session.getDefaultInstance(props, 
> +		    sessionobj = Session.getDefaultInstance(props,
>  					 new MailAuthenticator(user, password));
>  	    } else
>  		sessionobj = Session.getDefaultInstance(props, null);
> @@ -711,5 +711,32 @@
>  	else
>  	    bcc = bcc.concat("," + value);
>      }
> +
> +    /**
> +     * reset the initial member values
> +     */
> +    public final void release() {
> +      this.attachments = false;
> +      this.authentication = false;
> +      this.bcc = null;
> +      this.body = null;
> +      this.bodyparts = new ArrayList(10);
> +      this.cc = null;
> +      this.error = false;
> +      this.from = null;
> +      this.message = null;
> +      this.mimemessage = null;
> +      this.name = new ArrayList(10);
> +      this.password = null;
> +      this.replyto = null;
> +      this.server = "localhost";
> +      this.session = null;
> +      this.sessionobj = null;
> +      this.subject = "";
> +      this.to = null;
> +      this.type = "text/plain";
> +      this.user = null;
> +      this.value = new ArrayList(10);
> +    }
>  }
>  
> --- MessageTag.java	Tue Oct 22 13:55:31 2002
> +++ /home/mikec/src/jakarta-taglibs/mailer/src/org/apache/taglibs/mailer/MessageTag.java	Tue Oct 22 13:12:13 2002
> @@ -132,4 +132,11 @@
>      public final void setType(String value) {
>  	type = value;
>      }
> +
> +    /**
> +     * reset the initial member values
> +     */
> +    public final void release() {
> +      this.type = null;
> +    }
>  }
> --- SendTag.java	Tue Oct 22 13:55:31 2002
> +++ /home/mikec/src/jakarta-taglibs/mailer/src/org/apache/taglibs/mailer/SendTag.java	Tue Oct 22 13:13:07 2002
> @@ -148,7 +148,7 @@
>  	    try {
>  		// set the to address for this message
>  		// catch any errors in the format of the addresses
> -	        message.setRecipients(Message.RecipientType.TO, 
> +	        message.setRecipients(Message.RecipientType.TO,
>  				      InternetAddress.parse(to));
>  	    } catch (AddressException ae) {
>  		// get the address that the error occured with
> @@ -260,7 +260,7 @@
>  		cc = cc.substring(1);
>  
>  	    try {
> -                message.setRecipients(Message.RecipientType.CC, 
> +                message.setRecipients(Message.RecipientType.CC,
>  					   InternetAddress.parse(cc));
>  	    } catch (AddressException ae) {
>  		// get the address that the error occured with
> @@ -291,7 +291,7 @@
>  		// exception occurs when any of the addresses cannot be
>  		// properly set in the message
>                  String errorinput = "Messaging Exception: Some cc address/es"
> -			                + " could not be set in the message." 
> +			                + " could not be set in the message."
>  			                + me.getMessage();
>  
>  		error.add(errorinput);
> @@ -307,7 +307,7 @@
>  		bcc = bcc.substring(1);
>  
>  	    try {
> -                message.setRecipients(Message.RecipientType.BCC, 
> +                message.setRecipients(Message.RecipientType.BCC,
>  					  InternetAddress.parse(bcc));
>  	    } catch (AddressException ae) {
>  		// get the address that the error occured with
> @@ -338,7 +338,7 @@
>  		// exception occurs when any of the addresses cannot be
>  		// properly set in the message
>                  String errorinput = "Messaging Exception: Some bcc address/es"
> -			                + " could not be set in the message." 
> +			                + " could not be set in the message."
>  			                + me.getMessage();
>  
>  		error.add(errorinput);
> @@ -366,7 +366,7 @@
>  		// create a mimebodypart for the body of the e-mail message
>  		MimeBodyPart mbp = new MimeBodyPart();
>  
> -		// set the content in the bodypart 
> +		// set the content in the bodypart
>  		mbp.setContent(myparent.getBody(), myparent.getType());
>  
>  		// add the message as the first bodypart in the multipart object
> @@ -375,7 +375,7 @@
>  		// get the list of attachments
>  		iterate = myparent.getBodyParts().listIterator();
>  
> -		// loop through the list of attachments and add them to the 
> +		// loop through the list of attachments and add them to the
>  		// multipart object
>  		while (iterate.hasNext()) {
>  		    multipart.addBodyPart((MimeBodyPart) iterate.next());
> @@ -453,6 +453,13 @@
>      public final ArrayList getError() {
>  	return error;
>      }
> +
> +    /**
> +     * reset the initial member values
> +     */
> +    public final void release() {
> +      this.error = null;
> +    }
>  }
>  
>   /**
> @@ -468,10 +475,10 @@
>  
>      private MimeMessage message = null;  // the message to be sent
>      // used to get the servlet context for logging
> -    private javax.servlet.ServletContext sc = null; 
> -    String mailto;  // list of to address this message is being sent to 
> +    private javax.servlet.ServletContext sc = null;
> +    String mailto;  // list of to address this message is being sent to
>  
> -    Mail (MimeMessage mail, javax.servlet.ServletContext servletcontext, 
> +    Mail (MimeMessage mail, javax.servlet.ServletContext servletcontext,
>  	  String to) {
>  	message = mail;
>  	sc = servletcontext;
> @@ -493,7 +500,7 @@
>  	    // Since the JSP has already finished executing this exception will
>  	    // do nothing visible, however the errors should be dealt with by
>  	    // the SMTP host if it is configured correctly
> -	    sc.log("Could not send the e-mail sent to " + mailto + ":  " + 
> +	    sc.log("Could not send the e-mail sent to " + mailto + ":  " +
>  		   me.getMessage());
>  	}
>      }
> --- SetRecipientTag.java	Tue Oct 22 13:55:31 2002
> +++ /home/mikec/src/jakarta-taglibs/mailer/src/org/apache/taglibs/mailer/SetRecipientTag.java	Tue Oct 22 13:14:19 2002
> @@ -66,10 +66,10 @@
>  import javax.servlet.jsp.tagext.*;
>  
>  /**
> - * SetRecipientTag - JSP tag <b>setrecipient</b> is used to set any type of 
> - *                recipient to an e-mail. Two attributes are required, type and 
> - *                setress. Type may be either "to", "cc", or "bcc" and address 
> - *                should be a string representation of the recipients e-mail 
> + * SetRecipientTag - JSP tag <b>setrecipient</b> is used to set any type of
> + *                recipient to an e-mail. Two attributes are required, type and
> + *                setress. Type may be either "to", "cc", or "bcc" and address
> + *                should be a string representation of the recipients e-mail
>   *                address.
>   *
>   * <tag>
> @@ -133,8 +133,8 @@
>  	if (myparent == null)
>  	    throw new JspException("setrecipient tag not nested within mail tag");
>  	// Make sure type is set..either "to", "cc", or "bcc"
> -	if ((type != null) && (type.equalsIgnoreCase("to") || 
> -		type.equalsIgnoreCase("cc") || type.equalsIgnoreCase("bcc"))) { 
> +	if ((type != null) && (type.equalsIgnoreCase("to") ||
> +		type.equalsIgnoreCase("cc") || type.equalsIgnoreCase("bcc"))) {
>  
>  	    if (address != null) {
>  		// Try to see if the address attribute was used.
> @@ -149,10 +149,10 @@
>  		    myparent.setBcc(address);
>  		address = null;  // reset address
>  		return SKIP_BODY;
> -	    } else 
> +	    } else
>  	        return EVAL_BODY_TAG;
>  	} else
> -	    throw new JspException("The type attribute is not set. " + 
> +	    throw new JspException("The type attribute is not set. " +
>  				 " Specify either \"to\", \"cc\", or \"bcc\".");
>      }
>  
> @@ -182,7 +182,7 @@
>  		myparent.setBcc(address);
>  	    address = null;  // reset address so tag can be reused
>  	    return SKIP_BODY;
> -	} else 
> +	} else
>  	    throw new JspException("Address was not found. set " +
>  			     " the address attribute, or place the address in" +
>  			     " the body of the tag.");
> @@ -191,7 +191,7 @@
>      /**
>       * set the type of recipient for the address
>       *
> -     * @param type  string that is the type of the address either 
> +     * @param type  string that is the type of the address either
>       *   "to", "cc", or "bcc".
>       *
>       */
> @@ -202,11 +202,20 @@
>      /**
>       * set the value for an address to be later added to the email
>       *
> -     * @param address  string that is an address to be added to the 
> +     * @param address  string that is an address to be added to the
>       *   "to", "cc", or "bcc" lists of addresses.
>       *
>       */
>      public final void setAddress(String address) {
>        this.address = address.trim();
>      }
> +
> +    /**
> +     * reset the initial member values
> +     */
> +    public final void release() {
> +      this.address = null;
> +      this.myparent = null;
> +      this.type = null;
> +    }
>  }
> 
> 
> 
> ------------------------------------------------------------------------
> 
> --
> To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
> For additional commands, e-mail: <ma...@jakarta.apache.org>




--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>