adammurdoch 02/02/05 01:32:48
Modified: . build.xml
docs/manual install.html optionaltasklist.html
docs/manual/CoreTasks mail.html
docs/manual/OptionalTasks mimemail.html
src/main/org/apache/tools/ant/taskdefs SendEmail.java
defaults.properties
src/main/org/apache/tools/ant/taskdefs/optional/net
MimeMail.java
Added: src/main/org/apache/tools/ant/taskdefs/email
EmailAddress.java EmailTask.java Mailer.java
Message.java MimeMailer.java PlainMailer.java
UUMailer.java
Log:
* Added new combined email task, which replaces the old <mail> and
<mimemail> tasks.
* Deprecated <mimemail> task, and old SendEmail and MimeMail classes.
Submitted by Rob Oxspring <[EMAIL PROTECTED]>.
Revision Changes Path
1.235 +6 -1 jakarta-ant/build.xml
Index: build.xml
===================================================================
RCS file: /home/cvs/jakarta-ant/build.xml,v
retrieving revision 1.234
retrieving revision 1.235
diff -u -r1.234 -r1.235
--- build.xml 4 Feb 2002 10:35:30 -0000 1.234
+++ build.xml 5 Feb 2002 09:32:47 -0000 1.235
@@ -189,6 +189,9 @@
<available property="bcel.present"
classname="org.apache.bcel.Constants"
classpathref="classpath" />
+ <available property="sunuue.present"
+ classname="sun.misc.UUEncoder"
+ classpathref="classpath" />
<condition property="javamail.complete">
<and>
@@ -269,6 +272,9 @@
<exclude name="${ant.package}/listener/Log4jListener.java"
unless="log4j.present" />
+ <exclude name="${ant.package}/taskdefs/email/UUMailer.java"
unless="sunuue.present" />
+ <exclude name="${ant.package}/taskdefs/email/MimeMailer.java"
unless="javamail.complete" />
+
<exclude name="${optional.package}/IContract.java"
unless="icontract.present" />
<exclude name="${optional.package}/Script.java" unless="bsf.present" />
<exclude name="${optional.package}/StyleBook.java"
unless="stylebook.present" />
@@ -286,7 +292,6 @@
<exclude name="${optional.package}/ejb/IPlanet*.java"
unless="ejbjar.support" />
<exclude name="${optional.package}/Javah.java" unless="jdk1.2+" />
<exclude name="${optional.package}/junit/*" unless="junit.present" />
- <exclude name="${optional.package}/net/MimeMail.java"
unless="javamail.complete" />
<exclude name="${optional.package}/net/FTP.java"
unless="netcomp.present" />
<exclude name="${optional.package}/net/TelnetTask.java"
unless="netcomp.present" />
<exclude name="${optional.package}/scm/AntStarTeam*.java"
unless="starteam.present" />
1.24 +2 -2 jakarta-ant/docs/manual/install.html
Index: install.html
===================================================================
RCS file: /home/cvs/jakarta-ant/docs/manual/install.html,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- install.html 10 Jan 2002 08:48:28 -0000 1.23
+++ install.html 5 Feb 2002 09:32:47 -0000 1.24
@@ -342,13 +342,13 @@
</tr>
<tr>
<td>mail.jar</td>
- <td>MimeMail task</td>
+ <td>Mail task with Mime encoding, and the MimeMail task</td>
<td><a href="http://java.sun.com/products/javamail/"
target="_top">http://java.sun.com/products/javamail/</a></td>
</tr>
<tr>
<td>activation.jar</td>
- <td>MimeMail task</td>
+ <td>Mail task with Mime encoding, and the MimeMail task</td>
<td><a href="http://java.sun.com/products/javabeans/glasgow/jaf.html"
target="_top">http://java.sun.com/products/javabeans/glasgow/jaf.html</a></td>
</tr>
1.24 +1 -1 jakarta-ant/docs/manual/optionaltasklist.html
Index: optionaltasklist.html
===================================================================
RCS file: /home/cvs/jakarta-ant/docs/manual/optionaltasklist.html,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- optionaltasklist.html 31 Jan 2002 19:47:40 -0000 1.23
+++ optionaltasklist.html 5 Feb 2002 09:32:47 -0000 1.24
@@ -31,7 +31,7 @@
<a href="OptionalTasks/junitreport.html">JUnitReport</a><br>
<a href="OptionalTasks/mmetrics.html">Metamata Metrics</a><br>
<a href="OptionalTasks/maudit.html">Metamata Audit</a><br>
-<a href="OptionalTasks/mimemail.html">MimeMail</a><br>
+<a href="OptionalTasks/mimemail.html"><i>MimeMail</i></a><br>
<a href="OptionalTasks/mparse.html">MParse</a><br>
<a href="OptionalTasks/native2ascii.html">Native2Ascii</a><br>
<a href="OptionalTasks/netrexxc.html">NetRexxC</a><br>
1.10 +127 -25 jakarta-ant/docs/manual/CoreTasks/mail.html
Index: mail.html
===================================================================
RCS file: /home/cvs/jakarta-ant/docs/manual/CoreTasks/mail.html,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- mail.html 3 Feb 2002 22:00:42 -0000 1.9
+++ mail.html 5 Feb 2002 09:32:47 -0000 1.10
@@ -9,9 +9,10 @@
<h2><a name="mail">Mail</a></h2>
<h3>Description</h3>
-<p>A task to send SMTP email. Text and text files to include in the message
-body may be specified. To send binary attachments the optional
-<a href="../OptionalTasks/mimemail.html">MimeMail</a> task should be used
instead</p>
+<p>A task to send SMTP email. This task can send mail using either plain
+text, uu encoding or Mime format mail depending on what is available.
+Attachments may be sent using nested
+<a href="../CoreTypes/fileset.html">fileset</a> elements.</p>
<h3>Parameters</h3>
<table border="1" cellpadding="2" cellspacing="0">
@@ -23,45 +24,75 @@
<tr>
<td valign="top">from</td>
<td valign="top">Email address of sender.</td>
- <td align="center" valign="top">Yes</td>
+ <td align="center" valign="top">Either a <code>from</code> attribute, or
a <code><from></code>
+ element.</td>
</tr>
<tr>
<td valign="top">tolist</td>
<td valign="top">Comma-separated list of recipients.</td>
- <td align="center" valign="top">Yes</td>
+ <td align="center" valign="middle" rowspan="3">At least one of these, or
the
+ equivalent elements.</td>
+ </tr>
+ <tr>
+ <td valign="top">cclist</td>
+ <td valign="top">Comma-separated list of recipients to carbon copy</td>
+ </tr>
+ <tr>
+ <td valign="top">bcclist</td>
+ <td valign="top">Comma-separated list of recipients to carbon copy</td>
</tr>
<tr>
<td valign="top">message</td>
<td valign="top">Message to send in the body of the email.</td>
- <td align="center" valign="middle" rowspan="2">One of the two</td>
+ <td align="center" valign="middle" rowspan="2">One of these or a
+ <code><message></code> element.</td>
+ </tr>
+ <tr>
+ <td valign="top">messagefile</td>
+ <td valign="top">File to send as the body of the email.</td>
+ </tr>
+ <td valign="top">messagemimetype</td>
+ <td valign="top">The content type of the message. The default is
+ <code>text/plain</code>.</td>
+ <td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">files</td>
- <td valign="top">Filename(s) of text to send in the body of the email.
- Multiple files are comma-separated.</td>
+ <td valign="top">Files to send as attachments to the email. Separate
multiple
+ file names using a comma. You can also use <code><fileset></code>
+ elements to specify files.</td>
+ <td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">failonerror</td>
- <td valign="top">flag to indicate whether to halt the build on
- any error.</td>
- <td align="center" valign="top">No, default is <I>true</I></td>
- </tr>
+ <td valign="top">flag to indicate whether to halt the build on
+ any error. The default value is <code>true</code>.</td>
+ <td align="center" valign="top">No.</td>
+ </tr>
<tr>
<td valign="top">includefilenames</td>
<td valign="top">Include filename(s) before file contents.
- Valid only when the files attribute is specified.</td>
- <td align="center" valign="top">No, default is <I>false</I></td>
+ Valid only when the <code>plain</code> encoding is used. The default
+ value is <code>false</code>.</td>
+ <td align="center" valign="top">No</td>
</tr>
-
<tr>
<td valign="top">mailhost</td>
- <td valign="top">Host name of the mail server.</td>
- <td align="center" valign="top">No, default is "localhost"</td>
+ <td valign="top">Host name of the SMTP server. The default value is
+ <code>localhost</code>.</td>
+ <td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">mailport</td>
- <td valign="top">Port of the mail server.</td>
- <td align="center" valign="top">No, default to SMTP default (25)</td>
+ <td valign="top">TCP port of the SMTP server. The default value is
25.</td>
+ <td align="center" valign="top">No</td>
+ </tr>
+ <tr>
+ <td valign="top">encoding</td>
+ <td valign="top">Specifies the encoding to use for the content of the
email.
+ Values are <code>mime</code>, <code>uu</code>, <code>plain</code>, or
+ <code>auto</code>. The default value is <code>auto</code>.</td>
+ <td align="center" valign="top">No</td>
</tr>
<tr>
<td valign="top">subject</td>
@@ -69,13 +100,84 @@
<td align="center" valign="top">No</td>
</tr>
</table>
+
+<h3>Parameters specified as nested elements</h3>
+
+<h4>to / cc / bcc / from</h4>
+<p>Adds an email address element. It takes the following attributes:</p>
+
+<table width="60%" border="1" cellpadding="2" cellspacing="0">
+ <tr>
+ <td valign="top"><b>Attribute</b></td>
+ <td valign="top"><b>Description</b></td>
+ <td align="center" valign="top"><b>Required</b></td>
+ </tr>
+ <tr>
+ <td valign="top">name</td>
+ <td valign="top">The display name for the address.</td>
+ <td align="center" valign="top">No</td>
+ </tr>
+ <tr>
+ <td valign="top">address</td>
+ <td valign="top">The email address.</td>
+ <td align="center" valign="top">Yes</td>
+ </tr>
+</table>
+
+<h4>message</h4>
+
+<p>Specifies the message to include in the email body. It takes the
following
+attributes:</p>
+
+<table width="60%" border="1" cellpadding="2" cellspacing="0">
+ <tr>
+ <td valign="top"><b>Attribute</b></td>
+ <td valign="top"><b>Description</b></td>
+ <td align="center" valign="top"><b>Required</b></td>
+ </tr>
+ <tr>
+ <td valign="top">src</td>
+ <td valign="top">The file to use as the message.</td>
+ <td align="center" valign="top">No</td>
+ </tr>
+ <tr>
+ <td valign="top">mimetype</td>
+ <td valign="top">The content type to use for the message.</td>
+ <td align="center" valign="top">No</td>
+ </tr>
+</table>
+
+<p>If the <code>src</code> attribute is not specified, then text can be added
+inside the <code><message></code> element.</p>
+
<h3>Examples</h3>
-<pre>
- <mail from="me" tolist="you" subject="Results
of nightly build"
- files="build.log"/></pre>
-<p>Sends an eMail from <i>me</i> to <i>you</i> with a subject of
-<i>Results of nightly build</i> and includes the contents of <i>build.log</i>
-in the body of the message.</p>
+
+<blockquote><pre>
+<mail from="me"
+ tolist="you"
+ subject="Results of nightly build"
+ files="build.log" />
+</pre></blockquote>
+
+<p>Sends an email from <i>me</i> to <i>you</i> with a subject of
+<i>Results of nightly build</i> and includes the contents of the file
+<i>build.log</i> in the body of the message.</p>
+
+<blockquote><pre>
+<mail mailhost="smtp.myisp.com" mailport="1025"
subject="Test build">
+ <from name="[EMAIL PROTECTED]">
+ <to name="[EMAIL PROTECTED]">
+ <message>A new nightly build has completed</message>
+ <fileset dir="dist">
+ <includes name="**/*.zip"/>
+ </fileset>
+</mail>
+</pre></blockquote>
+
+<p>Sends an eMail from <i>[EMAIL PROTECTED]</i> to <i>[EMAIL PROTECTED]</i>
with a subject of
+<i>Test Build</i> and attaches any zip files from the dist directory.
The
+task will attempt to use JavaMail and fall back to UU encoding or no
encoding in
+that order depending on what support classes are available.</p>
<hr>
<p align="center">Copyright © 2001-2002 Apache Software Foundation. All
rights
Reserved.</p>
1.7 +8 -5 jakarta-ant/docs/manual/OptionalTasks/mimemail.html
Index: mimemail.html
===================================================================
RCS file: /home/cvs/jakarta-ant/docs/manual/OptionalTasks/mimemail.html,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- mimemail.html 3 Feb 2002 22:09:09 -0000 1.6
+++ mimemail.html 5 Feb 2002 09:32:47 -0000 1.7
@@ -8,10 +8,13 @@
<body>
<h2><a name="mimemail">MimeMail</a></h2>
+
+<h3><i>Deprecated</i></h3>
+<p><i>This task has been deprecated. Use the <a
href="../CoreTasks/mail.html">mail</a> task instead.</i></p>
+
<h3>Description</h3>
-<p>Sends SMTP mail with MIME attachments. If no attachments
-are needed, use the built-in <a href="../CoreTasks/mail.html">Mail</a>
-task. <a
href="http://java.sun.com/products/javamail/index.html">JavaMail</a>
+<p>Sends SMTP mail with MIME attachments.
+<a href="http://java.sun.com/products/javamail/index.html">JavaMail</a>
and <a href="http://java.sun.com/products/javabeans/glasgow/jaf.html">Java
Activation Framework</a> are required for this task.</p>
<p>Multiple files can be attached using <a
href="../CoreTypes/fileset.html">FileSets.</a></p>
@@ -79,7 +82,7 @@
</table>
<h3>Examples</h3>
<p><b>Send a single HTML file as the body of a message</b></p>
-<pre> <mimemail messageMimeType="text/html"
messageFile="overview-summary.html"
+<pre> <mimemail messageMimeType="text/html"
messageFile="overview-summary.html"
tolist="you" subject="JUnit Test Results:
${TODAY}" from="me"/></pre>
<p><b>Sends all files in a directory as attachments</b></p>
<pre> <mimemail message="See attached files"
tolist="you" subject="Attachments" from="me">
@@ -88,7 +91,7 @@
</fileset>
</mimemail>
</pre>
-<hr><p align="center">Copyright © 2001 Apache Software Foundation. All
rights
+<hr><p align="center">Copyright © 2001-2002 Apache Software Foundation.
All rights
Reserved.</p>
</body>
1.10 +8 -205
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/SendEmail.java
Index: SendEmail.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/SendEmail.java,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
--- SendEmail.java 10 Jan 2002 13:59:32 -0000 1.9
+++ SendEmail.java 5 Feb 2002 09:32:47 -0000 1.10
@@ -51,23 +51,10 @@
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
-
-package org.apache.tools.ant.taskdefs;
-import java.io.PrintStream;
-import java.io.File;
-import java.io.BufferedInputStream;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.Vector;
-import java.util.StringTokenizer;
-import java.util.Enumeration;
-import org.apache.tools.mail.ErrorInQuitException;
-import org.apache.tools.mail.MailMessage;
+package org.apache.tools.ant.taskdefs;
-import org.apache.tools.ant.Task;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.taskdefs.email.EmailTask;
/**
* A task to send SMTP email.
@@ -119,200 +106,16 @@
* @author [EMAIL PROTECTED]
* @author <a href="mailto:[EMAIL PROTECTED]">Magesh Umasankar</a>
*/
-public class SendEmail extends Task {
- private String from;
- private String mailhost = "localhost";
- private int mailport = MailMessage.DEFAULT_PORT;
- private String message;
- private String toList;
- private String subject;
- private Vector files = new Vector();
- private boolean includefilenames;
- /**
- * failure flag
- */
- private boolean failOnError = true;
-
-
- /** Creates new SendEmail */
- public SendEmail() {
- }
-
- /**
- * Sets the toList parameter of this build task.
- *
- * @param toList Comma-separated list of email recipient addreses.
- */
- public void setToList(String toList) {
- this.toList = toList;
- }
-
- /**
- * Sets the from parameter of this build task.
- *
- * @param from Email address of sender.
- */
- public void setFrom(String from) {
- this.from = from;
- }
-
- /**
- * Sets the mailhost parameter of this build task.
- *
- * @param mailhost Mail host name.
- */
- public void setMailhost(String mailhost) {
- this.mailhost = mailhost;
- }
-
+public class SendEmail extends EmailTask
+{
/**
* Sets the mailport parameter of this build task.
* @param value mail port name.
- */
- public void setMailport(Integer value){
- this.mailport = value.intValue();
- }
-
- /**
- * Sets the message parameter of this build task.
- *
- * @param message Message body of this email.
- */
- public void setMessage(String message) {
- this.message = message;
- }
-
- /**
- * Sets the subject parameter of this build task.
- *
- * @param subject Subject of this email.
- */
- public void setSubject(String subject) {
- this.subject = subject;
- }
-
- /**
- * Sets the file parameter of this build task.
- *
- * @param filenames Filenames to include as the message body of this
email.
- */
- public void setFiles(String filenames) {
- StringTokenizer t = new StringTokenizer(filenames, ", ");
-
- while (t.hasMoreTokens()) {
- files.addElement(project.resolveFile(t.nextToken()));
- }
- }
-
- /**
- * Sets Includefilenames attribute
- *
- * @param includefilenames Set to true if file names are to be included.
- * @since 1.5
- */
- public void setIncludefilenames(boolean includefilenames) {
- this.includefilenames = includefilenames;
- }
-
- /**
- * Sets the FailOnError attribute of the MimeMail object
*
- * @param failOnError The new FailOnError value
- * @since 1.5
+ * @deprecated Use [EMAIL PROTECTED] #setMailport(int)} instead.
*/
- public void setFailOnError(boolean failOnError) {
- this.failOnError = failOnError;
+ public void setMailport( Integer value )
+ {
+ setMailport( value.intValue() );
}
-
- /**
- * Executes this build task.
- *
- * @throws BuildException if there is an error during task execution.
- */
- public void execute() throws BuildException {
- try {
- MailMessage mailMessage = new MailMessage(mailhost);
- mailMessage.setPort(mailport);
-
- if (from != null) {
- mailMessage.from(from);
- } else {
- throw new BuildException("Attribute \"from\" is required.");
- }
-
- if (toList != null) {
- StringTokenizer t = new StringTokenizer(toList, ", ", false);
-
- while (t.hasMoreTokens()) {
- mailMessage.to(t.nextToken());
- }
- } else {
- throw new BuildException("Attribute \"toList\" is
required.");
- }
-
- if (subject != null) {
- mailMessage.setSubject(subject);
- }
-
- if (!files.isEmpty()) {
- PrintStream out = mailMessage.getPrintStream();
-
- for (Enumeration e = files.elements(); e.hasMoreElements();
) {
- File file = (File)e.nextElement();
-
- if (file.exists() && file.canRead()) {
- int bufsize = 1024;
- int length;
- byte[] buf = new byte[bufsize];
- if (includefilenames) {
- String filename = file.getName();
- int filenamelength = filename.length();
- out.println(filename);
- for (int star=0; star < filenamelength; star++) {
- out.print('=');
- }
- out.println();
- }
- BufferedInputStream in = null;
- try {
- in = new BufferedInputStream(
- new FileInputStream(file), bufsize);
- while ((length = in.read(buf, 0, bufsize)) !=
-1) {
- out.write(buf, 0, length);
- }
- if (includefilenames) {
- out.println();
- }
- } finally {
- if (in != null) {
- try {
- in.close();
- } catch (IOException ioe) {}
- }
- }
-
- } else {
- throw new BuildException("File \"" + file.getName()
- + "\" does not exist or is not readable.");
- }
- }
- } else if (message != null) {
- PrintStream out = mailMessage.getPrintStream();
- out.print(message);
- } else {
- throw new BuildException("Attribute \"file\" or \"message\"
is required.");
- }
-
- log("Sending email");
- mailMessage.sendAndClose();
- } catch (IOException ioe) {
- String err="IO error sending mail: "+ioe.toString();
- if (!failOnError || ioe instanceof ErrorInQuitException) {
- log(err, Project.MSG_ERR);
- } else {
- throw new BuildException(err,ioe,location);
- }
- }
- }
-
}
1.108 +1 -1
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/defaults.properties
Index: defaults.properties
===================================================================
RCS file:
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/defaults.properties,v
retrieving revision 1.107
retrieving revision 1.108
diff -u -r1.107 -r1.108
--- defaults.properties 31 Jan 2002 19:47:40 -0000 1.107
+++ defaults.properties 5 Feb 2002 09:32:47 -0000 1.108
@@ -38,7 +38,7 @@
execon=org.apache.tools.ant.taskdefs.ExecuteOn
antcall=org.apache.tools.ant.taskdefs.CallTarget
sql=org.apache.tools.ant.taskdefs.SQLExec
-mail=org.apache.tools.ant.taskdefs.SendEmail
+mail=org.apache.tools.ant.taskdefs.email.EmailTask
fail=org.apache.tools.ant.taskdefs.Exit
war=org.apache.tools.ant.taskdefs.War
uptodate=org.apache.tools.ant.taskdefs.UpToDate
1.1
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/email/EmailAddress.java
Index: EmailAddress.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs.email;
/**
* Holds an email address.
*
* @author [EMAIL PROTECTED] Rob Oxspring
* @since 1.5
*/
public class EmailAddress
{
private String name;
private String address;
/** Creates an empty email address
*/
public EmailAddress()
{
}
/** Creates a new email address based on the given string
* @param address the email address
*/
public EmailAddress( String address )
{
this.address = address;
}
/** sets the personal / display name of the address
* @param name the display name
*/
public void setName( String name )
{
this.name = name;
}
/** sets the email address
* @param address the actual email address
*/
public void setAddress( String address )
{
this.address = address;
}
/** Constructs a string "name <address>" or "address"
* @return a string representation of the address
*/
public String toString()
{
if( name == null )
{
return address;
}
else
{
return name + " <" + address + ">";
}
}
/** returns the address
* @return the address part
*/
public String getAddress()
{
return address;
}
/** returns the display name
* @return the display name part
*/
public String getName()
{
return name;
}
}
1.1
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/email/EmailTask.java
Index: EmailTask.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2000-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs.email;
// Ant imports
import java.io.File;
import java.util.Enumeration;
import java.util.StringTokenizer;
import java.util.Vector;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.types.EnumeratedAttribute;
import org.apache.tools.ant.types.FileSet;
/**
* A task to send SMTP email. This is a refactoring of the SendMail and
MimeMail
* tasks such that both are within a single task. The functionality of
SendMail can
* be found in [EMAIL PROTECTED]
org.apache.tools.ant.taskdefs.email.PlainMailer PlainMailer},
* MimeMail in [EMAIL PROTECTED]
org.apache.tools.ant.taskdefs.email.MimeMailer MimeMailer},
* and a new intermediate UU format.
* [EMAIL PROTECTED] org.apache.tools.ant.taskdefs.email.UUMailer UUMailer}.
*
* @author Magesh Umasankar
* @author [EMAIL PROTECTED]
* @author [EMAIL PROTECTED] steve loughran
* @author [EMAIL PROTECTED] Erik Hatcher
* @author [EMAIL PROTECTED] Paulo Gaspar
* @author [EMAIL PROTECTED] Rob Oxspring
* @created 10 Dec 2001
* @since 1.5
*/
public class EmailTask
extends Task
{
/** Constant to show that the best available mailer should be used.
*/
public final static String AUTO = "auto";
/** Constant to allow the Mime mailer to be requested
*/
public final static String MIME = "mime";
/** Constant to allow the UU mailer to be requested
*/
public final static String UU = "uu";
/** Constant to allow the plaintext mailer to be requested
*/
public final static String PLAIN = "plain";
/** Enumerates the encoding constants
*/
public static class Encoding extends EnumeratedAttribute
{
/** finds the valid encoding values
* @return a list of valid entries
*/
public String[] getValues()
{
return new String[]
{AUTO, MIME, UU, PLAIN};
}
}
private String encoding = AUTO;
/**
* host running SMTP
*/
private String host = "localhost";
private int port = 25;
/**
* subject field
*/
private String subject = null;
/**
* any text
*/
private Message message = null;
/** failure flag */
private boolean failOnError = true;
private boolean includeFileNames = false;
private boolean simpleMessage = false;
private String messageMimeType = null;
/**
* sender
*/
private EmailAddress from = null;
/**
* TO recipients
*/
private Vector toList = new Vector();
/**
* CC (Carbon Copy) recipients
*/
private Vector ccList = new Vector();
/**
* BCC (Blind Carbon Copy) recipients
*/
private Vector bccList = new Vector();
/**
* file list
*/
private Vector files = new Vector();
private Vector filesets = new Vector();
/** Allows the build writer to choose the preferred encoding method
* @param encoding The encoding (one of AUTO,MIME,UU,PLAIN)
*/
public void setEncoding( Encoding encoding )
{
this.encoding = encoding.getValue();
}
/** Sets the mail server port
* @see setPort(int)
* @param port The port to use
*/
public void setMailport( int port )
{
this.port = port;
}
/** Sets the host
* @see setHost()
* @param host The host to connect to
*/
public void setMailhost( String host )
{
this.host = host;
}
/** Sets the subject line of the email
*
* @param subject Subject of this email.
*/
public void setSubject( String subject )
{
this.subject = subject;
}
/** Shorthand method to set the message
* @param message Message body of this email.
*/
public void setMessage( String message )
{
if( this.message != null )
{
throw new BuildException( "Only one message can be sent in an
email" );
}
this.message = new Message( message );
}
/** Shorthand method to set the message from a file
* @param file The file from which to take the message
*/
public void setMessageFile( File file )
{
if( this.message != null )
{
throw new BuildException( "Only one message can be sent in an
email" );
}
this.message = new Message( file );
}
/** Shorthand method to set type of the text message, text/plain by
default but text/html
* or text/xml is quite feasible.
*
* @param type The new MessageMimeType value
*/
public void setMessageMimeType( String type )
{
this.messageMimeType = type;
}
/** Add a message elemnt
* @param message The message object
* @throws BuildException if a message has already been added
*/
public void addMessage( Message message )
throws BuildException
{
if( this.message != null )
{
throw new BuildException( "Only one message can be sent in an
email" );
}
this.message = message;
}
/** Adds a from address element
* @param address The address to send from
*/
public void addFrom( EmailAddress address )
{
if( this.from != null )
{
throw new BuildException( "Emails can only be from one address" );
}
this.from = address;
}
/** Shorthand to set the from address element
*
* @param address The address to send mail from
*/
public void setFrom( String address )
{
if( this.from != null )
{
throw new BuildException( "Emails can only be from one address" );
}
this.from = new EmailAddress( address );
}
/** Adds a to address element
* @param address An email address
*/
public void addTo( EmailAddress address )
{
toList.addElement( address );
}
/** Adds "to" address elements
*
*
* @param list Comma separated list of addresses
*/
public void setToList( String list )
{
StringTokenizer tokens = new StringTokenizer( list, "," );
while( tokens.hasMoreTokens() )
{
toList.addElement( new EmailAddress( tokens.nextToken() ) );
}
}
/** Adds "cc" address element
* @param address The email address
*/
public void addCc( EmailAddress address )
{
ccList.addElement( address );
}
/** Adds "cc" address elements
*
*
* @param list Comma separated list of addresses
*/
public void setCcList( String list )
{
StringTokenizer tokens = new StringTokenizer( list, "," );
while( tokens.hasMoreTokens() )
{
ccList.addElement( new EmailAddress( tokens.nextToken() ) );
}
}
/** Adds "bcc" address elements
* @param address The email address
*/
public void addBcc( EmailAddress address )
{
bccList.addElement( address );
}
/** Adds "bcc" address elements
*
*
* @param list comma separated list of addresses
*/
public void setBccList( String list )
{
StringTokenizer tokens = new StringTokenizer( list, "," );
while( tokens.hasMoreTokens() )
{
bccList.addElement( new EmailAddress( tokens.nextToken() ) );
}
}
/** Indicates whether BuildExceptions should be passed back to the core
*
* @param failOnError The new FailOnError value
*/
public void setFailOnError( boolean failOnError )
{
this.failOnError = failOnError;
}
/** Adds a list of files to be attached
*
* @param filenames Comma separated list of files
*/
public void setFiles( String filenames )
{
StringTokenizer t = new StringTokenizer( filenames, ", " );
while( t.hasMoreTokens() )
{
files.addElement( project.resolveFile( t.nextToken() ) );
}
}
/** Adds a set of files (nested fileset attribute).
* @param fs The fileset
*/
public void addFileset( FileSet fs )
{
filesets.addElement( fs );
}
/** Sets Includefilenames attribute
*
* @param includeFileNames Whether to include filenames in the text of
the message
*/
public void setIncludefilenames( boolean includeFileNames )
{
this.includeFileNames = includeFileNames;
}
/** Identifies whether file names should be included
* @return Identifies whether file names should be included
*/
public boolean getIncludeFileNames()
{
return includeFileNames;
}
/** Sends an email
*/
public void execute()
{
try
{
Mailer mailer = null;
// prepare for the auto select mechanism
boolean autoFound = false;
// try MIME format
if( encoding.equals( MIME ) || ( encoding.equals( AUTO ) &&
!autoFound ) )
{
try
{
mailer = (Mailer)getClass().forName(
"org.apache.tools.ant.taskdefs.email.MimeMailer" ).newInstance();
autoFound = true;
log( "Using MIME mail", Project.MSG_VERBOSE );
}
catch( Throwable e )
{
log( "Failed to initialise MIME mail", Project.MSG_WARN );
}
}
// try UU format
if( encoding.equals( UU ) || ( encoding.equals( AUTO ) &&
!autoFound ) )
{
try
{
mailer = (Mailer)getClass().forName(
"org.apache.tools.ant.taskdefs.email.UUMailer" ).newInstance();
autoFound = true;
log( "Using UU mail", Project.MSG_VERBOSE );
}
catch( Throwable e )
{
log( "Failed to initialise UU mail", Project.MSG_WARN );
}
}
// try plain format
if( encoding.equals( PLAIN ) || ( encoding.equals( AUTO ) &&
!autoFound ) )
{
mailer = new PlainMailer();
autoFound = true;
log( "Using plain mail", Project.MSG_VERBOSE );
}
// a valid mailer must be present by now
if( mailer == null )
{
throw new BuildException( "Failed to initialise encoding: " +
encoding );
}
// a valid message is required
if( message == null )
{
throw new BuildException( "A message is required" );
}
// an address to send from is required
if( from == null || from.getAddress() == null )
{
throw new BuildException( "A from element is required" );
}
// at least one address to send to/cc/bcc is required
if( toList.isEmpty() && ccList.isEmpty() && bccList.isEmpty() )
{
throw new BuildException( "At least one of to,cc or bcc must
be supplied" );
}
// set the mimetype if not done already (and required)
if( messageMimeType != null )
{
if( message.isMimeTypeSpecified() )
{
throw new BuildException( "The mime type can only be
specified in one location" );
}
else
{
message.setMimeType( messageMimeType );
}
}
// identify which files should be attached
Enumeration e = filesets.elements();
while( e.hasMoreElements() )
{
FileSet fs = (FileSet)e.nextElement();
DirectoryScanner ds = fs.getDirectoryScanner( project );
String[] includedFiles = ds.getIncludedFiles();
File baseDir = ds.getBasedir();
for( int j = 0; j < includedFiles.length; ++j )
{
File file = new File( baseDir, includedFiles[ j ] );
files.addElement( file );
}
}
// let the user know what's going to happen
log( "Sending email: " + subject, Project.MSG_INFO );
log( "From " + from, Project.MSG_VERBOSE );
log( "To " + toList, Project.MSG_VERBOSE );
log( "Cc " + ccList, Project.MSG_VERBOSE );
log( "Bcc " + bccList, Project.MSG_VERBOSE );
// pass the params to the mailer
mailer.setHost( host );
mailer.setPort( port );
mailer.setMessage( message );
mailer.setFrom( from );
mailer.setToList( toList );
mailer.setCcList( ccList );
mailer.setBccList( bccList );
mailer.setFiles( files );
mailer.setSubject( subject );
mailer.setTask( this );
mailer.setIncludeFileNames( includeFileNames );
// send the email
mailer.send();
// let the user know what happened
int count = files.size();
log( "Sent email with " + count + " attachment" + ( count ==
1?"":"s" ), Project.MSG_INFO );
}
catch( BuildException e )
{
log( "Failed to send email", Project.MSG_WARN );
if( failOnError )
{
throw e;
}
}
}
}
1.1
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/email/Mailer.java
Index: Mailer.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs.email;
import java.util.Vector;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
/**
* Base class for the various emailing implementations.
*
* @author [EMAIL PROTECTED] Rob Oxspring
* @since 1.5
*/
public abstract class Mailer
{
protected String host = null;
protected int port = -1;
protected Message message;
protected EmailAddress from;
protected Vector toList = null;
protected Vector ccList = null;
protected Vector bccList = null;
protected Vector files = null;
protected String subject = null;
protected Task task;
protected boolean includeFileNames = false;
/** sets the mail server
* @param host
*/
public void setHost( String host )
{
this.host = host;
}
/** sets the smtp port
* @param port
*/
public void setPort( int port )
{
this.port = port;
}
/** sets the message
* @param m
*/
public void setMessage( Message m )
{
this.message = m;
}
/** sets the address to send from
* @param from
*/
public void setFrom( EmailAddress from )
{
this.from = from;
}
/** set the to addresses
* @param list
*/
public void setToList( Vector list )
{
this.toList = list;
}
/** sets the cc addresses
* @param list
*/
public void setCcList( Vector list )
{
this.ccList = list;
}
/** sets the bcc addresses
* @param list
*/
public void setBccList( Vector list )
{
this.bccList = list;
}
/** sets the files to attach
* @param files
*/
public void setFiles( Vector files )
{
this.files = files;
}
/** sets the subject
* @param subject
*/
public void setSubject( String subject )
{
this.subject = subject;
}
/** sets the owning task
* @param task
*/
public void setTask( Task task )
{
this.task = task;
}
/** indicates whether filenames should be listed in the body
* @param b
*/
public void setIncludeFileNames( boolean b )
{
this.includeFileNames = b;
}
/** This method should send the email
* @throws BuildException
*/
public abstract void send()
throws BuildException;
}
1.1
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/email/Message.java
Index: Message.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs.email;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintStream;
/**
* Class representing an email message.
*
* @author [EMAIL PROTECTED] Rob Oxspring
* @since 1.5
*/
public class Message
{
private File messageSource = null;
private StringBuffer buffer = new StringBuffer();
private String mimeType = "text/plain";
private boolean specified = false;
/** creates a new empty message
*/
public Message()
{
}
/** Creates a new message based on the given string
* @param text the message
*/
public Message( String text )
{
addText( text );
}
/** Creates a new message using the contents of the given file.
* @param file the source of the message
*/
public Message( File file )
{
messageSource = file;
}
/** Adds a textual part of the message
* @param text some text to add
*/
public void addText( String text )
{
buffer.append( text );
}
/** Sets the source file of the message
* @param src the source of the message
*/
public void setSrc( File src )
{
this.messageSource = src;
}
/** Sets the content type for the message
* @param mimeType a mime type e.g. "text/plain"
*/
public void setMimeType( String mimeType )
{
this.mimeType = mimeType;
specified = true;
}
/** Returns the content type
* @return the mime type
*/
public String getMimeType()
{
return mimeType;
}
/** prints the message onto an output stream
* @param out The print stream to write to
* @throws IOException if an error occurs
*/
public void print( PrintStream out )
throws IOException
{
if( messageSource != null )
{
// Read message from a file
FileReader freader = new FileReader( messageSource );
try
{
BufferedReader in = new BufferedReader( freader );
String line = null;
while( ( line = in.readLine() ) != null )
{
out.println( line );
}
}
finally {
freader.close();
}
}
else
{
out.println( buffer );
}
}
/** returns true iff the mimeType has been set.
* @return false if the default value is in use
*/
public boolean isMimeTypeSpecified()
{
return specified;
}
}
1.1
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/email/MimeMailer.java
Index: MimeMailer.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs.email;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Vector;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.apache.tools.ant.BuildException;
/**
* Uses the JavaMail classes to send Mime format email.
*
* @author [EMAIL PROTECTED] Rob Oxspring
* @since 1.5
*/
public class MimeMailer
extends Mailer
{
/** Sends the email
*/
public void send()
{
try
{
Properties props = new Properties();
props.put( "mail.smtp.host", host );
props.put( "mail.smtp.port", String.valueOf( port ) );
//Aside, the JDK is clearly unaware of the scottish 'session',
which
//involves excessive quantities of alcohol :-)
Session sesh = Session.getDefaultInstance( props, null );
//create the message
MimeMessage msg = new MimeMessage( sesh );
MimeMultipart attachments = new MimeMultipart();
//set the sender
if( from.getName() == null )
{
msg.setFrom( new InternetAddress( from.getAddress() ) );
}
else
{
msg.setFrom( new InternetAddress( from.getAddress(),
from.getName() ) );
}
msg.setRecipients( Message.RecipientType.TO, internetAddresses(
toList ) );
msg.setRecipients( Message.RecipientType.CC, internetAddresses(
ccList ) );
msg.setRecipients( Message.RecipientType.BCC, internetAddresses(
bccList ) );
if( subject != null )
{
msg.setSubject( subject );
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream out = new PrintStream( baos );
message.print( out );
out.close();
MimeBodyPart textbody = new MimeBodyPart();
textbody.setContent( baos.toString(), message.getMimeType() );
attachments.addBodyPart( textbody );
Enumeration e = files.elements();
while( e.hasMoreElements() )
{
File file = (File)e.nextElement();
MimeBodyPart body;
body = new MimeBodyPart();
if( !file.exists() || !file.canRead() )
{
throw new BuildException( "File \"" +
file.getAbsolutePath()
+ "\" does not exist or is not
readable." );
}
FileDataSource fileData = new FileDataSource( file );
DataHandler fileDataHandler = new DataHandler( fileData );
body.setDataHandler( fileDataHandler );
body.setFileName( file.getName() );
attachments.addBodyPart( body );
}
msg.setContent( attachments );
Transport.send( msg );
}
catch( MessagingException e )
{
throw new BuildException( "Problem while sending mime mail:", e );
}
catch( IOException e )
{
throw new BuildException( "Problem while sending mime mail:", e );
}
}
private static InternetAddress[] internetAddresses( Vector list )
throws AddressException, UnsupportedEncodingException
{
InternetAddress addrs[] = new InternetAddress[ list.size() ];
for( int i = 0; i < list.size(); ++i )
{
EmailAddress addr = (EmailAddress)list.elementAt( i );
if( addr.getName() == null )
{
addrs[ i ] = new InternetAddress( addr.getAddress() );
}
else
{
addrs[ i ] = new InternetAddress( addr.getAddress(),
addr.getName() );
}
}
return addrs;
}
}
1.1
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/email/PlainMailer.java
Index: PlainMailer.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs.email;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Enumeration;
import org.apache.tools.ant.BuildException;
import org.apache.tools.mail.MailMessage;
/**
* Class responsible for sending email through raw protocol methods.
*
* @author [EMAIL PROTECTED] Rob Oxspring
* @since 1.5
*/
public class PlainMailer
extends Mailer
{
/** Sends the email using the apache [EMAIL PROTECTED]
org.apache.tools.mail.MailMessage MailMessage} class.
*/
public void send()
{
try
{
MailMessage mailMessage = new MailMessage( host );
mailMessage.setPort( port );
mailMessage.from( from.toString() );
Enumeration e;
e = toList.elements();
while( e.hasMoreElements() )
{
mailMessage.to( e.nextElement().toString() );
}
e = ccList.elements();
while( e.hasMoreElements() )
{
mailMessage.cc( e.nextElement().toString() );
}
e = bccList.elements();
while( e.hasMoreElements() )
{
mailMessage.bcc( e.nextElement().toString() );
}
if( subject != null )
{
mailMessage.setSubject( subject );
}
mailMessage.setHeader( "Content-Type", message.getMimeType() );
PrintStream out = mailMessage.getPrintStream();
message.print( out );
e = files.elements();
while( e.hasMoreElements() )
{
File file = (File)e.nextElement();
attach( file, out );
}
mailMessage.sendAndClose();
}
catch( IOException ioe )
{
throw new BuildException( "IO error sending mail", ioe );
}
}
/** Attaches a file to this email
* @param file The file to attache
* @param out The message stream to add to
* @throws IOException if errors occur
*/
protected void attach( File file, PrintStream out )
throws IOException
{
if( !file.exists() || !file.canRead() )
{
throw new BuildException( "File \"" + file.getName()
+ "\" does not exist or is not
readable." );
}
if( includeFileNames )
{
out.println();
String filename = file.getName();
int filenamelength = filename.length();
out.println( filename );
for( int star = 0; star < filenamelength; star++ )
{
out.print( '=' );
}
out.println();
}
int length;
byte[] buf = new byte[ 1024 ];
FileInputStream finstr = new FileInputStream( file );
try
{
BufferedInputStream in = new BufferedInputStream( finstr,
buf.length );
while( ( length = in.read( buf ) ) != -1 )
{
out.write( buf, 0, length );
}
}
finally
{
finstr.close();
}
}
}
1.1
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/email/UUMailer.java
Index: UUMailer.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Ant", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Group.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.tools.ant.taskdefs.email;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.PrintStream;
import org.apache.tools.ant.BuildException;
import sun.misc.UUEncoder;
/**
* An emailer that uuencodes attachments.
*
* @author [EMAIL PROTECTED] Rob Oxspring
* @since 1.5
*/
class UUMailer
extends PlainMailer
{
protected void attach( File file, PrintStream out )
throws IOException
{
if( !file.exists() || !file.canRead() )
{
throw new BuildException( "File \"" + file.getName()
+ "\" does not exist or is not
readable." );
}
FileInputStream finstr = new FileInputStream( file );
try
{
BufferedInputStream in = new BufferedInputStream( finstr );
UUEncoder encoder = new UUEncoder( file.getName() );
encoder.encode( in, out );
}
finally
{
finstr.close();
}
}
}
1.5 +12 -360
jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/net/MimeMail.java
Index: MimeMail.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/net/MimeMail.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- MimeMail.java 14 Jan 2002 00:59:41 -0000 1.4
+++ MimeMail.java 5 Feb 2002 09:32:48 -0000 1.5
@@ -1,7 +1,7 @@
/*
* The Apache Software License, Version 1.1
*
- * Copyright (c) 2001 The Apache Software Foundation. All rights
+ * Copyright (c) 2001-2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -51,46 +51,10 @@
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
-
package org.apache.tools.ant.taskdefs.optional.net;
-
-// Standard SDK imports
-import java.util.Properties;
-import java.util.Vector;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-
-//imported for the mail api
-
-import javax.mail.Session;
-import javax.mail.Message;
-
-
-
-import javax.mail.MessagingException;
-import javax.mail.Transport;
-import javax.mail.internet.InternetAddress;
-import javax.mail.internet.MimeMessage;
-import javax.mail.internet.MimeBodyPart;
-import javax.mail.internet.MimeMultipart;
-import javax.mail.internet.AddressException;
-
-//imported for data source and handler
-import javax.activation.DataHandler;
-import javax.activation.FileDataSource;
-
-// Ant imports
-import org.apache.tools.ant.Task;
import org.apache.tools.ant.BuildException;
-
-import org.apache.tools.ant.DirectoryScanner;
-import org.apache.tools.ant.Project;
-
-import org.apache.tools.ant.types.FileSet;
-
-
+import org.apache.tools.ant.taskdefs.email.EmailTask;
/**
* A task to send SMTP email. This version has near identical syntax to
@@ -98,337 +62,25 @@
* activation.jar to compile and execute, which puts it clearly into the
* very optional category.
*
+ * @deprecated Use [EMAIL PROTECTED] EmailTask} instead.
+ *
* @author [EMAIL PROTECTED]
* @author [EMAIL PROTECTED] steve loughran
* @author [EMAIL PROTECTED] Erik Hatcher
* @author [EMAIL PROTECTED] Paulo Gaspar
* @created 01 May 2001
*/
-public class MimeMail extends Task {
- /**
- * failure flag
- */
- private boolean failOnError = true;
-
- /**
- * sender
- */
- private String from = null;
-
- /**
- * host running SMTP
- */
- private String mailhost = "localhost";
-
- /**
- * any text
- */
- private String message = null;
-
-
- /**
- * message file (mutually exclusive from message)
- */
- private File messageFile = null;
-
- /**
- * TO recipients
- */
- private String toList = null;
-
- /**
- * CC (Carbon Copy) recipients
- */
- protected String ccList = null;
-
- /**
- * BCC (Blind Carbon Copy) recipients
- */
- protected String bccList = null;
-
- /**
- * subject field
- */
- private String subject = null;
-
- /**
- * file list
- */
- private Vector filesets = new Vector();
-
- /**
- * type of the text message, plaintext by default but text/html or
- * text/xml is quite feasible
- */
- private String messageMimeType = "text/plain";
-
- /**
- * Creates new instance
- */
- public MimeMail() {
- }
-
-
- /**
- * Sets the FailOnError attribute of the MimeMail object
- *
- * @param failOnError The new FailOnError value
- */
- public void setFailOnError(boolean failOnError) {
- this.failOnError = failOnError;
- }
-
- /**
- * Adds a set of files (nested fileset attribute).
- */
- public void addFileset(FileSet set) {
- filesets.addElement(set);
- }
-
- /**
- * Sets the toList parameter of this build task.
- *
- * @param toList Comma-separated list of email recipient addreses.
- */
- public void setToList(String toList) {
- this.toList = toList;
- }
-
- /**
- * Sets the toList parameter of this build task.
- *
- * @param toList Comma-separated list of email recipient addreses.
- */
- public void setCcList(String ccList) {
- this.ccList = ccList;
- }
-
- /**
- * Sets the toList parameter of this build task.
- *
- * @param toList Comma-separated list of email recipient addreses.
- */
- public void setBccList(String bccList) {
- this.bccList = bccList;
- }
-
-
- /**
- * Sets the "from" parameter of this build task.
- *
- * @param from Email address of sender.
- */
- public void setFrom(String from) {
- this.from = from;
- }
-
-
- /**
- * Sets the mailhost parameter of this build task.
- *
- * @param mailhost Mail host name.
- */
- public void setMailhost(String mailhost) {
- this.mailhost = mailhost;
- }
-
-
- /**
- * Sets the message parameter of this build task.
- *
- * @param message Message body of this email.
- */
- public void setMessage(String message) {
- this.message = message;
- }
-
- public void setMessageFile(File messageFile) {
- this.messageFile = messageFile;
- }
-
-
+public class MimeMail extends EmailTask
+{
/**
- * set type of the text message, plaintext by default but text/html
- * or text/xml is quite feasible
+ * Executes this build task.
*
- * @param type The new MessageMimeType value
- */
- public void setMessageMimeType(String type) {
- this.messageMimeType = type;
- }
-
- /**
- * Sets the subject parameter of this build task.
- *
- * @param subject Subject of this email.
- */
- public void setSubject(String subject) {
- this.subject = subject;
- }
-
-
- /**
- * verify parameters
- *
- * @throws BuildException if something is invalid
- */
- public void validate() {
- if (from == null) {
- throw new BuildException("Attribute \"from\" is required.");
- }
-
- if ((toList == null) && (ccList == null) && (bccList == null)) {
- throw new BuildException("Attribute \"toList\", \"ccList\" or
\"bccList\" is required.");
- }
-
- if (message == null && filesets.isEmpty() && messageFile == null) {
- throw new BuildException("FileSet, \"message\", or
\"messageFile\" is required.");
- }
-
- if (message != null && messageFile != null) {
- throw new BuildException("Only one of \"message\" or
\"messageFile\" may be specified.");
- }
- }
-
-
- /**
- * Executes this build task. throws org.apache.tools.ant.BuildException
- * if there is an error during task execution.
- *
- * @exception BuildException Description of Exception
+ * @exception BuildException On error.
*/
public void execute()
- throws BuildException {
- try {
- validate();
- doMail();
- }
- catch (Exception e) {
- if (failOnError) {
- throw new BuildException(e);
- }
- else {
- String text = e.toString();
- log(text, Project.MSG_ERR);
- }
- }
- }
-
-
- // helper method to add recipients
- private static void addRecipients( MimeMessage msg,
- Message.RecipientType recipType,
- String addrUserName,
- String addrList
- ) throws MessagingException,
BuildException {
- if ((null == addrList) || (addrList.trim().length() <= 0)) {
- return;
- }
-
- try {
- InternetAddress[] addrArray = InternetAddress.parse(addrList);
-
- if ((null == addrArray) || (0 == addrArray.length)) {
- throw new BuildException("Empty " + addrUserName + "
recipients list was specified");
- }
-
- msg.setRecipients(recipType, addrArray);
- }
- catch(AddressException ae) {
- throw new BuildException("Invalid " + addrUserName + " recipient
list");
- }
- }
-
- /**
- * here is where the mail is sent
- *
- * @exception MessagingException Description of Exception
- * @exception AddressException Description of Exception
- * @exception BuildException Description of Exception
- */
- public void doMail()
- throws MessagingException, AddressException, BuildException {
- Properties props = new Properties();
- props.put("mail.smtp.host", mailhost);
-
- //Aside, the JDK is clearly unaware of the scottish 'session', which
- //involves excessive quantities of alcohol :-)
- Session sesh = Session.getDefaultInstance(props, null);
-
- //create the message
- MimeMessage msg = new MimeMessage(sesh);
-
- //set the sender
- log("message sender: " + from, Project.MSG_VERBOSE);
- msg.setFrom(new InternetAddress(from));
-
- // add recipient lists
- addRecipients(msg, Message.RecipientType.TO, "To", toList);
- addRecipients(msg, Message.RecipientType.CC, "Cc", ccList);
- addRecipients(msg, Message.RecipientType.BCC, "Bcc", bccList);
-
- if (subject != null) {
- log("subject: " + subject, Project.MSG_VERBOSE);
- msg.setSubject(subject);
- }
-
- //now the complex bit; adding multiple mime objects. And guessing
- //the file type
- MimeMultipart attachments = new MimeMultipart();
-
- //first a message
- if (messageFile != null) {
- int size = (int)messageFile.length();
- byte data[] = new byte[size];
-
- try {
- FileInputStream inStream = new FileInputStream(messageFile);
- inStream.read(data);
- inStream.close();
- message = new String(data);
- } catch (IOException e) {
- throw new BuildException(e);
- }
- }
-
- if (message != null) {
- MimeBodyPart textbody = new MimeBodyPart();
- textbody.setContent(message, messageMimeType);
- attachments.addBodyPart(textbody);
- }
-
- for (int i = 0; i < filesets.size(); i++)
- {
- FileSet fs = (FileSet) filesets.elementAt(i);
- if (fs != null)
- {
- DirectoryScanner ds = fs.getDirectoryScanner(project);
- String[] dsfiles = ds.getIncludedFiles();
- File baseDir = ds.getBasedir();
-
- for (int j = 0; j < dsfiles.length; j++)
- {
- File file = new File(baseDir, dsfiles[j]);
- MimeBodyPart body;
- body = new MimeBodyPart();
- if (!file.exists() || !file.canRead()) {
- throw new BuildException("File \"" +
file.getAbsolutePath()
- + "\" does not exist or is not readable.");
- }
- log("Attaching " + file.toString()+" - "
+file.length()+" bytes",
- Project.MSG_VERBOSE);
- FileDataSource fileData = new FileDataSource(file);
- DataHandler fileDataHandler = new DataHandler(fileData);
- body.setDataHandler(fileDataHandler);
- body.setFileName(file.getName());
- attachments.addBodyPart(body);
- } // for j
- } // if (fs != null)
- } // for i
-
- msg.setContent(attachments);
- log("sending email ");
- Transport.send(msg);
+ throws BuildException
+ {
+ log( "DEPRECATED - The " + getTaskName() + " task is deprecated.
Use the mail task instead." );
+ super.execute();
}
}
-
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>