You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by bo...@apache.org on 2001/07/11 18:11:51 UTC
cvs commit: jakarta-ant/webpage build.xml
bodewig 01/07/11 09:11:50
Modified: . WHATSNEW build.xml
docs/manual optionaltasklist.html
src/main/org/apache/tools/ant/taskdefs Definer.java
webpage build.xml
Added: docs/manual/OptionalTasks mimemail.html
src/main/org/apache/tools/ant/taskdefs/optional/net
MimeMail.java
Log:
New task mimemail - this task requires JavaMail (and JAF) that's why
it is optional and doesn't replace the existing mail task. The main
improvement is that it supports attachments you can specify via a
fileset.
Submitted by: Glenn Twiggs <gl...@bmc.com>
Steve Loughran <st...@iseran.com>
Erik Hatcher <er...@hatcher.net>
Paulo Gaspar <pa...@krankikom.de>
Revision Changes Path
1.124 +1 -1 jakarta-ant/WHATSNEW
Index: WHATSNEW
===================================================================
RCS file: /home/cvs/jakarta-ant/WHATSNEW,v
retrieving revision 1.123
retrieving revision 1.124
diff -u -r1.123 -r1.124
--- WHATSNEW 2001/07/11 08:03:06 1.123
+++ WHATSNEW 2001/07/11 16:11:21 1.124
@@ -32,7 +32,7 @@
--------------
* New tasks: ear, p4counter, record, cvspass, vsscheckin, vsscheckout,
- typedef, sleep
+ typedef, sleep, mimemail
* Ant now uses JAXP 1.1
1.159 +25 -2 jakarta-ant/build.xml
Index: build.xml
===================================================================
RCS file: /home/cvs/jakarta-ant/build.xml,v
retrieving revision 1.158
retrieving revision 1.159
diff -u -r1.158 -r1.159
--- build.xml 2001/07/11 08:16:41 1.158
+++ build.xml 2001/07/11 16:11:22 1.159
@@ -89,7 +89,7 @@
Check to see what optional dependencies are available
===================================================================
-->
- <target name="check_for_optional_packages">
+ <target name="check_for_optional_packages_1">
<available property="jdk1.2+" classname="java.lang.ThreadLocal" />
<available property="jdk1.3+" classname="java.lang.StrictMath" />
<available property="jdk1.4+" classname="java.lang.CharSequence" />
@@ -147,6 +147,18 @@
<available property="jdepend.present"
classname="jdepend.framework.JDepend"
classpathref="classpath"/>
+ <available property="jaf.present"
+ classname="javax.activation.DataHandler"
+ classpathref="classpath"/>
+
+ </target>
+
+ <target name="check_for_optional_packages"
+ depends="check_for_optional_packages_1"
+ if="jaf.present">
+ <available property="javamail.complete"
+ classname="javax.mail.Transport"
+ classpathref="classpath"/>
</target>
@@ -201,7 +213,9 @@
<exclude name="${optional.package}/ejb/IPlanet*.java" unless="jdk1.2+" />
<exclude name="${optional.package}/Javah.java" unless="jdk1.2+" />
<exclude name="${optional.package}/junit/*" unless="junit.present" />
- <exclude name="${optional.package}/net/*.java" unless="netcomp.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" />
<exclude name="${optional.package}/ANTLR.java" unless="antlr.present" />
<exclude name="${optional.package}/ide/VAJ*.java" unless="vaj.present" />
@@ -697,4 +711,13 @@
<antcall target="dist-lite"/>
</target>
+ <!--
+ ===================================================================
+ Creates the Ant website
+ ===================================================================
+ -->
+ <target name="website"
+ description="--> creates the Ant website">
+ <ant dir="webpage" target="docs" />
+ </target>
</project>
1.14 +1 -0 jakarta-ant/docs/manual/optionaltasklist.html
Index: optionaltasklist.html
===================================================================
RCS file: /home/cvs/jakarta-ant/docs/manual/optionaltasklist.html,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
--- optionaltasklist.html 2001/06/01 04:43:02 1.13
+++ optionaltasklist.html 2001/07/11 16:11:31 1.14
@@ -26,6 +26,7 @@
<a href="OptionalTasks/jlink.html">Jlink</a><br>
<a href="OptionalTasks/junit.html">JUnit</a><br>
<a href="OptionalTasks/junitreport.html">JUnitReport</a><br>
+<a href="OptionalTasks/mimemail.html">MimeMail</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.1 jakarta-ant/docs/manual/OptionalTasks/mimemail.html
Index: mimemail.html
===================================================================
<html>
<head>
<meta http-equiv="Content-Language" content="en-us">
<title>Ant User Manual</title>
</head>
<body>
<h2><a name="mimemail">MimeMail</a></h2>
<h3>Description</h3>
<p>Sends SMTP mail with MIME attachments. If no attachments
are needed, use the built-in <a href="http://jakarta.apache.org/ant/manual/CoreTasks/mail.html">Mail</a>
task. <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>
<h3>Parameters</h3>
<table 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">message</td>
<td valign="top">The message body</td>
<td valign="top" align="center" rowspan="2">No, but only one of of 'message' or
'messageFile' may be specified. If not specified, a fileset must be
provided.</td>
</tr>
<tr>
<td valign="top">messageFile</td>
<td valign="top">A filename to read and used as the message body</td>
</tr>
<tr>
<td valign="top">messageMimeType</td>
<td valign="top">MIME type to use for 'message' or 'messageFile' when
attached.</td>
<td align="center" valign="top">No, defaults to "text/plain"</td>
</tr>
<tr>
<td valign="top">tolist</td>
<td valign="top">Comma-separated list of To: recipients</td>
<td valign="top" align="center" rowspan="3">Yes, at least one of 'tolist', 'cclist',
or 'bcclist' must be specified.</td>
</tr>
<tr>
<td valign="top">cclist</td>
<td valign="top">Comma-separated list of CC: recipients</td>
<td valign="top" align="center"> </td>
</tr>
<tr>
<td valign="top">bcclist</td>
<td valign="top">Comma-separated list of BCC: recipients</td>
<td valign="top" align="center"> </td>
</tr>
<tr>
<td valign="top">mailhost</td>
<td valign="top">Host name of the mail server.</td>
<td valign="top" align="center">No, default to "localhost"</td>
</tr>
<tr>
<td valign="top">subject</td>
<td valign="top">Email subject line.</td>
<td valign="top" align="center">No</td>
</tr>
<tr>
<td valign="top">from</td>
<td valign="top">Email address of sender.</td>
<td valign="top" align="center">Yes</td>
</tr>
<tr>
<td valign="top">failonerror</td>
<td valign="top">Stop the build process if an error occurs sending the
e-mail.</td>
<td valign="top" align="center">No, default to "true"</td>
</tr>
</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"
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">
<fileset dir=".">
<include name="dist/*.*"/>
</fileset>
</mimemail>
</pre>
<hr><p align="center">Copyright © 2000,2001 Apache Software Foundation. All rights
Reserved.</p>
</body>
</html>
1.5 +1 -3 jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Definer.java
Index: Definer.java
===================================================================
RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Definer.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- Definer.java 2001/07/10 14:55:35 1.4
+++ Definer.java 2001/07/11 16:11:39 1.5
@@ -96,7 +96,6 @@
throw new BuildException(msg);
}
try {
- ClassLoader loader = null;
AntClassLoader al = null;
if (classpath != null) {
al = new AntClassLoader(project, classpath);
@@ -107,9 +106,8 @@
// task we want to define will never be a Task but always
// be wrapped into a TaskAdapter.
al.addSystemPackageRoot("org.apache.tools.ant");
- loader = al;
- Class c = loader.loadClass(value);
+ Class c = al.loadClass(value);
AntClassLoader.initializeClass(c);
addDefinition(name, c);
} catch (ClassNotFoundException cnfe) {
1.1 jakarta-ant/src/main/org/apache/tools/ant/taskdefs/optional/net/MimeMail.java
Index: MimeMail.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
* Copyright (c) 2001 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 apache@apache.org.
*
* 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.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.Address;
import javax.mail.Session;
import javax.mail.Message;
import javax.mail.BodyPart;
import javax.mail.Multipart;
import javax.mail.SendFailedException;
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.FileScanner;
import org.apache.tools.ant.DirectoryScanner;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.types.EnumeratedAttribute;
import org.apache.tools.ant.types.FileSet;
/**
* A task to send SMTP email. This version has near identical syntax to
* the SendEmail task, but is MIME aware. It also requires Sun's mail.jar and
* activation.jar to compile and execute, which puts it clearly into the
* very optional category.
*
* @author glenn_twiggs@bmc.com
* @author steve_l@iseran.com steve loughran
* @author erik@hatcher.net Erik Hatcher
* @author paulo.gaspar@krankikom.de 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;
}
/**
* set type of the text message, plaintext 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;
}
/**
* 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
*/
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);
}
}
1.6 +9 -24 jakarta-ant/webpage/build.xml
Index: build.xml
===================================================================
RCS file: /home/cvs/jakarta-ant/webpage/build.xml,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- build.xml 2001/04/26 16:10:45 1.5
+++ build.xml 2001/07/11 16:11:47 1.6
@@ -1,9 +1,11 @@
<project name="build-site" default="docs" basedir=".">
<!-- Initialization properties -->
- <property name="project.name" value="ant"/>
- <property name="docs.src" value="./xdocs"/>
- <property name="docs.dest" value="./docs"/>
+ <property name="project.name" value="ant"/>
+ <property name="docs.src" location="xdocs"/>
+ <property name="docs.dest" location="docs"/>
+ <property name="project.file" value="stylesheets/project.xml" />
+ <property name="templ.path" location="xdocs/stylesheets" />
<path id="anakia.classpath">
<fileset dir="../../jakarta-site2/lib">
@@ -32,36 +34,19 @@
<anakia basedir="${docs.src}" destdir="${docs.dest}/"
extension=".html" style="./site.vsl"
- projectFile="stylesheets/project.xml"
+ projectFile="${project.file}"
excludes="**/stylesheets/** faq.xml"
includes="**/*.xml"
lastModifiedCheck="true"
- templatePath="./xdocs/stylesheets">
+ templatePath="${templ.path}">
</anakia>
<anakia basedir="${docs.src}" destdir="${docs.dest}/"
extension=".html" style="./faq.vsl"
- projectFile="stylesheets/project.xml"
+ projectFile="${project.file}"
includes="faq.xml"
lastModifiedCheck="true"
- templatePath="./xdocs/stylesheets">
+ templatePath="${templ.path}">
</anakia>
-
- <!-- In case we have images some day
- <copy todir="${docs.dest}/images" filtering="no">
- <fileset dir="${docs.src}/images">
- <include name="**/*.gif"/>
- <include name="**/*.jpeg"/>
- <include name="**/*.jpg"/>
- </fileset>
- </copy>
- -->
- <!-- In case we have CSS someday
- <copy todir="${docs.dest}" filtering="no">
- <fileset dir="${docs.src}">
- <include name="**/*.css"/>
- </fileset>
- </copy>
- -->
</target>
</project>