git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@267549 13f79535-47bb-0310-9956-ffa450edef68master
@@ -0,0 +1,67 @@ | |||
@ECHO OFF | |||
echo BOOTSTRAPPING ANT DISTRIBUTION | |||
set C=%CLASSPATH%;..\jakarta-tools\projectx-tr2.jar | |||
set SRCDIR=src\main\org\apache\tools\ant | |||
set TMPDIR=tmp | |||
if "%OS%" == "Windows_NT" goto nt | |||
goto windows | |||
:doneOs | |||
rem Delete temp directory if it exists | |||
if exist %TMPDIR%\nul %RMDIRCMD% %TMPDIR% nul | |||
rem make the temp directory | |||
mkdir %TMPDIR% | |||
echo ** COMPILING ANT CLASSES | |||
rem Compile the classes into the temp directory | |||
javac -classpath "%C%" -d %TMPDIR% %SRCDIR%\*.java | |||
rem Reset classpath to include base ant class files | |||
set C=%TMPDIR%;%C% | |||
rem Compile sub classes into the temp directory | |||
javac -classpath "%C%" -d %TMPDIR% %SRCDIR%\taskdefs\*.java | |||
echo ** COPYING REQUIRED FILES | |||
rem Copy all the property/manifest files into the temp directory | |||
%COPYCMD% src\main\org\apache\tools\ant\taskdefs\defaults.properties %TMPDIR%\org\apache\tools\ant\taskdefs | |||
%COPYCMD% src\main\org\apache\tools\ant\parser.properties %TMPDIR%\org\apache\tools\ant | |||
echo ** BUILDING ANT DISTRIBUTION | |||
rem Build the distribution using the newly compiled classes in the temp directory | |||
java -classpath "%C%" org.apache.tools.ant.Main jar %1 %2 %3 %4 %5 | |||
echo ** CLEANING UP BUILD DIRECTORIES | |||
java -classpath "%C%" org.apache.tools.ant.Main clean %1 %2 %3 %4 %5 | |||
rem remove the temp directory | |||
%RMDIRCMD% %TMPDIR% | |||
goto end | |||
rem Set system dependent commands below | |||
:windows | |||
echo ** CONFIGURING COMMANDS FOR WINDOWS 9x SYSTEM | |||
set RMDIRCMD=deltree /Y | |||
set COPYCMD=copy | |||
goto doneOs | |||
:nt | |||
echo ** CONFIGURING COMMANDS FOR NT SYSTEM | |||
set RMDIRCMD=rmdir /s /q | |||
set COPYCMD=copy | |||
goto doneOs | |||
:end | |||
echo ** DONE BOOTSTRAPPING ANT DISTRIBUTION | |||
@@ -0,0 +1,25 @@ | |||
if [ -f $HOME/.antrc ] ; then | |||
. $HOME/.antrc | |||
fi | |||
SRCDIR=src/main/org/apache/tools/ant | |||
CLASSDIR=classes | |||
CLASSPATH=${CLASSPATH}:${JAVA_HOME}/lib/classes.zip:${JAVA_HOME}/lib/tools.jar | |||
CLASSPATH=${CLASSPATH}:../jakarta-tomcat/projectx-tr2.jar:src:${CLASSDIR} | |||
mkdir -p ${CLASSDIR} | |||
export CLASSPATH | |||
echo $CLASSPATH | |||
javac -d ${CLASSDIR} ${SRCDIR}/*.java | |||
javac -d ${CLASSDIR} ${SRCDIR}/taskdefs/*.java | |||
cp src/main/org/apache/tools/ant/taskdefs/defaults.properties ${CLASSDIR}/org/apache/tools/ant/taskdefs | |||
cp src/main/org/apache/tools/ant/parser.properties ${CLASSDIR}/org/apache/tools/ant | |||
java org.apache.tools.ant.Main jar | |||
java org.apache.tools.ant.Main clean | |||
rm -rf ${CLASSDIR} | |||
@@ -0,0 +1,3 @@ | |||
@echo off | |||
REM convience bat file to build with | |||
java -classpath "%CLASSPATH%;..\jakarta-tools\ant.jar;..\jakarta-tools\projectx-tr2.jar" org.apache.tools.ant.Main %1 %2 %3 %4 %5 |
@@ -0,0 +1,14 @@ | |||
#!/bin/sh | |||
ADDL_CLASSPATH=./../jakarta-tools/ant.jar:./../jakarta-tools/projectx-tr2.jar | |||
if [ "$CLASSPATH" != "" ] ; then | |||
CLASSPATH=$CLASSPATH:$ADDL_CLASSPATH | |||
else | |||
CLASSPATH=$ADDL_CLASSPATH | |||
fi | |||
export CLASSPATH | |||
echo Building with classpath $CLASSPATH | |||
java org.apache.tools.ant.Main $* |
@@ -0,0 +1,57 @@ | |||
<!-- Ant own build file --> | |||
<project name="Ant" default="main" basedir="."> | |||
<property name="src.dir" value="src/main"/> | |||
<property name="build.dir" value="build"/> | |||
<property name="dist.dir" value="${user.home}/opt"/> | |||
<property name="classpath" value="lib/projectx-tr2.jar"/> | |||
<property name="manifest" value="src/etc/manifest"/> | |||
<property name="build.compiler" value="classic"/> | |||
<target name="main"> | |||
<mkdir dir="${build.dir}"/> | |||
<javac srcdir="${src.dir}" destdir="${build.dir}" classpath="${classpath}" | |||
debug="on" deprecation="on"/> | |||
</target> | |||
<target name="jar" depends="main"> | |||
<jar jarfile="../ant.jar" basedir="${build.dir}" items="org" manifest="${manifest}"/> | |||
</target> | |||
<target name="dist" depends="main"> | |||
<mkdir dir="${dist.dir}/ant"/> | |||
<mkdir dir="${dist.dir}/ant/lib"/> | |||
<mkdir dir="${dist.dir}/ant/bin"/> | |||
<mkdir dir="${dist.dir}/ant/docs"/> | |||
<jar jarfile="${dist.dir}/ant/lib/ant.jar" basedir="${build.dir}" items="org" manifest="${manifest}"/> | |||
<copyfile src="../projectx-tr2.jar" dest="${dist.dir}/ant/lib/xml.jar"/> | |||
<copyfile src="../moo.jar" dest="${dist.dir}/ant/lib/moo.jar"/> | |||
<copyfile src="build.xml" dest="${dist.dir}/ant/lib/build.xml"/> | |||
<copydir src="src/bin" dest="${dist.dir}/ant/bin"/> | |||
<copydir src="docs" dest="${dist.dir}/ant/docs"/> | |||
<chmod perm="+x" src="${dist.dir}/ant/bin/ant"/> | |||
<chmod perm="+x" src="${dist.dir}/ant/bin/antRun"/> | |||
</target> | |||
<target name="clean"> | |||
<deltree dir="${build.dir}"/> | |||
</target> | |||
<!-- in progress ! --> | |||
<target name="get.snapshot"> | |||
<get src="http://jakarta.apache.org/build/tmp/ant/ant.src.zip" dest="ant-src.zip" /> | |||
<expand src="ant-src.zip" dest="." /> | |||
</target> | |||
<target name="make.snapshot"> | |||
<cvs cvsRoot=":pserver:anoncvs@jakarta.apache.org:/home/cvspublic" | |||
package="jakarta-tools" | |||
dest="." /> | |||
<zip zipfile="/www/jakarta.apache.org/builds/tmp/ant/ant.src.zip" basedir="." items="jakarta-tools"/> | |||
</target> | |||
</project> | |||
@@ -0,0 +1,51 @@ | |||
<html> | |||
<head> | |||
<title>BuildTool Readme</title> | |||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> | |||
</head> | |||
<body bgcolor="#FFFFFF"> | |||
<h1>BuildTool</h1> | |||
<p>BuildTool is a Java based build tool. In theory it is kind of like make without | |||
makes wrinkles.</p> | |||
<h2>Why?</h2> | |||
<p>Why another build tool when there is already make, gnumake, nmake, jam, and | |||
others? Because all of those tools have limitations that its original author | |||
couldn't live with when developming software across multiple platforms. Make | |||
like tools are inherently shell based. They evaluate a set of dependencies and | |||
then execute commands not unlike what you would issue on a shell. This means | |||
that you can easily extend these tools by using or writing any program for the | |||
OS that you are working on. However, this also means that you limit yourself | |||
to the OS, or at least the OS type such as Unix, that you are working on.</p> | |||
<p>Makefiles are inherently evil as well. Anybody who has worked on them for any | |||
time has run into the dreaded tab problem. "Is my command not executing | |||
because I have a space in front of my tab!!!" said the original author | |||
of BuildTool way too many times. Tools like Jam took care of this to a great | |||
degree, but still use yet another format to use and remember.</p> | |||
<p>BuildTool is different. Instead a model where it is extended with shell based | |||
commands, it is extended using Java classes. Instead of writing shell commands, | |||
the configuration files are XML based calling out a target tree where various | |||
tasks get executed. Each task is run by an object which implments a particular | |||
Task interface. </p> | |||
<p>Granted, this removes some of the expressive power that is inherent by being | |||
able to construct a shell command such as `find . -name foo -exec rm {}` but | |||
it gives you the ability to be cross platform. To work anywhere and everywhere.And | |||
hey, if you really need to execute a shell command, BuildTool has an exec rule | |||
that allows different commands to be executed based on the OS that it is executing | |||
on. </p> | |||
<h2>How?</h2> | |||
<p>To get started using BuildTool check out the following topics:</p> | |||
<ul> | |||
<li>Installing BuildTool</li> | |||
<li>Writing a simple BuildFile</li> | |||
<li>Built in Tasks</li> | |||
<li>Writing a new Task</li> | |||
<li>API Documentation</li> | |||
</ul> | |||
<h2>License</h2> | |||
<h2>Feedback</h2> | |||
<p>To provide feedback on this software, please send mail to <a href="mailto:duncan@x180.com">duncan@x180.com</a>.</p> | |||
<hr> | |||
<p>Java is a trademark of Sun Microsystems.</p> | |||
</body> | |||
</html> |
@@ -0,0 +1,52 @@ | |||
#! /bin/sh | |||
if [ -f $HOME/.antrc ] ; then | |||
. $HOME/.antrc | |||
fi | |||
if [ "$ANT_HOME" = "" ] ; then | |||
# try to find ANT | |||
if [ -d /opt/ant ] ; then | |||
ANT_HOME=/opt/ant | |||
fi | |||
if [ -d ${HOME}/opt/ant ] ; then | |||
ANT_HOME=${HOME}/opt/ant | |||
fi | |||
## resolve links - $0 may be a link to ant's home | |||
PRG=$0 | |||
progname=`basename $0` | |||
while [ -h "$PRG" ] ; do | |||
ls=`ls -ld "$PRG"` | |||
link=`expr "$ls" : '.*-> \(.*\)$'` | |||
if expr "$link" : '.*/.*' > /dev/null; then | |||
PRG="$link" | |||
else | |||
PRG="`dirname $PRG`/$link" | |||
fi | |||
done | |||
ANT_HOME=`dirname "$PRG"`/.. | |||
fi | |||
# Allow .antrc to specifiy flags to java cmd | |||
if [ "$JAVACMD" = "" ] ; then | |||
JAVACMD=java | |||
fi | |||
# Use the original tools.jar if available | |||
if [ ! "$JAVA_HOME" = "" ] ; then | |||
CLASSPATH=${JAVA_HOME}/lib/tools.jar:$CLASSPATH | |||
CLASSPATH=${JAVA_HOME}/lib/classes.zip:$CLASSPATH | |||
fi | |||
CLASSPATH=${ANT_HOME}/lib/xml.jar:$CLASSPATH | |||
CLASSPATH=${ANT_HOME}/lib/ant.jar:$CLASSPATH | |||
CLASSPATH=${ANT_HOME}/lib/moo.jar:$CLASSPATH | |||
export CLASSPATH | |||
$JAVACMD -Dant.home=${ANT_HOME} org.apache.tools.ant.Main $@ |
@@ -0,0 +1,31 @@ | |||
@echo off | |||
@setlocal | |||
if "%ANT_HOME%"=="" goto checkProgFiles | |||
goto checkJavaHome | |||
:checkProgFiles | |||
rem check for ant on system drive | |||
if not exist "%SystemDrive%\Program Files\ant" goto checkSystemDrive | |||
set ANT_HOME=%SystemDrive%\Program Files\ant | |||
goto checkJavaHome | |||
:checkSystemDrive | |||
if not exist "%SystemDrive%\ant" goto noAntHome | |||
set ANT_HOME=%SystemDrive%\ant | |||
goto checkJavaHome | |||
:noAntHome | |||
echo ANT_HOME is not set and ant could not be located | |||
goto end | |||
:checkJavaHome | |||
if "%JAVA_HOME%" == "" goto runAnt | |||
set CLASSPATH=%JAVA_HOME%\lib\tools.jar;%CLASSPATH% | |||
:runAnt | |||
set CLASSPATH=%ANT_HOME%\lib\ant.jar;%ANT_HOME%\lib\xml.jar;%CLASSPATH% | |||
java -Dant.home="%ANT_HOME%" org.apache.tools.ant.Main %1 %2 %3 %4 %5 %6 %7 %8 %9 | |||
:end | |||
@endlocal |
@@ -0,0 +1,14 @@ | |||
#! /bin/sh | |||
# Args: DIR command | |||
cd $1 | |||
CMD=$2 | |||
shift | |||
shift | |||
if test -e $CMD.sh; then | |||
CMD="sh $CMD.sh" | |||
fi | |||
echo $CMD $@ | |||
$CMD $@ 2>&1 |
@@ -0,0 +1,3 @@ | |||
cd %1 | |||
echo %2 %3 %4 %5 %6 %7 %8 %9 | |||
%2 %3 %4 %5 %6 %7 %8 %9 2>&1 |
@@ -0,0 +1,53 @@ | |||
Summary: Java build tool | |||
Name: ant | |||
Version: 1.0 | |||
Release: 0 | |||
Group: Development/Tools | |||
Copyright: Apache - free | |||
Provides: ant | |||
Url: http://jakarta.apache.org | |||
Source: http://jakarta.apache.org/builds/nightly/ant/jakarta-tools.src.zip | |||
Prefix: /opt | |||
%description | |||
Platform-independent build tool for java. | |||
Used by tomcat/jakarta projects. | |||
%prep | |||
rm -rf ${RPM_BUILD_DIR}/jakarta-tools | |||
unzip -x $RPM_SOURCE_DIR/jakarta-tools.src.zip | |||
%build | |||
cd ${RPM_BUILD_DIR}/jakarta-tools | |||
cd ant | |||
sh bootstrap.sh | |||
sh build.sh | |||
%install | |||
cd ${RPM_BUILD_DIR}/jakarta-tools | |||
cd ant | |||
sh build.sh -Ddist.dir /opt dist | |||
%clean | |||
%post | |||
ln -s /opt/ant/bin/ant /usr/bin | |||
%preun | |||
%files | |||
## %defattr(-,root,root) | |||
%dir /opt/ant | |||
%dir /opt/ant/bin | |||
%dir /opt/ant/lib | |||
%dir /opt/ant/docs | |||
/opt/ant/lib/ant.jar | |||
/opt/ant/lib/xml.jar | |||
/opt/ant/lib/moo.jar | |||
%config /opt/ant/lib/build.xml | |||
/opt/ant/bin/ant | |||
/opt/ant/bin/antRun | |||
/opt/ant/docs/index.html | |||
%changelog |
@@ -0,0 +1,5 @@ | |||
Manifest-Version: 1.0 | |||
Main-Class: org.apache.tools.ant.Main | |||
Class-Path: javac.jar projectx-tr2.jar | |||
@@ -0,0 +1,9 @@ | |||
PKG="ASFant" | |||
NAME="Apache Ant build tool" | |||
VERSION="1.0" | |||
ARCH="sparc i386" | |||
CLASSES="none" | |||
CATEGORY="utility" | |||
VENDOR="Apache" | |||
EMAIL="costin@eng.sun.com" | |||
BASEDIR=/ |
@@ -0,0 +1,12 @@ | |||
i pkginfo | |||
d none /opt/ant 0755 costin other | |||
d none /opt/ant/lib 0755 costin staff | |||
f none /opt/ant/lib/ant.jar 0644 costin staff | |||
f none /opt/ant/lib/xml.jar 0644 costin staff | |||
f none /opt/ant/lib/moo.jar 0644 costin staff | |||
f none /opt/ant/lib/build.xml 0644 costin staff | |||
d none /opt/ant/bin 0755 costin staff | |||
f none /opt/ant/bin/ant 0755 costin staff | |||
f none /opt/ant/bin/antRun 0755 costin staff | |||
d none /opt/ant/docs 0755 costin staff | |||
f none /opt/ant/docs/index.html 0644 costin staff |
@@ -0,0 +1,43 @@ | |||
/* | |||
** Copyright (c) 1998 by Timothy Gerard Endres | |||
** <mailto:time@ice.com> <http://www.ice.com> | |||
** | |||
** This package is free software. | |||
** | |||
** You may redistribute it and/or modify it under the terms of the GNU | |||
** General Public License as published by the Free Software Foundation. | |||
** Version 2 of the license should be included with this distribution in | |||
** the file LICENSE, as well as License.html. If the license is not | |||
** included with this distribution, you may find a copy at the FSF web | |||
** site at 'www.gnu.org' or 'www.fsf.org', or you may write to the | |||
** Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139 USA. | |||
** | |||
** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, | |||
** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR | |||
** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY | |||
** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR | |||
** REDISTRIBUTION OF THIS SOFTWARE. | |||
** | |||
*/ | |||
package com.ice.tar; | |||
public class | |||
InvalidHeaderException extends Exception | |||
{ | |||
public | |||
InvalidHeaderException() | |||
{ | |||
super(); | |||
} | |||
public | |||
InvalidHeaderException( String msg ) | |||
{ | |||
super( msg ); | |||
} | |||
} | |||
@@ -0,0 +1,472 @@ | |||
/* | |||
** Copyright (c) 1998 by Timothy Gerard Endres | |||
** <mailto:time@ice.com> <http://www.ice.com> | |||
** | |||
** This package is free software. | |||
** | |||
** You may redistribute it and/or modify it under the terms of the GNU | |||
** General Public License as published by the Free Software Foundation. | |||
** Version 2 of the license should be included with this distribution in | |||
** the file LICENSE, as well as License.html. If the license is not | |||
** included with this distribution, you may find a copy at the FSF web | |||
** site at 'www.gnu.org' or 'www.fsf.org', or you may write to the | |||
** Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139 USA. | |||
** | |||
** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, | |||
** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR | |||
** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY | |||
** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR | |||
** REDISTRIBUTION OF THIS SOFTWARE. | |||
** | |||
*/ | |||
package com.ice.tar; | |||
import java.io.*; | |||
/** | |||
* The TarArchive class implements the concept of a | |||
* tar archive. A tar archive is a series of entries, each of | |||
* which represents a file system object. Each entry in | |||
* the archive consists of a header record. Directory entries | |||
* consist only of the header record, and are followed by entries | |||
* for the directory's contents. File entries consist of a | |||
* header record followed by the number of records needed to | |||
* contain the file's contents. All entries are written on | |||
* record boundaries. Records are 512 bytes long. | |||
* | |||
* TarArchives are instantiated in either read or write mode, | |||
* based upon whether they are instantiated with an InputStream | |||
* or an OutputStream. Once instantiated TarArchives read/write | |||
* mode can not be changed. | |||
* | |||
* There is currently no support for random access to tar archives. | |||
* However, it seems that subclassing TarArchive, and using the | |||
* TarBuffer.getCurrentRecordNum() and TarBuffer.getCurrentBlockNum() | |||
* methods, this would be rather trvial. | |||
* | |||
* @version $Revision$ | |||
* @author Timothy Gerard Endres, | |||
* <a href="mailto:time@ice.com">time@ice.com</a>. | |||
* @see TarBuffer | |||
* @see TarHeader | |||
* @see TarEntry | |||
*/ | |||
public class | |||
TarArchive extends Object | |||
{ | |||
public static final int RECORDSIZE = 512; | |||
protected boolean verbose; | |||
protected boolean debug; | |||
protected boolean keepOldFiles; | |||
protected int userId; | |||
protected String userName; | |||
protected int groupId; | |||
protected String groupName; | |||
protected String pathPrefix; | |||
protected int recordSize; | |||
protected byte[] recordBuf; | |||
protected TarBuffer buffer; | |||
protected TarProgressDisplay progressDisplay; | |||
public | |||
TarArchive( InputStream inStream ) | |||
{ | |||
this( inStream, TarBuffer.DEFAULT_BLKSIZE ); | |||
} | |||
public | |||
TarArchive( InputStream inStream, int blockSize ) | |||
{ | |||
this( inStream, blockSize, TarArchive.RECORDSIZE ); | |||
} | |||
public | |||
TarArchive( InputStream inStream, int blockSize, int recordSize ) | |||
{ | |||
this.initialize( recordSize ); | |||
this.buffer = new TarBuffer( this, inStream, blockSize ); | |||
} | |||
public | |||
TarArchive( OutputStream outStream ) | |||
{ | |||
this( outStream, TarBuffer.DEFAULT_BLKSIZE ); | |||
} | |||
public | |||
TarArchive( OutputStream outStream, int blockSize ) | |||
{ | |||
this( outStream, blockSize, TarArchive.RECORDSIZE ); | |||
} | |||
public | |||
TarArchive( OutputStream outStream, int blockSize, int recordSize ) | |||
{ | |||
this.initialize( recordSize ); | |||
this.buffer = new TarBuffer( this, outStream, blockSize ); | |||
} | |||
public void | |||
initialize( int recordSize ) | |||
{ | |||
this.pathPrefix = null; | |||
this.recordSize = recordSize; | |||
this.recordBuf = new byte[ recordSize ]; | |||
this.userId = 0; | |||
this.userName = ""; | |||
this.groupId = 0; | |||
this.groupName = ""; | |||
this.debug = false; | |||
this.verbose = false; | |||
this.keepOldFiles = false; | |||
this.progressDisplay = null; | |||
} | |||
public void | |||
setDebug( boolean debugF ) | |||
{ | |||
this.debug = debugF; | |||
} | |||
public void | |||
setBufferDebug( boolean debug ) | |||
{ | |||
this.buffer.setDebug( debug ); | |||
} | |||
public boolean | |||
isVerbose() | |||
{ | |||
return this.verbose; | |||
} | |||
public void | |||
setVerbose( boolean verbose ) | |||
{ | |||
this.verbose = verbose; | |||
} | |||
public void | |||
setTarProgressDisplay( TarProgressDisplay display ) | |||
{ | |||
this.progressDisplay = display; | |||
} | |||
public void | |||
setKeepOldFiles( boolean keepOldFiles ) | |||
{ | |||
this.keepOldFiles = keepOldFiles; | |||
} | |||
public void | |||
setUserInfo( | |||
int userId, String userName, | |||
int groupId, String groupName ) | |||
{ | |||
this.userId = userId; | |||
this.userName = userName; | |||
this.groupId = groupId; | |||
this.groupName = groupName; | |||
} | |||
public int | |||
getUserId() | |||
{ | |||
return this.userId; | |||
} | |||
public String | |||
getUserName() | |||
{ | |||
return this.userName; | |||
} | |||
public int | |||
getGroupId() | |||
{ | |||
return this.groupId; | |||
} | |||
public String | |||
getGroupName() | |||
{ | |||
return this.groupName; | |||
} | |||
public void | |||
closeArchive() | |||
throws IOException | |||
{ | |||
this.buffer.flushBlock(); | |||
this.buffer.closeBuffer(); | |||
} | |||
public int | |||
getRecordSize() | |||
{ | |||
return this.recordSize; | |||
} | |||
public TarEntry | |||
parseArchive() | |||
{ | |||
return null; | |||
} | |||
public TarEntry | |||
parseEntry() | |||
{ | |||
return null; | |||
} | |||
public void | |||
extractArchive() | |||
{ | |||
} | |||
public void | |||
listContents() | |||
throws IOException, InvalidHeaderException | |||
{ | |||
TarEntry entry; | |||
byte[] headerBuf; | |||
for ( ; ; ) | |||
{ | |||
headerBuf = this.buffer.readRecord(); | |||
if ( headerBuf == null ) | |||
{ | |||
if ( this.debug ) | |||
{ | |||
System.err.println( "READ NULL RECORD" ); | |||
} | |||
break; | |||
} | |||
if ( this.isEOFRecord( headerBuf ) ) | |||
{ | |||
if ( this.debug ) | |||
{ | |||
System.err.println( "READ EOF RECORD" ); | |||
} | |||
break; | |||
} | |||
try { | |||
entry = new TarEntry( this, headerBuf ); | |||
} | |||
catch ( InvalidHeaderException ex ) | |||
{ | |||
throw new InvalidHeaderException | |||
( "bad header in block " | |||
+ this.buffer.getCurrentBlockNum() | |||
+ " record " | |||
+ this.buffer.getCurrentRecordNum() ); | |||
} | |||
if ( this.progressDisplay != null ) | |||
this.progressDisplay.showTarProgressMessage | |||
( entry.getName() ); | |||
this.buffer.skipBytes( (int)entry.getSize() ); | |||
} | |||
} | |||
public void | |||
extractContents( File destDir ) | |||
throws IOException, InvalidHeaderException | |||
{ | |||
TarEntry entry; | |||
byte[] headerBuf; | |||
for ( ; ; ) | |||
{ | |||
headerBuf = this.buffer.readRecord(); | |||
if ( headerBuf == null ) | |||
{ | |||
if ( this.debug ) | |||
{ | |||
System.err.println( "READ NULL RECORD" ); | |||
} | |||
break; | |||
} | |||
if ( this.isEOFRecord( headerBuf ) ) | |||
{ | |||
if ( this.debug ) | |||
{ | |||
System.err.println( "READ EOF RECORD" ); | |||
} | |||
break; | |||
} | |||
try { | |||
entry = new TarEntry( this, headerBuf ); | |||
} | |||
catch ( InvalidHeaderException ex ) | |||
{ | |||
throw new InvalidHeaderException | |||
( "bad header in block " | |||
+ this.buffer.getCurrentBlockNum() | |||
+ " record " | |||
+ this.buffer.getCurrentRecordNum() ); | |||
} | |||
this.extractEntry( destDir, entry ); | |||
} | |||
} | |||
public void | |||
extractEntry( File destDir, TarEntry entry ) | |||
throws IOException | |||
{ | |||
if ( this.verbose ) | |||
{ | |||
if ( this.progressDisplay != null ) | |||
this.progressDisplay.showTarProgressMessage | |||
( entry.getName() ); | |||
} | |||
File subDir = | |||
new File( destDir, entry.getName() ); | |||
if ( entry.isDirectory() ) | |||
{ | |||
if ( ! subDir.exists() ) | |||
{ | |||
if ( ! subDir.mkdirs() ) | |||
{ | |||
throw new IOException | |||
( "error making directory path '" | |||
+ subDir.getPath() + "'" ); | |||
} | |||
} | |||
} | |||
else | |||
{ | |||
String name = entry.getName().toString(); | |||
name = name.replace( '/', File.separatorChar ); | |||
File destFile = new File( destDir, name ); | |||
if ( this.keepOldFiles && destFile.exists() ) | |||
{ | |||
if ( this.verbose ) | |||
{ | |||
if ( this.progressDisplay != null ) | |||
this.progressDisplay.showTarProgressMessage | |||
( "not overwriting " + entry.getName() ); | |||
} | |||
} | |||
else | |||
{ | |||
FileOutputStream out = | |||
new FileOutputStream( destFile ); | |||
for ( int num = (int)entry.getSize() ; num > 0 ; ) | |||
{ | |||
byte[] record = this.buffer.readRecord(); | |||
int wNum = | |||
( num < record.length ) | |||
? num : record.length; | |||
out.write( record, 0, wNum ); | |||
num -= wNum; | |||
} | |||
out.close(); | |||
} | |||
} | |||
} | |||
public boolean | |||
isEOFRecord( byte[] record ) | |||
{ | |||
for ( int i = 0 ; i < this.recordSize ; ++i ) | |||
if ( record[i] != 0 ) | |||
return false; | |||
return true; | |||
} | |||
public void | |||
writeEOFRecord() | |||
throws IOException | |||
{ | |||
for ( int i = 0 ; i < this.recordSize ; ++i ) | |||
this.recordBuf[i] = 0; | |||
this.buffer.writeRecord( this.recordBuf ); | |||
} | |||
public void | |||
writeEntry( TarEntry entry, boolean recurse ) | |||
throws IOException | |||
{ | |||
if ( this.verbose ) | |||
{ | |||
if ( this.progressDisplay != null ) | |||
this.progressDisplay.showTarProgressMessage | |||
( entry.getName() ); | |||
} | |||
entry.writeEntryHeader( this.recordBuf ); | |||
this.buffer.writeRecord( this.recordBuf ); | |||
if ( entry.isDirectory() ) | |||
{ | |||
TarEntry[] list = entry.getDirectoryEntries(); | |||
for ( int i = 0 ; i < list.length ; ++i ) | |||
{ | |||
this.writeEntry( list[i], recurse ); | |||
} | |||
} | |||
else | |||
{ | |||
entry.writeEntryContents( this.buffer ); | |||
} | |||
} | |||
public TarEntry | |||
readEntry() | |||
throws IOException, InvalidHeaderException | |||
{ | |||
TarEntry result = null; | |||
byte[] header = this.readRecord(); | |||
TarEntry entry = new TarEntry( this, header ); | |||
return entry; | |||
} | |||
public byte[] | |||
readRecord() | |||
throws IOException | |||
{ | |||
return this.buffer.readRecord(); | |||
} | |||
public void | |||
writeRecord( byte[] record ) | |||
throws IOException | |||
{ | |||
this.buffer.writeRecord( record ); | |||
} | |||
} | |||
@@ -0,0 +1,331 @@ | |||
/* | |||
** Copyright (c) 1998 by Timothy Gerard Endres | |||
** <mailto:time@ice.com> <http://www.ice.com> | |||
** | |||
** This package is free software. | |||
** | |||
** You may redistribute it and/or modify it under the terms of the GNU | |||
** General Public License as published by the Free Software Foundation. | |||
** Version 2 of the license should be included with this distribution in | |||
** the file LICENSE, as well as License.html. If the license is not | |||
** included with this distribution, you may find a copy at the FSF web | |||
** site at 'www.gnu.org' or 'www.fsf.org', or you may write to the | |||
** Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139 USA. | |||
** | |||
** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, | |||
** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR | |||
** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY | |||
** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR | |||
** REDISTRIBUTION OF THIS SOFTWARE. | |||
** | |||
*/ | |||
package com.ice.tar; | |||
import java.io.*; | |||
/** | |||
* The TarBuffer class implements the tar archive concept | |||
* of a buffered input stream. This concept goes back to the | |||
* days of blocked tape drives and special io devices. In the | |||
* Java universe, the only real function that this class | |||
* performs is to ensure that files have the correct "block" | |||
* size, or other tars will complain. | |||
* <p> | |||
* You should never have a need to access this class directly. | |||
* TarBuffers are created by TarArchives, which in turn provide | |||
* several methods to allow you access to the buffer. | |||
* | |||
* @version $Revision$ | |||
* @author Timothy Gerard Endres, | |||
* <a href="mailto:time@ice.com">time@ice.com</a>. | |||
* @see TarArchive | |||
*/ | |||
public class | |||
TarBuffer extends Object | |||
{ | |||
public static final int DEFAULT_BLKSIZE = ( 512 * 20 ); | |||
private InputStream inStream; | |||
private OutputStream outStream; | |||
private byte[] blockBuffer; | |||
private int currBlkIdx; | |||
private int currRecIdx; | |||
private int blockSize; | |||
private int recordSize; | |||
private int recsPerBlock; | |||
private boolean debug; | |||
public | |||
TarBuffer( TarArchive archive, InputStream inStream ) | |||
{ | |||
this( archive, inStream, TarBuffer.DEFAULT_BLKSIZE ); | |||
} | |||
public | |||
TarBuffer( TarArchive archive, InputStream inStream, int blockSize ) | |||
{ | |||
this.inStream = inStream; | |||
this.outStream = null; | |||
this.initialize( archive, blockSize ); | |||
} | |||
public | |||
TarBuffer( TarArchive archive, OutputStream outStream ) | |||
{ | |||
this( archive, outStream, TarBuffer.DEFAULT_BLKSIZE ); | |||
} | |||
public | |||
TarBuffer( TarArchive archive, OutputStream outStream, int blockSize ) | |||
{ | |||
this.inStream = null; | |||
this.outStream = outStream; | |||
this.initialize( archive, blockSize ); | |||
} | |||
public void | |||
initialize( TarArchive archive, int blockSize ) | |||
{ | |||
this.debug = false; | |||
this.blockSize = blockSize; | |||
this.recordSize = archive.getRecordSize(); | |||
this.recsPerBlock = ( this.blockSize / this.recordSize ); | |||
this.blockBuffer = new byte[ this.blockSize ]; | |||
if ( inStream != null ) | |||
{ | |||
this.currBlkIdx = -1; | |||
this.currRecIdx = this.recsPerBlock; | |||
} | |||
else | |||
{ | |||
this.currBlkIdx = 0; | |||
this.currRecIdx = 0; | |||
} | |||
} | |||
public void | |||
setDebug( boolean debug ) | |||
{ | |||
this.debug = debug; | |||
} | |||
public void | |||
skipBytes( int bytes ) | |||
{ | |||
for ( int num = bytes ; num > 0 ; ) | |||
{ | |||
try { this.skipRecord(); } | |||
catch ( IOException ex ) | |||
{ | |||
break; | |||
} | |||
num -= this.recordSize; | |||
} | |||
} | |||
public void | |||
skipRecord() | |||
throws IOException | |||
{ | |||
if ( this.debug ) | |||
{ | |||
System.err.println | |||
( "SkipRecord: recIdx = " + this.currRecIdx | |||
+ " blkIdx = " + this.currBlkIdx ); | |||
} | |||
if ( this.currRecIdx >= this.recsPerBlock ) | |||
{ | |||
if ( ! this.readBlock() ) | |||
return; // UNDONE | |||
} | |||
this.currRecIdx++; | |||
} | |||
public byte[] | |||
readRecord() | |||
throws IOException | |||
{ | |||
if ( this.debug ) | |||
{ | |||
System.err.println | |||
( "ReadRecord: recIdx = " + this.currRecIdx | |||
+ " blkIdx = " + this.currBlkIdx ); | |||
} | |||
if ( this.currRecIdx >= this.recsPerBlock ) | |||
{ | |||
if ( ! this.readBlock() ) | |||
return null; | |||
} | |||
byte[] result = new byte[ this.recordSize ]; | |||
System.arraycopy( | |||
this.blockBuffer, (this.currRecIdx * this.recordSize), | |||
result, 0, this.recordSize ); | |||
this.currRecIdx++; | |||
return result; | |||
} | |||
/** | |||
* @return false if End-Of-File, else true | |||
*/ | |||
public boolean | |||
readBlock() | |||
throws IOException | |||
{ | |||
if ( this.debug ) | |||
{ | |||
System.err.println | |||
( "ReadBlock: blkIdx = " + this.currBlkIdx ); | |||
} | |||
if ( this.inStream == null ) | |||
throw new IOException( "input stream is null" ); | |||
this.currRecIdx = 0; | |||
int offset = 0; | |||
int bytesNeeded = this.blockSize; | |||
for ( ; bytesNeeded > 0 ; ) | |||
{ | |||
long numBytes = | |||
this.inStream.read | |||
( this.blockBuffer, offset, bytesNeeded ); | |||
if ( numBytes == -1 ) | |||
return false; | |||
offset += numBytes; | |||
bytesNeeded -= numBytes; | |||
if ( numBytes != this.blockSize ) | |||
{ | |||
if ( this.debug ) | |||
{ | |||
System.err.println | |||
( "ReadBlock: INCOMPLETE READ " + numBytes | |||
+ " of " + this.blockSize + " bytes read." ); | |||
} | |||
} | |||
} | |||
this.currBlkIdx++; | |||
return true; | |||
} | |||
public int | |||
getCurrentBlockNum() | |||
{ | |||
return this.currBlkIdx; | |||
} | |||
public int | |||
getCurrentRecordNum() | |||
{ | |||
return this.currRecIdx - 1; | |||
} | |||
public void | |||
writeRecord( byte[] record ) | |||
throws IOException | |||
{ | |||
if ( this.debug ) | |||
{ | |||
System.err.println | |||
( "WriteRecord: recIdx = " + this.currRecIdx | |||
+ " blkIdx = " + this.currBlkIdx ); | |||
} | |||
if ( this.currRecIdx >= this.recsPerBlock ) | |||
{ | |||
this.writeBlock(); | |||
} | |||
System.arraycopy( | |||
record, 0, | |||
this.blockBuffer, (this.currRecIdx * this.recordSize), | |||
this.recordSize ); | |||
this.currRecIdx++; | |||
} | |||
public void | |||
writeBlock() | |||
throws IOException | |||
{ | |||
if ( this.debug ) | |||
{ | |||
System.err.println | |||
( "WriteBlock: blkIdx = " + this.currBlkIdx ); | |||
} | |||
if ( this.outStream == null ) | |||
throw new IOException( "output stream is null" ); | |||
this.outStream.write( this.blockBuffer, 0, this.blockSize ); | |||
this.currRecIdx = 0; | |||
this.currBlkIdx++; | |||
} | |||
public void | |||
flushBlock() | |||
throws IOException | |||
{ | |||
if ( this.debug ) | |||
{ | |||
System.err.println( "TarBuffer.flushBlock() called." ); | |||
} | |||
if ( this.outStream != null ) | |||
{ | |||
if ( this.currRecIdx > 0 ) | |||
{ | |||
this.writeBlock(); | |||
} | |||
} | |||
} | |||
public void | |||
closeBuffer() | |||
throws IOException | |||
{ | |||
if ( this.debug ) | |||
{ | |||
System.err.println( "TarBuffer.closeBuffer()." ); | |||
} | |||
if ( this.outStream != null ) | |||
{ | |||
if ( this.outStream != System.out | |||
&& this.outStream != System.err ) | |||
{ | |||
this.outStream.close(); | |||
this.outStream = null; | |||
} | |||
} | |||
else if ( this.inStream != null ) | |||
{ | |||
if ( this.inStream != System.in ) | |||
{ | |||
this.inStream.close(); | |||
this.inStream = null; | |||
} | |||
} | |||
} | |||
} | |||
@@ -0,0 +1,411 @@ | |||
/* | |||
** Copyright (c) 1998 by Timothy Gerard Endres | |||
** <mailto:time@ice.com> <http://www.ice.com> | |||
** | |||
** This package is free software. | |||
** | |||
** You may redistribute it and/or modify it under the terms of the GNU | |||
** General Public License as published by the Free Software Foundation. | |||
** Version 2 of the license should be included with this distribution in | |||
** the file LICENSE, as well as License.html. If the license is not | |||
** included with this distribution, you may find a copy at the FSF web | |||
** site at 'www.gnu.org' or 'www.fsf.org', or you may write to the | |||
** Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139 USA. | |||
** | |||
** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, | |||
** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR | |||
** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY | |||
** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR | |||
** REDISTRIBUTION OF THIS SOFTWARE. | |||
** | |||
*/ | |||
package com.ice.tar; | |||
import java.io.*; | |||
/** | |||
* | |||
* | |||
* struct header { | |||
* char name[NAMSIZ]; | |||
* char mode[8]; | |||
* char uid[8]; | |||
* char gid[8]; | |||
* char size[12]; | |||
* char mtime[12]; | |||
* char chksum[8]; | |||
* char linkflag; | |||
* char linkname[NAMSIZ]; | |||
* char magic[8]; | |||
* char uname[TUNMLEN]; | |||
* char gname[TGNMLEN]; | |||
* char devmajor[8]; | |||
* char devminor[8]; | |||
* } header; | |||
* | |||
*/ | |||
public class | |||
TarEntry extends Object | |||
{ | |||
protected TarArchive archive; | |||
protected TarHeader header; | |||
protected File file; | |||
public | |||
TarEntry( TarArchive archive, File file ) | |||
{ | |||
this.archive = archive; | |||
this.file = file; | |||
this.header = this.getFileTarHeader( file ); | |||
} | |||
public | |||
TarEntry( TarArchive archive, byte[] headerBuf ) | |||
throws InvalidHeaderException | |||
{ | |||
this.archive = archive; | |||
this.file = null; | |||
this.header = this.parseTarHeader( headerBuf ); | |||
} | |||
public TarArchive | |||
getArchive() | |||
{ | |||
return this.archive; | |||
} | |||
public File | |||
getFile() | |||
{ | |||
return this.file; | |||
} | |||
public TarHeader | |||
getHeader() | |||
{ | |||
return this.header; | |||
} | |||
public String | |||
getName() | |||
{ | |||
return this.header.name.toString(); | |||
} | |||
public long | |||
getSize() | |||
{ | |||
return this.header.size; | |||
} | |||
public TarHeader | |||
getFileTarHeader( File file ) | |||
{ | |||
TarHeader hdr = new TarHeader(); | |||
String name = file.getPath(); | |||
String osname = System.getProperty( "os.name" ); | |||
if ( osname != null ) | |||
{ | |||
if ( osname.startsWith( "macos" ) ) | |||
{ | |||
// UNDONE | |||
} | |||
else if ( osname.startsWith( "Windows" ) ) | |||
{ | |||
if ( name.length() > 2 ) | |||
{ | |||
char ch1 = name.charAt(0); | |||
char ch2 = name.charAt(1); | |||
if ( ch2 == File.separatorChar | |||
&& ( (ch1 >= 'a' && ch1 <= 'z') | |||
|| (ch1 >= 'a' && ch1 <= 'z') ) ) | |||
{ | |||
name = name.substring( 2 ); | |||
} | |||
} | |||
} | |||
} | |||
hdr.name = | |||
new StringBuffer | |||
( name.replace( File.separatorChar, '/' ) ); | |||
if ( file.isDirectory() ) | |||
{ | |||
hdr.mode = 040755; | |||
hdr.linkFlag = TarHeader.LF_DIR; | |||
hdr.name.append( "/" ); | |||
} | |||
else | |||
{ | |||
hdr.mode = 0100644; | |||
hdr.linkFlag = TarHeader.LF_NORMAL; | |||
} | |||
hdr.userId = this.archive.getUserId(); | |||
hdr.groupId = this.archive.getGroupId(); | |||
hdr.size = file.length(); | |||
hdr.modTime = file.lastModified() / 1000; | |||
hdr.checkSum = 0; | |||
hdr.linkName = new StringBuffer( "" ); | |||
hdr.magic = new StringBuffer( TarHeader.TMAGIC ); | |||
String userName = this.archive.getUserName(); | |||
if ( userName == null ) | |||
userName = System.getProperty( "user.name", "" ); | |||
if ( userName.length() > 31 ) | |||
userName = userName.substring( 0, 32 ); | |||
hdr.userName = new StringBuffer( userName ); | |||
String grpName = this.archive.getGroupName(); | |||
if ( grpName == null ) | |||
grpName = ""; | |||
if ( grpName.length() > 31 ) | |||
grpName = grpName.substring( 0, 32 ); | |||
hdr.groupName = new StringBuffer( grpName ); | |||
hdr.devMajor = 0; | |||
hdr.devMinor = 0; | |||
return hdr; | |||
} | |||
public boolean | |||
isDirectory() | |||
{ | |||
if ( this.file != null ) | |||
return this.file.isDirectory(); | |||
if ( this.header != null ) | |||
{ | |||
if ( this.header.linkFlag == TarHeader.LF_DIR ) | |||
return true; | |||
if ( this.header.name.toString().endsWith( "/" ) ) | |||
return true; | |||
} | |||
return false; | |||
} | |||
public TarEntry[] | |||
getDirectoryEntries() | |||
{ | |||
if ( this.file == null | |||
|| ! this.file.isDirectory() ) | |||
{ | |||
return new TarEntry[0]; | |||
} | |||
String[] list = this.file.list(); | |||
TarEntry[] result = new TarEntry[ list.length ]; | |||
for ( int i = 0 ; i < list.length ; ++i ) | |||
{ | |||
result[i] = | |||
new TarEntry | |||
( this.archive, | |||
new File( this.file, list[i] ) ); | |||
} | |||
return result; | |||
} | |||
public long | |||
computeCheckSum( byte[] buf ) | |||
{ | |||
long sum = 0; | |||
for ( int i = 0 ; i < buf.length ; ++i ) | |||
{ | |||
sum += 255 & buf[ i ]; | |||
} | |||
return sum; | |||
} | |||
public void | |||
writeEntryHeader( byte[] outbuf ) | |||
{ | |||
int offset = 0; | |||
offset = TarHeader.getNameBytes | |||
( this.header.name, outbuf, offset, TarHeader.NAMELEN ); | |||
offset = TarHeader.getOctalBytes | |||
( this.header.mode, outbuf, offset, TarHeader.MODELEN ); | |||
offset = TarHeader.getOctalBytes | |||
( this.header.userId, outbuf, offset, TarHeader.UIDLEN ); | |||
offset = TarHeader.getOctalBytes | |||
( this.header.groupId, outbuf, offset, TarHeader.GIDLEN ); | |||
offset = TarHeader.getLongOctalBytes | |||
( this.header.size, outbuf, offset, TarHeader.SIZELEN ); | |||
offset = TarHeader.getLongOctalBytes | |||
( this.header.modTime, outbuf, offset, TarHeader.MODTIMELEN ); | |||
int csOffset = offset; | |||
for ( int c = 0 ; c < TarHeader.CHKSUMLEN ; ++c ) | |||
outbuf[ offset++ ] = new Byte(" ").byteValue(); | |||
outbuf[ offset++ ] = this.header.linkFlag; | |||
offset = TarHeader.getNameBytes | |||
( this.header.linkName, outbuf, offset, TarHeader.NAMELEN ); | |||
offset = TarHeader.getNameBytes | |||
( this.header.magic, outbuf, offset, TarHeader.MAGICLEN ); | |||
offset = TarHeader.getNameBytes | |||
( this.header.userName, outbuf, offset, TarHeader.UNAMELEN ); | |||
offset = TarHeader.getNameBytes | |||
( this.header.groupName, outbuf, offset, TarHeader.GNAMELEN ); | |||
offset = TarHeader.getOctalBytes | |||
( this.header.devMajor, outbuf, offset, TarHeader.DEVLEN ); | |||
offset = TarHeader.getOctalBytes | |||
( this.header.devMinor, outbuf, offset, TarHeader.DEVLEN ); | |||
long checkSum = this.computeCheckSum( outbuf ); | |||
TarHeader.getCheckSumOctalBytes | |||
( checkSum, outbuf, csOffset, TarHeader.CHKSUMLEN ); | |||
} | |||
public void | |||
writeEntryContents( TarBuffer buffer ) | |||
throws IOException | |||
{ | |||
if ( this.file == null ) | |||
throw new IOException( "file is null" ); | |||
if ( ! this.file.exists() ) | |||
throw new IOException | |||
( "file '" + this.file.getPath() | |||
+ "' does not exist" ); | |||
// UNDONE - handle ASCII line termination translation!!!! | |||
FileInputStream in = | |||
new FileInputStream( this.file ); | |||
int recSize = this.archive.getRecordSize(); | |||
byte[] recbuf = new byte[ recSize ]; | |||
for ( ; ; ) | |||
{ | |||
int num = in.read( recbuf, 0, recSize ); | |||
if ( num == -1 ) | |||
break; | |||
if ( num < recSize ) | |||
{ | |||
for ( int j = num ; j < recSize ; ++j ) | |||
recbuf[j] = 0; | |||
} | |||
buffer.writeRecord( recbuf ); | |||
} | |||
in.close(); | |||
} | |||
public TarHeader | |||
parseTarHeader( byte[] header ) | |||
throws InvalidHeaderException | |||
{ | |||
TarHeader hdr = new TarHeader(); | |||
int offset = 0; | |||
hdr.name = | |||
TarHeader.parseName( header, offset, TarHeader.NAMELEN ); | |||
offset += TarHeader.NAMELEN; | |||
hdr.mode = (int) | |||
TarHeader.parseOctal( header, offset, TarHeader.MODELEN ); | |||
offset += TarHeader.MODELEN; | |||
hdr.userId = (int) | |||
TarHeader.parseOctal( header, offset, TarHeader.UIDLEN ); | |||
offset += TarHeader.UIDLEN; | |||
hdr.groupId = (int) | |||
TarHeader.parseOctal( header, offset, TarHeader.GIDLEN ); | |||
offset += TarHeader.GIDLEN; | |||
hdr.size = | |||
TarHeader.parseOctal( header, offset, TarHeader.SIZELEN ); | |||
offset += TarHeader.SIZELEN; | |||
hdr.modTime = | |||
TarHeader.parseOctal( header, offset, TarHeader.MODTIMELEN ); | |||
offset += TarHeader.MODTIMELEN; | |||
hdr.checkSum = (int) | |||
TarHeader.parseOctal( header, offset, TarHeader.CHKSUMLEN ); | |||
offset += TarHeader.CHKSUMLEN; | |||
hdr.linkFlag = header[ offset++ ]; | |||
hdr.linkName = | |||
TarHeader.parseName( header, offset, TarHeader.NAMELEN ); | |||
offset += TarHeader.NAMELEN; | |||
hdr.magic = | |||
TarHeader.parseName( header, offset, TarHeader.MAGICLEN ); | |||
offset += TarHeader.MAGICLEN; | |||
hdr.userName = | |||
TarHeader.parseName( header, offset, TarHeader.UNAMELEN ); | |||
offset += TarHeader.UNAMELEN; | |||
hdr.groupName = | |||
TarHeader.parseName( header, offset, TarHeader.GNAMELEN ); | |||
offset += TarHeader.GNAMELEN; | |||
hdr.devMajor = (int) | |||
TarHeader.parseOctal( header, offset, TarHeader.DEVLEN ); | |||
offset += TarHeader.DEVLEN; | |||
hdr.devMinor = (int) | |||
TarHeader.parseOctal( header, offset, TarHeader.DEVLEN ); | |||
return hdr; | |||
} | |||
} | |||
@@ -0,0 +1,200 @@ | |||
/* | |||
** Copyright (c) 1998 by Timothy Gerard Endres | |||
** <mailto:time@ice.com> <http://www.ice.com> | |||
** | |||
** This package is free software. | |||
** | |||
** You may redistribute it and/or modify it under the terms of the GNU | |||
** General Public License as published by the Free Software Foundation. | |||
** Version 2 of the license should be included with this distribution in | |||
** the file LICENSE, as well as License.html. If the license is not | |||
** included with this distribution, you may find a copy at the FSF web | |||
** site at 'www.gnu.org' or 'www.fsf.org', or you may write to the | |||
** Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139 USA. | |||
** | |||
** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, | |||
** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR | |||
** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY | |||
** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR | |||
** REDISTRIBUTION OF THIS SOFTWARE. | |||
** | |||
*/ | |||
package com.ice.tar; | |||
public class | |||
TarHeader extends Object | |||
{ | |||
public static final int NAMELEN = 100; | |||
public static final int MODELEN = 8; | |||
public static final int UIDLEN = 8; | |||
public static final int GIDLEN = 8; | |||
public static final int CHKSUMLEN = 8; | |||
public static final int SIZELEN = 12; | |||
public static final int MAGICLEN = 8; | |||
public static final int MODTIMELEN = 12; | |||
public static final int UNAMELEN = 32; | |||
public static final int GNAMELEN = 32; | |||
public static final int DEVLEN = 8; | |||
public static final byte LF_OLDNORM = 0; | |||
public static final byte LF_NORMAL = new Byte("0").byteValue(); | |||
public static final byte LF_LINK = new Byte("1").byteValue(); | |||
public static final byte LF_SYMLINK = new Byte("2").byteValue(); | |||
public static final byte LF_CHR = new Byte("3").byteValue(); | |||
public static final byte LF_BLK = new Byte("4").byteValue(); | |||
public static final byte LF_DIR = new Byte("5").byteValue(); | |||
public static final byte LF_FIFO = new Byte("6").byteValue(); | |||
public static final byte LF_CONTIG = new Byte("7").byteValue(); | |||
public static final String TMAGIC = "ustar "; | |||
public StringBuffer name; | |||
public int mode; | |||
public int userId; | |||
public int groupId; | |||
public long size; | |||
public long modTime; | |||
public int checkSum; | |||
public byte linkFlag; | |||
public StringBuffer linkName; | |||
public StringBuffer magic; | |||
public StringBuffer userName; | |||
public StringBuffer groupName; | |||
public int devMajor; | |||
public int devMinor; | |||
public | |||
TarHeader() | |||
{ | |||
} | |||
public static long | |||
parseOctal( byte[] header, int offset, int length ) | |||
throws InvalidHeaderException | |||
{ | |||
long result = 0; | |||
boolean stillPadding = true; | |||
int end = offset + length; | |||
for ( int i = offset ; i < end ; ++i ) | |||
{ | |||
if ( header[i] == 0 ) | |||
break; | |||
if ( header[i] == ' ' || header[i] == '0' ) | |||
{ | |||
if ( stillPadding ) | |||
continue; | |||
if ( header[i] == ' ' ) | |||
break; | |||
} | |||
stillPadding = false; | |||
result = | |||
(result << 3) | |||
+ (header[i] - '0'); | |||
} | |||
return result; | |||
} | |||
public static StringBuffer | |||
parseName( byte[] header, int offset, int length ) | |||
throws InvalidHeaderException | |||
{ | |||
StringBuffer result = new StringBuffer( length ); | |||
int end = offset + length; | |||
for ( int i = offset ; i < end ; ++i ) | |||
{ | |||
if ( header[i] == 0 ) | |||
break; | |||
result.append( (char)header[i] ); | |||
} | |||
return result; | |||
} | |||
public static int | |||
getNameBytes( StringBuffer name, byte[] buf, int offset, int length ) | |||
{ | |||
int i; | |||
for ( i = 0 ; i < length && i < name.length() ; ++i ) | |||
{ | |||
buf[ offset + i ] = (byte)name.charAt( i ); | |||
} | |||
for ( ; i < length ; ++i ) | |||
{ | |||
buf[ offset + i ] = 0; | |||
} | |||
return offset + length; | |||
} | |||
public static int | |||
getOctalBytes( long value, byte[] buf, int offset, int length ) | |||
{ | |||
byte[] result = new byte[ length ]; | |||
int idx = length - 1; | |||
buf[ offset + idx ] = 0; | |||
--idx; | |||
buf[ offset + idx ] = new Byte(" ").byteValue(); | |||
--idx; | |||
if ( value == 0 ) | |||
{ | |||
buf[ offset + idx ] = new Byte("0").byteValue(); | |||
--idx; | |||
} | |||
else | |||
{ | |||
for ( long val = value ; idx >= 0 && val > 0 ; --idx ) | |||
{ | |||
buf[ offset + idx ] = | |||
(byte) ( '0' + (val & 7) ); | |||
val = val >> 3; | |||
} | |||
} | |||
for ( ; idx >= 0 ; --idx ) | |||
{ | |||
buf[ offset + idx ] = new Byte(" ").byteValue(); | |||
} | |||
return offset + length; | |||
} | |||
public static int | |||
getLongOctalBytes( long value, byte[] buf, int offset, int length ) | |||
{ | |||
byte[] temp = new byte[ length + 1 ]; | |||
TarHeader.getOctalBytes( value, temp, 0, length + 1 ); | |||
System.arraycopy( temp, 0, buf, offset, length ); | |||
return offset + length; | |||
} | |||
public static int | |||
getCheckSumOctalBytes( long value, byte[] buf, int offset, int length ) | |||
{ | |||
TarHeader.getOctalBytes( value, buf, offset, length ); | |||
buf[ offset + length - 1 ] = new Byte(" ").byteValue(); | |||
buf[ offset + length - 2 ] = 0; | |||
return offset + length; | |||
} | |||
public String | |||
getName() | |||
{ | |||
return this.name.toString(); | |||
} | |||
} | |||
@@ -0,0 +1,32 @@ | |||
/* | |||
** Copyright (c) 1998 by Timothy Gerard Endres | |||
** <mailto:time@ice.com> <http://www.ice.com> | |||
** | |||
** This package is free software. | |||
** | |||
** You may redistribute it and/or modify it under the terms of the GNU | |||
** General Public License as published by the Free Software Foundation. | |||
** Version 2 of the license should be included with this distribution in | |||
** the file LICENSE, as well as License.html. If the license is not | |||
** included with this distribution, you may find a copy at the FSF web | |||
** site at 'www.gnu.org' or 'www.fsf.org', or you may write to the | |||
** Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139 USA. | |||
** | |||
** THIS SOFTWARE IS PROVIDED AS-IS WITHOUT WARRANTY OF ANY KIND, | |||
** NOT EVEN THE IMPLIED WARRANTY OF MERCHANTABILITY. THE AUTHOR | |||
** OF THIS SOFTWARE, ASSUMES _NO_ RESPONSIBILITY FOR ANY | |||
** CONSEQUENCE RESULTING FROM THE USE, MODIFICATION, OR | |||
** REDISTRIBUTION OF THIS SOFTWARE. | |||
** | |||
*/ | |||
package com.ice.tar; | |||
public interface | |||
TarProgressDisplay | |||
{ | |||
public void | |||
showTarProgressMessage( String msg ); | |||
} | |||
@@ -0,0 +1,211 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import java.security.*; | |||
import java.io.*; | |||
import java.net.*; | |||
/** | |||
* The "almost" security manager that allows everything but exit(); | |||
* | |||
* @author stefano@apache.org | |||
*/ | |||
public class AntSecurityManager extends SecurityManager { | |||
private boolean exit = false; | |||
public AntSecurityManager() { | |||
super(); | |||
} | |||
public void setExit(boolean allowExit) { | |||
this.exit = allowExit; | |||
} | |||
public void checkExit(int status) { | |||
if (!exit) { | |||
throw new SecurityException("Not Allowed."); | |||
} | |||
} | |||
// everything else should be allowed | |||
/* | |||
Removed the following interfaces as they won't compile with JDK 1.1, | |||
and the defaults for JDK 1.2 appear to be sufficient. If you have | |||
a problem, let me know. Sam Ruby - rubys@us.ibm.com | |||
public void checkPermission(Permission perm) { | |||
// allowed | |||
} | |||
public void checkPermission(Permission perm, Object context) { | |||
// allowed | |||
} | |||
*/ | |||
public void checkCreateClassLoader() { | |||
// allowed | |||
} | |||
public void checkAccess(Thread t) { | |||
// allowed | |||
} | |||
public void checkAccess(ThreadGroup g) { | |||
// allowed | |||
} | |||
public void checkExec(String cmd) { | |||
// allowed | |||
} | |||
public void checkLink(String lib) { | |||
// allowed | |||
} | |||
public void checkRead(FileDescriptor fd) { | |||
// allowed | |||
} | |||
public void checkRead(String file) { | |||
// allowed | |||
} | |||
public void checkRead(String file, Object context) { | |||
// allowed | |||
} | |||
public void checkWrite(FileDescriptor fd) { | |||
// allowed | |||
} | |||
public void checkWrite(String file) { | |||
// allowed | |||
} | |||
public void checkDelete(String file) { | |||
// allowed | |||
} | |||
public void checkConnect(String host, int port) { | |||
// allowed | |||
} | |||
public void checkConnect(String host, int port, Object context) { | |||
// allowed | |||
} | |||
public void checkListen(int port) { | |||
// allowed | |||
} | |||
public void checkAccept(String host, int port) { | |||
// allowed | |||
} | |||
public void checkMulticast(InetAddress maddr) { | |||
// allowed | |||
} | |||
public void checkMulticast(InetAddress maddr, byte ttl) { | |||
// allowed | |||
} | |||
public void checkPropertiesAccess() { | |||
// allowed | |||
} | |||
public void checkPropertyAccess(String key) { | |||
// allowed | |||
} | |||
public void checkPrintJobAccess() { | |||
// allowed | |||
} | |||
public void checkSystemClipboardAccess() { | |||
// allowed | |||
} | |||
public void checkAwtEventQueueAccess() { | |||
// allowed | |||
} | |||
public void checkPackageAccess(String pkg) { | |||
// allowed | |||
} | |||
public void checkPackageDefinition(String pkg) { | |||
// allowed | |||
} | |||
public void checkSetFactory() { | |||
// allowed | |||
} | |||
public void checkMemberAccess(Class clazz, int which) { | |||
// allowed | |||
} | |||
public void checkSecurityAccess(String target) { | |||
// allowed | |||
} | |||
public boolean checkTopLevelWindow(Object window) { | |||
return true; | |||
} | |||
} |
@@ -0,0 +1,98 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.net.URL; | |||
import java.lang.reflect.Method; | |||
import org.w3c.dom.Document; | |||
import org.xml.sax.InputSource; | |||
import org.xml.sax.SAXException; | |||
/** | |||
* Implementation of Parser using Apache Xerces-J. | |||
* | |||
* @author pier@apache.org | |||
*/ | |||
public class ApacheParser extends Parser { | |||
Class DOMParser = null; | |||
Method parse; | |||
Method getDocument; | |||
/** | |||
* Parse the specified file and return a DOM Document. | |||
*/ | |||
public Document parse(File buildFile) | |||
throws SAXException, IOException { | |||
try { | |||
if (DOMParser == null) { | |||
DOMParser = Class.forName("org.apache.xerces.parsers.DOMParser"); | |||
parse = DOMParser.getMethod("parse", new Class[]{String.class}); | |||
getDocument = DOMParser.getMethod("getDocument", new Class[]{}); | |||
} | |||
Object p=DOMParser.newInstance(); | |||
URL url=new URL("file","",buildFile.getAbsolutePath()); | |||
parse.invoke(p, new Object[]{url.toExternalForm()}); | |||
return(org.w3c.dom.Document)getDocument.invoke(p, new Object[]{}); | |||
} catch (Exception e) { | |||
if (e instanceof IOException) throw (IOException)e; | |||
if (e instanceof SAXException) throw (SAXException)e; | |||
throw new IOException(e.toString()); | |||
} | |||
} | |||
} |
@@ -0,0 +1,102 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
/** | |||
* Signals an error condition. | |||
* | |||
* @author James Duncan Davidson | |||
*/ | |||
public class BuildException extends RuntimeException { | |||
/** Exception that might have caused this one */ | |||
private Exception cause; | |||
/** | |||
* Constructs an exception with no information. | |||
*/ | |||
public BuildException() { | |||
super(); | |||
} | |||
/** | |||
* Constructs an exception with the given message. | |||
*/ | |||
public BuildException(String msg) { | |||
super(msg); | |||
} | |||
/** | |||
* Constructs an exception with the given message and exception as | |||
* a root cause. | |||
*/ | |||
public BuildException(String msg, Exception cause) { | |||
super(msg); | |||
this.cause = cause; | |||
} | |||
/** | |||
* Constructs an exception with the given exception as a root cause. | |||
*/ | |||
public BuildException(Exception cause) { | |||
super(); | |||
this.cause = cause; | |||
} | |||
} |
@@ -0,0 +1,118 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.io.FilenameFilter; | |||
/** | |||
* Filters filenames to determine whether or not the file is desirable. | |||
* | |||
* @author Jason Hunter [jhunter@servlets.com] | |||
* @author james@x180.com | |||
*/ | |||
public class DesirableFilter implements FilenameFilter { | |||
/** | |||
* Test the given filename to determine whether or not it's desirable. | |||
* This helps tasks filter temp files and files used by CVS. | |||
*/ | |||
public boolean accept(File dir, String name) { | |||
// emacs save file | |||
if (name.endsWith("~")) { | |||
return false; | |||
} | |||
// emacs autosave file | |||
if (name.startsWith("#") && name.endsWith("#")) { | |||
return false; | |||
} | |||
// openwindows text editor does this I think | |||
if (name.startsWith("%") && name.endsWith("%")) { | |||
return false; | |||
} | |||
/* CVS stuff -- hopefully there won't be a case with | |||
* an all cap file/dir named "CVS" that somebody wants | |||
* to keep around... | |||
*/ | |||
if (name.equals("CVS")) { | |||
return false; | |||
} | |||
/* If we are going to ignore CVS might as well ignore | |||
* this one as well... | |||
*/ | |||
if (name.equals(".cvsignore")){ | |||
return false; | |||
} | |||
// default | |||
return true; | |||
} | |||
} | |||
@@ -0,0 +1,275 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import java.io.BufferedReader; | |||
import java.io.File; | |||
import java.io.InputStreamReader; | |||
import java.util.Properties; | |||
import java.util.Enumeration; | |||
/** | |||
* Command line entry point into Ant. This class is entered via the | |||
* cannonical `public static void main` entry point and reads the | |||
* command line arguments. It then assembles and executes an Ant | |||
* project. | |||
* <p> | |||
* If you integrating Ant into some other tool, this is not the class | |||
* to use as an entry point. Please see the source code of this | |||
* class to see how it manipulates the Ant project classes. | |||
* | |||
* @author duncan@x180.com | |||
*/ | |||
public class Main { | |||
/** Our current message output status. Follows Project.MSG_XXX */ | |||
private static int msgOutputLevel = Project.MSG_INFO; | |||
/** File that we are using for configuration */ | |||
private static File buildFile = new File("build.xml"); | |||
// XXX | |||
// Change the targets to use a vector or something. I'm not keen | |||
// on the idea of having an artificial limit, even if it isn't | |||
// likely that somebody will want to build more than 20 targets. | |||
private static String targets[] = new String[20]; | |||
private static int targetCount=0; | |||
/** Set of properties that can be used by tasks */ | |||
private static Properties definedProps = new Properties(); | |||
/** The Ant security manager */ | |||
private static AntSecurityManager securityManager; | |||
/** | |||
* Command line entry point. This method kicks off the building | |||
* of a project object and executes a build using either a given | |||
* target or the default target. | |||
* | |||
* @param args Command line args. | |||
*/ | |||
public static void main(String[] args) { | |||
// cycle through given args | |||
for (int i = 0; i < args.length; i++) { | |||
String arg = args[i]; | |||
if (arg.equals("-help") || arg.equals("help")) { | |||
printUsage(); | |||
return; | |||
} else if (arg.equals("-quiet") || arg.equals("-q") || | |||
arg.equals("q")) { | |||
msgOutputLevel = Project.MSG_WARN; | |||
} else if (arg.equals("-verbose") || arg.equals("-v") || | |||
arg.equals("v")) { | |||
msgOutputLevel = Project.MSG_VERBOSE; | |||
} else if (arg.equals("-buildfile") || arg.equals("-file") || arg.equals("-f")) { | |||
try { | |||
buildFile = new File(args[i+1]); | |||
i++; | |||
} catch (ArrayIndexOutOfBoundsException aioobe) { | |||
String msg = "You must specify a buildfile when " + | |||
"using the -buildfile argument"; | |||
System.out.println(msg); | |||
return; | |||
} | |||
} else if (arg.startsWith("-D")) { | |||
/* Interestingly enough, we get to here when a user | |||
* uses -Dname=value. However, the JDK goes ahead | |||
* and parses this out to args {"-Dname", "value"} | |||
* so instead of parsing on "=", we just make the "-D" | |||
* characters go away and skip one argument forward. | |||
*/ | |||
String name = arg.substring(2, arg.length()); | |||
String value = args[++i]; | |||
definedProps.put(name, value); | |||
} else if (arg.startsWith("-")) { | |||
// we don't have any more args to recognize! | |||
String msg = "Unknown arg: " + arg; | |||
System.out.println(msg); | |||
printUsage(); | |||
return; | |||
} else { | |||
// if it's no other arg, it may be the target | |||
targets[targetCount]=arg; | |||
targetCount++; | |||
} | |||
} | |||
// make sure buildfile exists | |||
if (!buildFile.exists()) { | |||
System.out.println("Buildfile: " + buildFile + " does not exist!"); | |||
return; | |||
} | |||
// make sure it's not a directory (this falls into the ultra | |||
// paranoid lets check everything catagory | |||
if (buildFile.isDirectory()) { | |||
System.out.println("What? Buildfile: " + buildFile + " is a dir!"); | |||
return; | |||
} | |||
// ok, so if we've made it here, let's run the damn build allready | |||
runBuild(); | |||
// se should force the exit() to allow everything to cleanup since | |||
// there could be leftover threads running around (some stupid AWT code | |||
// used for image generation does this! grrrr) | |||
exit(0); | |||
} | |||
/** | |||
* Executes the build. | |||
*/ | |||
private static void runBuild() { | |||
// track when we started | |||
long startTime = System.currentTimeMillis(); | |||
if (msgOutputLevel >= Project.MSG_INFO) { | |||
System.out.println("Buildfile: " + buildFile); | |||
} | |||
Project project = new Project(); | |||
project.setOutputLevel(msgOutputLevel); | |||
// set user-define properties | |||
Enumeration e = definedProps.keys(); | |||
while (e.hasMoreElements()) { | |||
String arg = (String)e.nextElement(); | |||
String value = (String)definedProps.get(arg); | |||
project.setUserProperty(arg, value); | |||
} | |||
// first use the ProjectHelper to create the project object | |||
// from the given build file. | |||
try { | |||
ProjectHelper.configureProject(project, buildFile); | |||
} catch (BuildException be) { | |||
String msg = "BUILD CONFIG ERROR: "; | |||
System.out.println(msg + be.getMessage()); | |||
be.printStackTrace(); | |||
exit(1); | |||
} | |||
// make sure that we have a target to execute | |||
if (targetCount == 0) { | |||
String target = project.getDefaultTarget(); | |||
targets[0]=target; | |||
targetCount=1; | |||
} | |||
// set the security manager | |||
securityManager = new AntSecurityManager(); | |||
System.setSecurityManager(securityManager); | |||
// actually do some work | |||
try { | |||
for(int i=0; i< targetCount; i++) | |||
project.executeTarget(targets[i]); | |||
} catch (BuildException be) { | |||
String msg = "BUILD FATAL ERROR: "; | |||
System.out.println(msg + be.getMessage()); | |||
if (msgOutputLevel > Project.MSG_INFO) { | |||
be.printStackTrace(); | |||
} | |||
exit(1); | |||
} | |||
// track our stop time and let the user know how long things | |||
// took. | |||
long finishTime = System.currentTimeMillis(); | |||
long elapsedTime = finishTime - startTime; | |||
if (msgOutputLevel >= Project.MSG_INFO) { | |||
System.out.println("Completed in " + (elapsedTime/1000) | |||
+ " seconds"); | |||
} | |||
} | |||
/** | |||
* Prints the usage of how to use this class to System.out | |||
*/ | |||
private static void printUsage() { | |||
String lSep = System.getProperty("line.separator"); | |||
StringBuffer msg = new StringBuffer(); | |||
msg.append("ant [options] [target]" + lSep); | |||
msg.append("Options: " + lSep); | |||
msg.append(" -help print this message" + lSep); | |||
msg.append(" -quiet be extra quiet" + lSep); | |||
msg.append(" -verbose be extra verbose" + lSep); | |||
msg.append(" -buildfile <file> use given buildfile" + lSep); | |||
msg.append(" -D<property>=<value> use value for given property" | |||
+ lSep); | |||
System.out.println(msg.toString()); | |||
} | |||
private static void exit(int code) { | |||
securityManager.setExit(true); | |||
System.exit(code); | |||
} | |||
} |
@@ -0,0 +1,62 @@ | |||
package org.apache.tools.ant; | |||
import java.util.*; | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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/>. | |||
*/ | |||
public interface Map { | |||
public Object get( Object key ); | |||
} |
@@ -0,0 +1,111 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import java.io.File; | |||
import java.io.InputStream; | |||
import java.io.IOException; | |||
import java.util.Properties; | |||
import org.w3c.dom.Document; | |||
import org.xml.sax.SAXException; | |||
/** | |||
* Dummy parser abstraction class for ANT to be used until the Java API for | |||
* XML Parsing are released. | |||
* | |||
* @author pier@apache.org | |||
*/ | |||
public abstract class Parser { | |||
// The properties file to be loaded | |||
private static String properties="org/apache/tools/ant/parser.properties"; | |||
/** | |||
* Create a working instance of a parser | |||
*/ | |||
public static Parser getParser(Project project) | |||
throws BuildException { | |||
InputStream in=project.getClass().getResourceAsStream("parser.properties"); | |||
if (in==null) throw new BuildException("Cannot find properties file"); | |||
String name; | |||
try { | |||
Properties prop=new Properties(); | |||
prop.load(in); | |||
name=prop.getProperty("parser"); | |||
if (name==null) throw new BuildException("Parser name not found"); | |||
} catch(IOException e) { | |||
throw new BuildException("Cannot load properties file"); | |||
} | |||
try { | |||
return((Parser)Class.forName(name).newInstance()); | |||
} catch (ClassNotFoundException e) { | |||
throw new BuildException("Class "+name+" cannot be found"); | |||
} catch (InstantiationException e) { | |||
throw new BuildException("Class "+name+" cannot be instantiated"); | |||
} catch (IllegalAccessException e) { | |||
throw new BuildException("Class "+name+" cannot be accessed"); | |||
} catch (ClassCastException e) { | |||
throw new BuildException("Class "+name+" doesn't extend Parser"); | |||
} | |||
} | |||
/** | |||
* Parse the specified file and return a DOM Document. | |||
*/ | |||
public abstract Document parse(File f) | |||
throws SAXException, IOException; | |||
} | |||
@@ -0,0 +1,601 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import java.io.File; | |||
import java.io.InputStream; | |||
import java.io.IOException; | |||
import java.io.PrintStream; | |||
import java.util.Enumeration; | |||
import java.util.Hashtable; | |||
import java.util.Properties; | |||
import java.util.StringTokenizer; | |||
import java.util.Vector; | |||
import java.util.Stack; | |||
import java.text.StringCharacterIterator; | |||
import java.text.CharacterIterator; | |||
/** | |||
* Central representation of an Ant project. This class defines a | |||
* Ant project with all of it's targets and tasks. It also provides | |||
* the mechanism to kick off a build using a particular target name. | |||
* <p> | |||
* This class also encapsulates methods which allow Files to be refered | |||
* to using abstract path names which are translated to native system | |||
* file paths at runtime as well as defining various project properties. | |||
* | |||
* @author duncan@x180.com | |||
*/ | |||
public class Project { | |||
public static final int MSG_ERR = 0; | |||
public static final int MSG_WARN = 1; | |||
public static final int MSG_INFO = 2; | |||
public static final int MSG_VERBOSE = 3; | |||
private static String javaVersion; | |||
// private set of constants to represent the state | |||
// of a DFS of the Target dependencies | |||
private static final String VISITING = "VISITING"; | |||
private static final String VISITED = "VISITED"; | |||
private String name; | |||
private PrintStream out = System.out; | |||
private int msgOutputLevel = MSG_INFO; | |||
private Hashtable properties = new Hashtable(); | |||
private Hashtable userProperties = new Hashtable(); | |||
private String defaultTarget; | |||
private Hashtable taskClassDefinitions = new Hashtable(); | |||
private Hashtable targets = new Hashtable(); | |||
private File baseDir; | |||
public Project() { | |||
detectJavaVersion(); | |||
String defs = "/org/apache/tools/ant/taskdefs/defaults.properties"; | |||
try { | |||
Properties props = new Properties(); | |||
InputStream in = this.getClass() | |||
.getResourceAsStream(defs); | |||
props.load(in); | |||
in.close(); | |||
Enumeration enum = props.propertyNames(); | |||
while (enum.hasMoreElements()) { | |||
String key = (String)enum.nextElement(); | |||
String value = props.getProperty(key); | |||
try { | |||
Class taskClass = Class.forName(value); | |||
addTaskDefinition(key, taskClass); | |||
} catch (ClassNotFoundException cnfe) { | |||
// ignore... | |||
} | |||
} | |||
Properties systemP=System.getProperties(); | |||
Enumeration e=systemP.keys(); | |||
while( e.hasMoreElements() ) { | |||
String n=(String) e.nextElement(); | |||
properties.put( n, systemP.get(n)); | |||
} | |||
} catch (IOException ioe) { | |||
String msg = "Can't load default task list"; | |||
System.out.println(msg); | |||
System.exit(1); | |||
} | |||
} | |||
public void setOutput(PrintStream out) { | |||
this.out = out; | |||
} | |||
public void setOutputLevel(int msgOutputLevel) { | |||
this.msgOutputLevel = msgOutputLevel; | |||
} | |||
public int getOutputLevel() { | |||
return this.msgOutputLevel; | |||
} | |||
public void log(String msg) { | |||
log(msg, MSG_INFO); | |||
} | |||
public void log(String msg, int msgLevel) { | |||
if (msgLevel <= msgOutputLevel) { | |||
out.println(msg); | |||
} | |||
} | |||
public void log(String msg, String tag, int msgLevel) { | |||
if (msgLevel <= msgOutputLevel) { | |||
out.println("[" + tag + "]" + msg); | |||
} | |||
} | |||
public void setProperty(String name, String value) { | |||
// command line properties take precedence | |||
if( null!= userProperties.get(name)) | |||
return; | |||
log("Setting project property: " + name + " to " + | |||
value, MSG_VERBOSE); | |||
properties.put(name, value); | |||
} | |||
public void setUserProperty(String name, String value) { | |||
log("Setting project property: " + name + " to " + | |||
value, MSG_VERBOSE); | |||
userProperties.put(name, value); | |||
properties.put( name,value); | |||
} | |||
public String getProperty(String name) { | |||
String property = (String)properties.get(name); | |||
return property; | |||
} | |||
public Hashtable getProperties() { | |||
return properties; | |||
} | |||
public void setDefaultTarget(String defaultTarget) { | |||
this.defaultTarget = defaultTarget; | |||
} | |||
// deprecated, use setDefault | |||
public String getDefaultTarget() { | |||
return defaultTarget; | |||
} | |||
// match the attribute name | |||
public void setDefault(String defaultTarget) { | |||
this.defaultTarget = defaultTarget; | |||
} | |||
public void setName(String name) { | |||
this.name = name; | |||
} | |||
public String getName() { | |||
return name; | |||
} | |||
// match basedir attribute in xml | |||
public void setBasedir( String baseD ) throws BuildException { | |||
try { | |||
setBaseDir(new File( new File(baseD).getCanonicalPath())); | |||
} catch (IOException ioe) { | |||
String msg = "Can't set basedir " + baseDir + " due to " + | |||
ioe.getMessage(); | |||
throw new BuildException(msg); | |||
} | |||
} | |||
public void setBaseDir(File baseDir) { | |||
this.baseDir = baseDir; | |||
String msg = "Project base dir set to: " + baseDir; | |||
log(msg, MSG_INFO); | |||
} | |||
public File getBaseDir() { | |||
if(baseDir==null) { | |||
try { | |||
setBasedir("."); | |||
} catch(BuildException ex) {ex.printStackTrace();} | |||
} | |||
return baseDir; | |||
} | |||
public static String getJavaVersion() { | |||
return javaVersion; | |||
} | |||
private void detectJavaVersion() { | |||
// Determine the Java version by looking at available classes | |||
// java.lang.StrictMath was introduced in JDK 1.3 | |||
// java.lang.ThreadLocal was introduced in JDK 1.2 | |||
// java.lang.Void was introduced in JDK 1.1 | |||
// Count up version until a NoClassDefFoundError ends the try | |||
try { | |||
javaVersion = "1.0"; | |||
Class.forName("java.lang.Void"); | |||
javaVersion = "1.1"; | |||
Class.forName("java.lang.ThreadLocal"); | |||
javaVersion = "1.2"; | |||
Class.forName("java.lang.StrictMath"); | |||
javaVersion = "1.3"; | |||
setProperty("ant.java.version", javaVersion); | |||
} | |||
catch (ClassNotFoundException cnfe) { | |||
// swallow as we've hit the max class version that | |||
// we have | |||
} | |||
log("Detected Java Version: " + javaVersion); | |||
} | |||
public void addTaskDefinition(String taskName, Class taskClass) { | |||
String msg = " +User task: " + taskName + " " + taskClass.getName(); | |||
log(msg, MSG_VERBOSE); | |||
taskClassDefinitions.put(taskName, taskClass); | |||
} | |||
/** | |||
* This call expects to add a <em>new</em> Target. | |||
* @param target is the Target to be added to the current | |||
* Project. | |||
* @exception BuildException if the Target already exists | |||
* in the project. | |||
* @see Project#addOrReplaceTarget to replace existing Targets. | |||
*/ | |||
public void addTarget(Target target) { | |||
String name = target.getName(); | |||
if (targets.get(name) != null) { | |||
throw new BuildException("Duplicate target: `"+name+"'"); | |||
} | |||
addOrReplaceTarget(name, target); | |||
} | |||
/** | |||
* This call expects to add a <em>new</em> Target. | |||
* @param target is the Target to be added to the current | |||
* Project. | |||
* @param targetName is the name to use for the Target | |||
* @exception BuildException if the Target already exists | |||
* in the project. | |||
* @see Project#addOrReplaceTarget to replace existing Targets. | |||
*/ | |||
public void addTarget(String targetName, Target target) | |||
throws BuildException { | |||
if (targets.get(targetName) != null) { | |||
throw new BuildException("Duplicate target: `"+targetName+"'"); | |||
} | |||
addOrReplaceTarget(targetName, target); | |||
} | |||
/** | |||
* @param target is the Target to be added or replaced in | |||
* the current Project. | |||
*/ | |||
public void addOrReplaceTarget(Target target) { | |||
addOrReplaceTarget(target.getName(), target); | |||
} | |||
/** | |||
* @param target is the Target to be added/replaced in | |||
* the current Project. | |||
* @param targetName is the name to use for the Target | |||
*/ | |||
public void addOrReplaceTarget(String targetName, Target target) { | |||
String msg = " +Target: " + targetName; | |||
log(msg, MSG_VERBOSE); | |||
targets.put(targetName, target); | |||
} | |||
public Task createTask(String taskType) throws BuildException { | |||
Class c = (Class)taskClassDefinitions.get(taskType); | |||
// XXX | |||
// check for nulls, other sanity | |||
try { | |||
Task task = (Task)c.newInstance(); | |||
task.setProject(this); | |||
String msg = " +Task: " + taskType; | |||
log (msg, MSG_VERBOSE); | |||
return task; | |||
} catch (Exception e) { | |||
String msg = "Could not create task of type: " | |||
+ taskType + " due to " + e; | |||
throw new BuildException(msg); | |||
} | |||
} | |||
public void executeTarget(String targetName) throws BuildException { | |||
// sanity check ourselves, if we've been asked to build nothing | |||
// then we should complain | |||
if (targetName == null) { | |||
String msg = "No target specified"; | |||
throw new BuildException(msg); | |||
} | |||
// Sort the dependency tree, and run everything from the | |||
// beginning until we hit our targetName. | |||
// Sorting checks if all the targets (and dependencies) | |||
// exist, and if there is any cycle in the dependency | |||
// graph. | |||
Vector sortedTargets = topoSort(targetName, targets); | |||
int curidx = 0; | |||
String curtarget; | |||
do { | |||
curtarget = (String) sortedTargets.elementAt(curidx++); | |||
runTarget(curtarget, targets); | |||
} while (!curtarget.equals(targetName)); | |||
} | |||
public File resolveFile(String fileName) { | |||
// deal with absolute files | |||
if (fileName.startsWith("/")) return new File( fileName ); | |||
// Eliminate consecutive slashes after the drive spec | |||
if (fileName.length() >= 2 && | |||
Character.isLetter(fileName.charAt(0)) && | |||
fileName.charAt(1) == ':') { | |||
char[] ca = fileName.replace('/', '\\').toCharArray(); | |||
char c; | |||
StringBuffer sb = new StringBuffer(); | |||
for (int i = 0; i < ca.length; i++) { | |||
if ((ca[i] != '\\') || | |||
(ca[i] == '\\' && | |||
i > 0 && | |||
ca[i - 1] != '\\')) { | |||
if (i == 0 && | |||
Character.isLetter(ca[i]) && | |||
i < ca.length - 1 && | |||
ca[i + 1] == ':') { | |||
c = Character.toUpperCase(ca[i]); | |||
} else { | |||
c = ca[i]; | |||
} | |||
sb.append(c); | |||
} | |||
} | |||
return new File(sb.toString()); | |||
} | |||
File file = new File(baseDir.getAbsolutePath()); | |||
StringTokenizer tok = new StringTokenizer(fileName, "/", false); | |||
while (tok.hasMoreTokens()) { | |||
String part = tok.nextToken(); | |||
if (part.equals("..")) { | |||
file = new File(file.getParent()); | |||
} else if (part.equals(".")) { | |||
// Do nothing here | |||
} else { | |||
file = new File(file, part); | |||
} | |||
} | |||
try { | |||
return new File(file.getCanonicalPath()); | |||
} | |||
catch (IOException e) { | |||
log("IOException getting canonical path for " + file + ": " + | |||
e.getMessage(), MSG_ERR); | |||
return new File(file.getAbsolutePath()); | |||
} | |||
} | |||
/** | |||
Translate a path into its native (platform specific) | |||
path. This should be extremely fast, code is | |||
borrowed from ECS project. | |||
<p> | |||
All it does is translate the : into ; and / into \ | |||
if needed. In other words, it isn't perfect. | |||
@returns translated string or empty string if to_process is null or empty | |||
@author Jon S. Stevens <a href="mailto:jon@clearink.com">jon@clearink.com</a> | |||
*/ | |||
public static String translatePath(String to_process) { | |||
if ( to_process == null || to_process.length() == 0 ) | |||
return ""; | |||
StringBuffer bs = new StringBuffer(to_process.length() + 50); | |||
StringCharacterIterator sci = new StringCharacterIterator(to_process); | |||
String path = System.getProperty("path.separator"); | |||
String file = System.getProperty("file.separator"); | |||
String tmp = null; | |||
for (char c = sci.first(); c != CharacterIterator.DONE; c = sci.next()) { | |||
tmp = String.valueOf(c); | |||
if (tmp.equals(":")) { | |||
// could be a DOS drive or a Unix path separator... | |||
// if followed by a backslash, assume it is a drive | |||
c = sci.next(); | |||
tmp = String.valueOf(c); | |||
bs.append( tmp.equals("\\") ? ":" : path ); | |||
if (c == CharacterIterator.DONE) break; | |||
} | |||
if (tmp.equals(":") || tmp.equals(";")) | |||
tmp = path; | |||
else if (tmp.equals("/") || tmp.equals ("\\")) | |||
tmp = file; | |||
bs.append(tmp); | |||
} | |||
return(bs.toString()); | |||
} | |||
// Given a string defining a target name, and a Hashtable | |||
// containing the "name to Target" mapping, pick out the | |||
// Target and execute it. | |||
private final void runTarget(String target, Hashtable targets) | |||
throws BuildException { | |||
Target t = (Target)targets.get(target); | |||
if (t == null) { | |||
throw new RuntimeException("Unexpected missing target `"+target+ | |||
"' in this project."); | |||
} | |||
log("Executing Target: "+target, MSG_INFO); | |||
t.execute(); | |||
} | |||
/** | |||
* Topologically sort a set of Targets. | |||
* @param root is the (String) name of the root Target. The sort is | |||
* created in such a way that the sequence of Targets uptil the root | |||
* target is the minimum possible such sequence. | |||
* @param targets is a Hashtable representing a "name to Target" mapping | |||
* @return a Vector of Strings with the names of the targets in | |||
* sorted order. | |||
* @exception BuildException if there is a cyclic dependency among the | |||
* Targets, or if a Target does not exist. | |||
*/ | |||
private final Vector topoSort(String root, Hashtable targets) | |||
throws BuildException { | |||
Vector ret = new Vector(); | |||
Hashtable state = new Hashtable(); | |||
Stack visiting = new Stack(); | |||
// We first run a DFS based sort using the root as the starting node. | |||
// This creates the minimum sequence of Targets to the root node. | |||
// We then do a sort on any remaining unVISITED targets. | |||
// This is unnecessary for doing our build, but it catches | |||
// circular dependencies or missing Targets on the entire | |||
// dependency tree, not just on the Targets that depend on the | |||
// build Target. | |||
tsort(root, targets, state, visiting, ret); | |||
log("Build sequence for target `"+root+"' is "+ret, MSG_VERBOSE); | |||
for (Enumeration en=targets.keys(); en.hasMoreElements();) { | |||
String curTarget = (String)(en.nextElement()); | |||
String st = (String) state.get(curTarget); | |||
if (st == null) { | |||
tsort(curTarget, targets, state, visiting, ret); | |||
} | |||
else if (st == VISITING) { | |||
throw new RuntimeException("Unexpected node in visiting state: "+curTarget); | |||
} | |||
} | |||
log("Complete build sequence is "+ret, MSG_VERBOSE); | |||
return ret; | |||
} | |||
// one step in a recursive DFS traversal of the Target dependency tree. | |||
// - The Hashtable "state" contains the state (VISITED or VISITING or null) | |||
// of all the target names. | |||
// - The Stack "visiting" contains a stack of target names that are | |||
// currently on the DFS stack. (NB: the target names in "visiting" are | |||
// exactly the target names in "state" that are in the VISITING state.) | |||
// 1. Set the current target to the VISITING state, and push it onto | |||
// the "visiting" stack. | |||
// 2. Throw a BuildException if any child of the current node is | |||
// in the VISITING state (implies there is a cycle.) It uses the | |||
// "visiting" Stack to construct the cycle. | |||
// 3. If any children have not been VISITED, tsort() the child. | |||
// 4. Add the current target to the Vector "ret" after the children | |||
// have been visited. Move the current target to the VISITED state. | |||
// "ret" now contains the sorted sequence of Targets upto the current | |||
// Target. | |||
private final void tsort(String root, Hashtable targets, | |||
Hashtable state, Stack visiting, | |||
Vector ret) | |||
throws BuildException { | |||
state.put(root, VISITING); | |||
visiting.push(root); | |||
Target target = (Target)(targets.get(root)); | |||
// Make sure we exist | |||
if (target == null) { | |||
StringBuffer sb = new StringBuffer("Target `"); | |||
sb.append(root); | |||
sb.append("' does not exist in this project. "); | |||
visiting.pop(); | |||
if (!visiting.empty()) { | |||
String parent = (String)visiting.peek(); | |||
sb.append("It is used from target `"); | |||
sb.append(parent); | |||
sb.append("'."); | |||
} | |||
throw new BuildException(new String(sb)); | |||
} | |||
for (Enumeration en=target.getDependencies(); en.hasMoreElements();) { | |||
String cur = (String) en.nextElement(); | |||
String m=(String)state.get(cur); | |||
if (m == null) { | |||
// Not been visited | |||
tsort(cur, targets, state, visiting, ret); | |||
} | |||
else if (m == VISITING) { | |||
// Currently visiting this node, so have a cycle | |||
throw makeCircularException(cur, visiting); | |||
} | |||
} | |||
String p = (String) visiting.pop(); | |||
if (root != p) { | |||
throw new RuntimeException("Unexpected internal error: expected to pop "+root+" but got "+p); | |||
} | |||
state.put(root, VISITED); | |||
ret.addElement(root); | |||
} | |||
private static BuildException makeCircularException(String end, Stack stk) { | |||
StringBuffer sb = new StringBuffer("Circular dependency: "); | |||
sb.append(end); | |||
String c; | |||
do { | |||
c = (String)stk.pop(); | |||
sb.append(" <- "); | |||
sb.append(c); | |||
} while(!c.equals(end)); | |||
return new BuildException(new String(sb)); | |||
} | |||
} |
@@ -0,0 +1,356 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import java.beans.*; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import java.lang.reflect.*; | |||
import java.util.*; | |||
import org.xml.sax.SAXException; | |||
import org.w3c.dom.*; | |||
/** | |||
* Configures a Project (complete with Targets and Tasks) based on | |||
* a XML build file. | |||
* | |||
* @author duncan@x180.com | |||
*/ | |||
public class ProjectHelper { | |||
public static void configureProject(Project project, File buildFile) | |||
throws BuildException | |||
{ | |||
// XXX | |||
// need to get rid of the DOM layer and use SAX | |||
Document doc; | |||
try { | |||
doc=Parser.getParser(project).parse(buildFile); | |||
} catch (IOException ioe) { | |||
String msg = "Can't open config file: " + buildFile + | |||
" due to: " + ioe; | |||
throw new BuildException(msg); | |||
} catch (SAXException se) { | |||
String msg = "Can't open config file: " + buildFile + | |||
" due to: " + se; | |||
throw new BuildException(msg); | |||
} | |||
Element root = doc.getDocumentElement(); | |||
// sanity check, make sure that we have the right element | |||
// as we aren't validating the input | |||
if (!root.getTagName().equals("project")) { | |||
String msg = "Config file is not of expected XML type"; | |||
throw new BuildException(msg); | |||
} | |||
project.setName(root.getAttribute("name")); | |||
project.setDefaultTarget(root.getAttribute("default")); | |||
String baseDir = project.getProperty("basedir"); | |||
if (baseDir == null) { | |||
baseDir = root.getAttribute("basedir"); | |||
if (baseDir.equals("")) { | |||
// Using clunky JDK1.1 methods here | |||
baseDir = new File(buildFile.getAbsolutePath()).getParent(); | |||
} | |||
} | |||
project.setBasedir(baseDir); | |||
// set up any properties that may be in the config file | |||
// configureProperties(project, root); | |||
// set up any task defs that may be in the config file | |||
// configureTaskDefs(project, root); | |||
// set up the targets into the project | |||
init(project, root ); | |||
configureTargets(project, root); | |||
} | |||
/** Read and execute init - all other targets will be loaded after ( to | |||
* make sure all properties are set ). | |||
* | |||
*/ | |||
private static void init(Project project, Element root) | |||
throws BuildException | |||
{ | |||
// Hack - all tasks outside init target will be added to init | |||
// ( will be removed when / if build.xml will start using init ) | |||
Target initTarget = new Target(); | |||
initTarget.setProject(project); | |||
initTarget.setName( "init" ); | |||
project.addTarget( "init", initTarget ); | |||
configureTasks( project, initTarget, root ); | |||
NodeList list = root.getElementsByTagName("target"); | |||
for (int i = 0; i < list.getLength(); i++) { | |||
Element element = (Element)list.item(i); | |||
String targetName = element.getAttribute("name"); | |||
if( targetName.equals("init") ) | |||
configureTasks(project, initTarget, element); | |||
} | |||
initTarget.execute(); | |||
} | |||
private static void configureTargets(Project project, Element root) | |||
throws BuildException | |||
{ | |||
// configure targets | |||
NodeList list = root.getElementsByTagName("target"); | |||
for (int i = 0; i < list.getLength(); i++) { | |||
Element element = (Element)list.item(i); | |||
String targetName = element.getAttribute("name"); | |||
String targetDep = element.getAttribute("depends"); | |||
// all targets must have a name | |||
if (targetName.equals("")) { | |||
String msg = "target element appears without a name attribute"; | |||
throw new BuildException(msg); | |||
} | |||
// init is done already | |||
if( targetName.equals("init") ) | |||
continue; | |||
Target target = new Target(); | |||
target.setName(targetName); | |||
project.addTarget(targetName, target); | |||
// take care of dependencies | |||
if (targetDep.length() > 0) { | |||
StringTokenizer tok = | |||
new StringTokenizer(targetDep, ",", false); | |||
while (tok.hasMoreTokens()) { | |||
target.addDependency(tok.nextToken().trim()); | |||
} | |||
} | |||
// populate target with tasks | |||
configureTasks(project, target, element); | |||
} | |||
} | |||
private static void configureTasks(Project project, | |||
Target target, | |||
Element targetElement) | |||
throws BuildException | |||
{ | |||
NodeList list = targetElement.getChildNodes(); | |||
for (int i = 0; i < list.getLength(); i++) { | |||
Node node = list.item(i); | |||
// right now, all we are interested in is element nodes | |||
// not quite sure what to do with others except drop 'em | |||
if (node.getNodeType() == Node.ELEMENT_NODE) { | |||
Element element = (Element)node; | |||
String taskType = element.getTagName(); | |||
// special case - no target in a target. | |||
// hack to allow this method to set "init" target | |||
// using root element | |||
if( ! taskType.equals( "target" ) ) { | |||
// XXX | |||
// put in some sanity checking | |||
Task task = project.createTask(taskType); | |||
// get the attributes of this element and reflect them | |||
// into the task | |||
NamedNodeMap nodeMap = element.getAttributes(); | |||
configureTask(project, task, nodeMap); | |||
target.addTask(task); | |||
} | |||
} | |||
} | |||
} | |||
private static void configureTask(Project project, | |||
Task task, | |||
NamedNodeMap nodeMap) | |||
throws BuildException | |||
{ | |||
// XXX | |||
// instead of doing this introspection each time around, I | |||
// should have a helper class to keep this info around for | |||
// each kind of class | |||
Hashtable propertySetters = new Hashtable(); | |||
BeanInfo beanInfo; | |||
try { | |||
beanInfo = Introspector.getBeanInfo(task.getClass()); | |||
} catch (IntrospectionException ie) { | |||
String msg = "Can't introspect task class: " + task.getClass(); | |||
throw new BuildException(msg); | |||
} | |||
PropertyDescriptor[] pda = beanInfo.getPropertyDescriptors(); | |||
for (int i = 0; i < pda.length; i++) { | |||
PropertyDescriptor pd = pda[i]; | |||
String property = pd.getName(); | |||
Method setMethod = pd.getWriteMethod(); | |||
if (setMethod != null) { | |||
// make sure that there's only 1 param and that it | |||
// takes a String object, all other setMethods need | |||
// to get screened out | |||
Class[] ma =setMethod.getParameterTypes(); | |||
if (ma.length == 1) { | |||
Class c = ma[0]; | |||
if (c.getName().equals("java.lang.String")) { | |||
propertySetters.put(property, setMethod); | |||
} | |||
} | |||
} | |||
} | |||
for (int i = 0; i < nodeMap.getLength(); i++) { | |||
Node node = nodeMap.item(i); | |||
// these should only be attribs, we won't see anything | |||
// else here. | |||
if (node.getNodeType() == Node.ATTRIBUTE_NODE) { | |||
Attr attr = (Attr)node; | |||
// reflect these into the task | |||
Method setMethod = (Method)propertySetters.get(attr.getName()); | |||
if (setMethod == null) { | |||
String msg = "Configuration property \"" + attr.getName() + | |||
"\" does not have a setMethod in " + task.getClass(); | |||
throw new BuildException(msg); | |||
} | |||
String value=replaceProperties( attr.getValue(), project.getProperties() ); | |||
try { | |||
setMethod.invoke(task, new String[] {value}); | |||
} catch (IllegalAccessException iae) { | |||
String msg = "Error setting value for attrib: " + | |||
attr.getName(); | |||
iae.printStackTrace(); | |||
throw new BuildException(msg); | |||
} catch (InvocationTargetException ie) { | |||
String msg = "Error setting value for attrib: " + | |||
attr.getName() + " in " + task.getClass().getName(); | |||
ie.printStackTrace(); | |||
ie.getTargetException().printStackTrace(); | |||
throw new BuildException(msg); | |||
} | |||
} | |||
} | |||
} | |||
/** Replace ${NAME} with the property value | |||
*/ | |||
public static String replaceProperties( String value, Hashtable keys ) | |||
throws BuildException | |||
{ | |||
// XXX use Map instead of proj, it's too heavy | |||
// XXX need to replace this code with something better. | |||
StringBuffer sb=new StringBuffer(); | |||
int i=0; | |||
int prev=0; | |||
// assert value!=nil | |||
int pos; | |||
while( (pos=value.indexOf( "$", prev )) >= 0 ) { | |||
if(pos>0) | |||
sb.append( value.substring( prev, pos ) ); | |||
if( value.charAt( pos + 1 ) != '{' ) { | |||
sb.append( value.charAt( pos + 1 ) ); | |||
prev=pos+2; // XXX | |||
} else { | |||
int endName=value.indexOf( '}', pos ); | |||
if( endName < 0 ) { | |||
throw new BuildException("Syntax error in prop: " + | |||
value ); | |||
} | |||
String n=value.substring( pos+2, endName ); | |||
String v=(String) keys.get( n ); | |||
//System.out.println("N: " + n + " " + " V:" + v); | |||
sb.append( v ); | |||
prev=endName+1; | |||
} | |||
} | |||
if( prev < value.length() ) sb.append( value.substring( prev ) ); | |||
// System.out.println("After replace: " + sb.toString()); | |||
// System.out.println("Before replace: " + value); | |||
return sb.toString(); | |||
} | |||
} | |||
@@ -0,0 +1,81 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import java.io.File; | |||
import java.io.IOException; | |||
import com.sun.xml.parser.Resolver; | |||
import com.sun.xml.tree.XmlDocument; | |||
import org.w3c.dom.Document; | |||
import org.xml.sax.InputSource; | |||
import org.xml.sax.SAXException; | |||
/** | |||
* Implementation of Parser using Sun ProjectX. | |||
* | |||
* @author pier@apache.org | |||
*/ | |||
public class SunParser extends Parser { | |||
/** | |||
* Parse the specified file and return a DOM Document. | |||
*/ | |||
public Document parse(File buildFile) | |||
throws SAXException, IOException { | |||
InputSource input = Resolver.createInputSource(buildFile); | |||
return XmlDocument.createXmlDocument(input, false); | |||
} | |||
} | |||
@@ -0,0 +1,126 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import java.util.Enumeration; | |||
import java.util.Vector; | |||
import java.util.StringTokenizer; | |||
/** | |||
* | |||
* | |||
* @author duncan@x180.com | |||
*/ | |||
public class Target { | |||
private String name; | |||
private Vector dependencies = new Vector(); | |||
private Vector tasks = new Vector(); | |||
Project project; | |||
public void setProject( Project project) { | |||
this.project=project; | |||
} | |||
public Project getProject() { | |||
return project; | |||
} | |||
public void setDepends( String depS ) { | |||
if (depS.length() > 0) { | |||
StringTokenizer tok = | |||
new StringTokenizer(depS, ",", false); | |||
while (tok.hasMoreTokens()) { | |||
addDependency(tok.nextToken().trim()); | |||
} | |||
} | |||
} | |||
public void setAttribute(String name, Object value) { | |||
// XXX | |||
if( value instanceof Task) | |||
addTask( (Task)value); | |||
} | |||
public void setName(String name) { | |||
this.name = name; | |||
} | |||
public String getName() { | |||
return name; | |||
} | |||
public void addTask(Task task) { | |||
tasks.addElement(task); | |||
} | |||
public void addDependency(String dependency) { | |||
dependencies.addElement(dependency); | |||
} | |||
public Enumeration getDependencies() { | |||
return dependencies.elements(); | |||
} | |||
public void execute() throws BuildException { | |||
Enumeration enum = tasks.elements(); | |||
while (enum.hasMoreElements()) { | |||
Task task = (Task)enum.nextElement(); | |||
task.execute(); | |||
} | |||
} | |||
} |
@@ -0,0 +1,155 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import java.io.File; | |||
import java.io.FileInputStream; | |||
import java.io.FileOutputStream; | |||
import java.io.IOException; | |||
import java.io.PrintStream; | |||
import java.util.StringTokenizer; | |||
import java.util.Vector; | |||
/** | |||
* Base class for all tasks in the | |||
* | |||
* @author duncan@x180.com | |||
*/ | |||
public abstract class Task { | |||
protected Project project = null; | |||
Target target; | |||
/** | |||
* Sets the project object of this task. This method is used by | |||
* project when a task is added to it so that the task has | |||
* access to the functions of the project. It should not be used | |||
* for any other purpose. | |||
* | |||
* @param project Project in whose scope this task belongs. | |||
*/ | |||
void setProject(Project project) { | |||
this.project = project; | |||
} | |||
public void setAttribute( String name, Object v) { | |||
if("target".equals( name ) ) { | |||
Target t=(Target)v; | |||
target=t; | |||
project=t.getProject(); | |||
return; | |||
} | |||
// System.out.println("Set Att " +name + " = " + v ); | |||
// if( v!=null) System.out.println(v.getClass()); | |||
} | |||
/** | |||
* Called by the project to let the task do it's work. | |||
* | |||
* @throws BuildException if someting goes wrong with the build | |||
*/ | |||
public abstract void execute() throws BuildException; | |||
/** | |||
* Convienence method to copy a file from a source to a destination | |||
* | |||
* @throws IOException | |||
*/ | |||
protected void copyFile(String sourceFile, String destFile) | |||
throws IOException | |||
{ | |||
copyFile(new File(sourceFile), new File(destFile)); | |||
} | |||
/** | |||
* Convienence method to copy a file from a source to a destination. | |||
* | |||
* @throws IOException | |||
*/ | |||
protected void copyFile(File sourceFile,File destFile) throws IOException { | |||
if (destFile.lastModified() < sourceFile.lastModified()) { | |||
project.log("Copy: " + sourceFile.getAbsolutePath() + " > " | |||
+ destFile.getAbsolutePath(), project.MSG_VERBOSE); | |||
// ensure that parent dir of dest file exists! | |||
// not using getParentFile method to stay 1.1 compat | |||
File parent = new File(destFile.getParent()); | |||
if (!parent.exists()) { | |||
parent.mkdirs(); | |||
} | |||
// open up streams and copy using a decent buffer | |||
FileInputStream in = new FileInputStream(sourceFile); | |||
FileOutputStream out = new FileOutputStream(destFile); | |||
byte[] buffer = new byte[8 * 1024]; | |||
int count = 0; | |||
do { | |||
out.write(buffer, 0, count); | |||
count = in.read(buffer, 0, buffer.length); | |||
} while (count != -1); | |||
in.close(); | |||
out.close(); | |||
} | |||
} | |||
} | |||
@@ -0,0 +1 @@ | |||
Manifest-Version: 1.0 |
@@ -0,0 +1 @@ | |||
parser=org.apache.tools.ant.SunParser |
@@ -0,0 +1,114 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
import java.util.*; | |||
/** | |||
* Call Ant in a sub-project | |||
* | |||
* @author costin@dnt.ro | |||
*/ | |||
public class Ant extends Task { | |||
private String dir = null; | |||
private String antFile = null; | |||
private String target = null; | |||
/** | |||
* Do the execution. | |||
*/ | |||
public void execute() throws BuildException { | |||
Project p1=new Project(); | |||
p1.setOutputLevel( project.getOutputLevel() ); | |||
// set user-define properties | |||
Hashtable prop1=project.getProperties(); | |||
Enumeration e = prop1.keys(); | |||
while (e.hasMoreElements()) { | |||
String arg = (String)e.nextElement(); | |||
String value = (String)prop1.get(arg); | |||
p1.setUserProperty(arg, value); | |||
} | |||
p1.setBasedir( dir ); | |||
p1.setUserProperty( "basedir" , dir); | |||
if(antFile==null) antFile= dir + "/build.xml"; | |||
ProjectHelper.configureProject(p1, new File(antFile)); | |||
if (target == null) { | |||
target = p1.getDefaultTarget(); | |||
} | |||
p1.executeTarget( target ); | |||
} | |||
public void setDir(String d) { | |||
this.dir = d; | |||
} | |||
public void setAntfile(String s) { | |||
this.antFile = s; | |||
} | |||
public void setTarget(String s) { | |||
this.target = s; | |||
} | |||
} |
@@ -0,0 +1,91 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
import java.util.*; | |||
/** | |||
* | |||
* | |||
* @author costin@eng.sun.com | |||
*/ | |||
public class Chmod extends Task { | |||
private File srcFile; | |||
private String mod; | |||
public void setSrc(String src) { | |||
srcFile = project.resolveFile(src); | |||
} | |||
public void setPerm(String perm) { | |||
mod=perm; | |||
} | |||
public void execute() throws BuildException { | |||
try { | |||
// XXX if OS=unix | |||
if (System.getProperty("path.separator").equals(":")) | |||
Runtime.getRuntime().exec("chmod " + mod + " " + srcFile ); | |||
} catch (IOException ioe) { | |||
// ignore, but warn | |||
System.out.println("Error chmod" + ioe.toString() ); | |||
} | |||
} | |||
} |
@@ -0,0 +1,153 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
import java.util.*; | |||
/** | |||
* | |||
* | |||
* @author duncan@x180.com | |||
*/ | |||
public class Copydir extends Task { | |||
public File srcDir; | |||
public File destDir; | |||
private Hashtable filecopyList = new Hashtable(); | |||
private Vector ignoreList = new Vector(); | |||
public void setSrc(String src) { | |||
srcDir = project.resolveFile(src); | |||
} | |||
public void setDest(String dest) { | |||
destDir = project.resolveFile(dest); | |||
} | |||
public void execute() throws BuildException { | |||
scanDir(srcDir, destDir); | |||
if (filecopyList.size() > 0) { | |||
project.log("Copying " + filecopyList.size() + " files to " | |||
+ destDir.getAbsolutePath()); | |||
Enumeration enum = filecopyList.keys(); | |||
while (enum.hasMoreElements()) { | |||
String fromFile = (String)enum.nextElement(); | |||
String toFile = (String)filecopyList.get(fromFile); | |||
try { | |||
copyFile(fromFile, toFile); | |||
} catch (IOException ioe) { | |||
String msg = "Failed to copy " + fromFile + " to " + toFile | |||
+ " due to " + ioe.getMessage(); | |||
throw new BuildException(msg); | |||
} | |||
} | |||
} | |||
} | |||
/** | |||
List of filenames and directory names to not | |||
include in the final .jar file. They should be either | |||
, or " " (space) separated. | |||
<p> | |||
For example: | |||
<p> | |||
ignore="package.html, foo.class" | |||
<p> | |||
The ignored files will be logged. | |||
@author Jon S. Stevens <a href="mailto:jon@clearink.com">jon@clearink.com</a> | |||
*/ | |||
public void setIgnore(String ignoreString) { | |||
ignoreString = ignoreString; | |||
if (ignoreString != null && ignoreString.length() > 0) { | |||
StringTokenizer tok = | |||
new StringTokenizer(ignoreString, ", ", false); | |||
while (tok.hasMoreTokens()) { | |||
ignoreList.addElement ( tok.nextToken().trim() ); | |||
} | |||
} | |||
} | |||
private void scanDir(File from, File to) { | |||
String[] list = from.list(new DesirableFilter()); | |||
if (list == null) { | |||
project.log("Source directory " + srcDir.getAbsolutePath() | |||
+ " does not exist.", "copydir", Project.MSG_WARN); | |||
return; | |||
} | |||
for (int i = 0; i < list.length; i++) { | |||
String filename = list[i]; | |||
File srcFile = new File(from, filename); | |||
File destFile = new File(to, filename); | |||
if ( ! ignoreList.contains(filename) ) { | |||
if (srcFile.isDirectory()) { | |||
scanDir(srcFile, destFile); | |||
} else { | |||
if (srcFile.lastModified() > destFile.lastModified()) { | |||
filecopyList.put(srcFile.getAbsolutePath(), | |||
destFile.getAbsolutePath()); | |||
} | |||
} | |||
} else { | |||
project.log("Copydir Ignored: " + filename, Project.MSG_WARN); | |||
} | |||
} | |||
} | |||
} |
@@ -0,0 +1,92 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
import java.util.*; | |||
/** | |||
* | |||
* | |||
* @author duncan@x180.com | |||
*/ | |||
public class Copyfile extends Task { | |||
public File srcFile; | |||
public File destFile; | |||
public void setSrc(String src) { | |||
srcFile = project.resolveFile(src); | |||
} | |||
public void setDest(String dest) { | |||
destFile = project.resolveFile(dest); | |||
} | |||
public void execute() throws BuildException { | |||
if (srcFile.lastModified() > destFile.lastModified()) { | |||
try { | |||
copyFile(srcFile, destFile); | |||
} catch (IOException ioe) { | |||
String msg = "Error copying file: " + srcFile.getAbsolutePath() | |||
+ " due to " + ioe.getMessage(); | |||
throw new BuildException(msg); | |||
} | |||
} | |||
} | |||
} |
@@ -0,0 +1,139 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
/** | |||
* | |||
* | |||
* @author costin@dnt.ro | |||
* @author stefano@apache.org | |||
*/ | |||
public class Cvs extends Task { | |||
private String cvsRoot; | |||
private String dest; | |||
private String pack; | |||
private String tag; | |||
public void execute() throws BuildException { | |||
// XXX: we should use JCVS (www.ice.com/JCVS) instead of command line | |||
// execution so that we don't rely on having native CVS stuff around (SM) | |||
try { | |||
String ant=project.getProperty("ant.home"); | |||
if(ant==null) throw new BuildException("Needs ant.home"); | |||
StringBuffer sb=new StringBuffer(); | |||
sb.append(ant).append("/bin/antRun ").append(dest); | |||
sb.append(" cvs -d ").append( cvsRoot ).append(" checkout "); | |||
if(tag!=null) | |||
sb.append("-r ").append(tag).append(" "); | |||
sb.append( pack ); | |||
String command=sb.toString(); | |||
project.log(command, "cvs", Project.MSG_WARN); | |||
// exec command on system runtime | |||
Process proc = Runtime.getRuntime().exec( command); | |||
// ignore response | |||
InputStreamReader isr=new InputStreamReader(proc.getInputStream()); | |||
BufferedReader din = new BufferedReader(isr); | |||
// pipe CVS output to STDOUT | |||
String line; | |||
while((line = din.readLine()) != null) { | |||
project.log(line, "cvs", Project.MSG_WARN); | |||
//System.out.println(line); | |||
} | |||
proc.waitFor(); | |||
int err = proc.exitValue(); | |||
if (err != 0) { | |||
throw new BuildException( "Error " + err + "in " + command); | |||
} | |||
} catch (IOException ioe) { | |||
ioe.printStackTrace(); | |||
throw new BuildException("Error checking out: " + pack ); | |||
} catch (InterruptedException ex) { | |||
} | |||
} | |||
public void setCvsRoot(String root) { | |||
this.cvsRoot = root; | |||
} | |||
public void setDest(String dest) { | |||
this.dest = dest; | |||
} | |||
public void setPackage(String p) { | |||
this.pack = p; | |||
} | |||
public void setTag(String p) { | |||
this.tag = p; | |||
} | |||
} | |||
@@ -0,0 +1,115 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
/** | |||
* | |||
* | |||
* @author duncan@x180.com | |||
*/ | |||
public class Deltree extends Task { | |||
private File dir; | |||
public void setDir(String dirName) { | |||
dir = project.resolveFile(dirName); | |||
} | |||
public void execute() throws BuildException { | |||
project.log("Deleting: " + dir.getAbsolutePath()); | |||
if (dir.exists()) { | |||
if (!dir.isDirectory()) { | |||
dir.delete(); | |||
return; | |||
// String msg = "Given dir: " + dir.getAbsolutePath() + | |||
// " is not a dir"; | |||
// throw new BuildException(msg); | |||
} | |||
try { | |||
removeDir(dir); | |||
} catch (IOException ioe) { | |||
String msg = "Unable to delete " + dir.getAbsolutePath(); | |||
throw new BuildException(msg); | |||
} | |||
} | |||
} | |||
private void removeDir(File dir) throws IOException { | |||
// check to make sure that the given dir isn't a symlink | |||
// the comparison of absolute path and canonical path | |||
// catches this | |||
if (dir.getCanonicalPath().equals(dir.getAbsolutePath())) { | |||
String[] list = dir.list(); | |||
for (int i = 0; i < list.length; i++) { | |||
String s = list[i]; | |||
File f = new File(dir, s); | |||
if (f.isDirectory()) { | |||
removeDir(f); | |||
} else { | |||
f.delete(); | |||
} | |||
} | |||
} | |||
dir.delete(); | |||
} | |||
} | |||
@@ -0,0 +1,75 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
import java.net.*; | |||
/** | |||
* Echo | |||
* | |||
* @author costin@dnt.ro | |||
*/ | |||
public class Echo extends Task { | |||
String message; // required | |||
public void execute() throws BuildException { | |||
System.out.println(message); | |||
} | |||
public void setMessage(String d) { | |||
this.message=d; | |||
} | |||
} |
@@ -0,0 +1,147 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
/** | |||
* | |||
* | |||
* @author duncan@x180.com | |||
*/ | |||
public class Exec extends Task { | |||
private String os; | |||
private String out; | |||
private String dir; | |||
private String command; | |||
public void execute() throws BuildException { | |||
try { | |||
// test if os match | |||
String myos=System.getProperty("os.name"); | |||
project.log("Myos= " + myos, Project.MSG_VERBOSE); | |||
if( ( os != null ) && ( os.indexOf(myos) < 0 ) ){ | |||
// this command will be executed only on the specified OS | |||
project.log("Not found in " + os, Project.MSG_VERBOSE); | |||
return; | |||
} | |||
// XXX: we should use JCVS (www.ice.com/JCVS) instead of command line | |||
// execution so that we don't rely on having native CVS stuff around (SM) | |||
String ant=project.getProperty("ant.home"); | |||
if(ant==null) throw new BuildException("Needs ant.home"); | |||
String antRun = project.resolveFile(ant + "/bin/antRun").toString(); | |||
if (myos.toLowerCase().indexOf("windows")>=0) | |||
antRun=antRun+".bat"; | |||
command=antRun + " " + project.resolveFile(dir) + " " + command; | |||
project.log(command, Project.MSG_VERBOSE); | |||
// exec command on system runtime | |||
Process proc = Runtime.getRuntime().exec( command); | |||
// ignore response | |||
InputStreamReader isr=new InputStreamReader(proc.getInputStream()); | |||
BufferedReader din = new BufferedReader(isr); | |||
PrintWriter fos=null; | |||
if( out!=null ) { | |||
fos=new PrintWriter( new FileWriter( out ) ); | |||
project.log("Output redirected to " + out, Project.MSG_VERBOSE); | |||
} | |||
// pipe CVS output to STDOUT | |||
String line; | |||
while((line = din.readLine()) != null) { | |||
if( fos==null) | |||
project.log(line, "exec", Project.MSG_INFO); | |||
else | |||
fos.println(line); | |||
} | |||
if(fos!=null) | |||
fos.close(); | |||
proc.waitFor(); | |||
int err = proc.exitValue(); | |||
if (err != 0) { | |||
project.log("Result: " + err, "exec", Project.MSG_ERR); | |||
} | |||
} catch (IOException ioe) { | |||
throw new BuildException("Error exec: " + command ); | |||
} catch (InterruptedException ex) { | |||
} | |||
} | |||
public void setDir(String d) { | |||
this.dir = d; | |||
} | |||
public void setOs(String os) { | |||
this.os = os; | |||
} | |||
public void setCommand(String command) { | |||
this.command = command; | |||
} | |||
public void setOutput(String out) { | |||
this.out = out; | |||
} | |||
} |
@@ -0,0 +1,118 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
import java.util.zip.*; | |||
/** | |||
* Unzip a file. | |||
* | |||
* @author costin@dnt.ro | |||
*/ | |||
public class Expand extends Task { | |||
String dest; // req | |||
String source; // req | |||
// XXX move it to util or tools | |||
public void execute() throws BuildException { | |||
try { | |||
File srcF=project.resolveFile(source); | |||
File dir=project.resolveFile(dest); | |||
project.log("Expanding: " + srcF + " into " + dir, Project.MSG_INFO); | |||
// code from WarExpand | |||
ZipInputStream zis = new ZipInputStream(new FileInputStream(srcF)); | |||
ZipEntry ze = null; | |||
while ((ze = zis.getNextEntry()) != null) { | |||
try { | |||
File f = new File(dir, project.translatePath(ze.getName())); | |||
project.log("expand-file " + ze.getName() , "expand", Project.MSG_VERBOSE ); | |||
// create intermediary directories - sometimes zip don't add them | |||
File dirF=new File(f.getParent()); | |||
dirF.mkdirs(); | |||
if (ze.isDirectory()) { | |||
f.mkdirs(); | |||
} else { | |||
byte[] buffer = new byte[1024]; | |||
int length = 0; | |||
FileOutputStream fos = new FileOutputStream(f); | |||
while ((length = zis.read(buffer)) >= 0) { | |||
fos.write(buffer, 0, length); | |||
} | |||
fos.close(); | |||
} | |||
} catch( FileNotFoundException ex ) { | |||
System.out.println("FileNotFoundException: " + ze.getName() ); | |||
} | |||
} | |||
project.log("</log:expand>", Project.MSG_VERBOSE ); | |||
} catch (IOException ioe) { | |||
ioe.printStackTrace(); | |||
} | |||
} | |||
public void setDest(String d) { | |||
this.dest=d; | |||
} | |||
public void setSrc(String s) { | |||
this.source = s; | |||
} | |||
} |
@@ -0,0 +1,123 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
import java.util.Enumeration; | |||
import java.util.StringTokenizer; | |||
import java.util.Vector; | |||
import java.util.zip.*; | |||
/** | |||
* Allows one to create a .gz file from another file such as a tar file. | |||
* | |||
* @author duncan@x180.com | |||
* @author Jon S. Stevens <a href="mailto:jon@clearink.com">jon@clearink.com</a> | |||
*/ | |||
public class GZip extends Task { | |||
private File zipFile; | |||
private File source; | |||
private Vector items = new Vector(); | |||
private Vector ignoreList = new Vector(); | |||
public void setZipfile(String zipFilename) { | |||
zipFile = project.resolveFile(zipFilename); | |||
} | |||
public void setSrc(String src) { | |||
source = project.resolveFile(src); | |||
} | |||
public void execute() throws BuildException { | |||
project.log("Building gzip: " + zipFile.getAbsolutePath()); | |||
try { | |||
GZIPOutputStream zOut = new GZIPOutputStream(new FileOutputStream(zipFile)); | |||
if (source.isDirectory()) { | |||
project.log ("Cannot Gzip a directory!"); | |||
} else { | |||
zipFile(source, zOut); | |||
} | |||
// close up | |||
zOut.close(); | |||
} catch (IOException ioe) { | |||
String msg = "Problem creating gzip " + ioe.getMessage(); | |||
throw new BuildException(msg); | |||
} | |||
} | |||
private void zipFile(InputStream in, GZIPOutputStream zOut) | |||
throws IOException | |||
{ | |||
byte[] buffer = new byte[8 * 1024]; | |||
int count = 0; | |||
do { | |||
zOut.write(buffer, 0, count); | |||
count = in.read(buffer, 0, buffer.length); | |||
} while (count != -1); | |||
} | |||
private void zipFile(File file, GZIPOutputStream zOut) | |||
throws IOException | |||
{ | |||
FileInputStream fIn = new FileInputStream(file); | |||
zipFile(fIn, zOut); | |||
fIn.close(); | |||
} | |||
} |
@@ -0,0 +1,105 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
import java.net.*; | |||
/** | |||
* Get a particular source. | |||
* | |||
* @author costin@dnt.ro | |||
*/ | |||
public class Get extends Task { | |||
String source; // required | |||
String dest; // required | |||
String verbose; | |||
public void execute() throws BuildException { | |||
try { | |||
URL url=new URL( source ); | |||
project.log("Getting: " + source); | |||
File destF=new File(dest); | |||
FileOutputStream fos = new FileOutputStream(destF); | |||
InputStream is=url.openStream(); | |||
byte[] buffer = new byte[100 * 1024]; | |||
int length; | |||
while ((length = is.read(buffer)) >= 0) { | |||
fos.write(buffer, 0, length); | |||
if( "true".equals(verbose)) System.out.print("."); | |||
} | |||
if( "true".equals(verbose)) System.out.println(); | |||
fos.close(); | |||
is.close(); | |||
} catch (IOException ioe) { | |||
ioe.printStackTrace(); | |||
throw new BuildException(ioe.toString()); | |||
} | |||
} | |||
public void setSrc(String d) { | |||
this.source=d; | |||
} | |||
public void setDest(String dest) { | |||
this.dest = dest; | |||
} | |||
public void setVerbose(String v) { | |||
verbose=v; | |||
} | |||
} |
@@ -0,0 +1,113 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
import java.util.zip.*; | |||
/** | |||
* | |||
* | |||
* @author duncan@x180.com | |||
*/ | |||
public class Jar extends Zip { | |||
private File manifest; | |||
public void setJarfile(String jarFilename) { | |||
super.setZipfile(jarFilename); | |||
super.archiveType = "jar"; | |||
} | |||
public void setManifest(String manifestFilename) { | |||
manifest = project.resolveFile(manifestFilename); | |||
} | |||
protected void initZipOutputStream(ZipOutputStream zOut) | |||
throws IOException, BuildException | |||
{ | |||
zOut.setMethod(ZipOutputStream.DEFLATED); | |||
// add manifest first | |||
if (manifest != null) { | |||
ZipEntry ze = new ZipEntry("META-INF/"); | |||
zOut.putNextEntry(ze); | |||
zipFile(manifest, zOut, "META-INF/MANIFEST.MF"); | |||
} else { | |||
ZipEntry ze = new ZipEntry("META-INF/"); | |||
zOut.putNextEntry(ze); | |||
String s = "/org/apache/tools/ant/defaultManifest.mf"; | |||
InputStream in = this.getClass().getResourceAsStream(s); | |||
if ( in == null ) | |||
throw new BuildException ( "Could not find: " + s ); | |||
zipFile(in, zOut, "META-INF/MANIFEST.MF"); | |||
} | |||
} | |||
protected void zipDir(File dir, ZipOutputStream zOut, String vPath) | |||
throws IOException | |||
{ | |||
// First add directory to zip entry | |||
if( ! "META-INF/".equals(vPath) ) { | |||
// we already added a META-INF | |||
ZipEntry ze = new ZipEntry(vPath); | |||
zOut.putNextEntry(ze); | |||
} | |||
super.zipDir(dir, zOut, vPath); | |||
} | |||
} |
@@ -0,0 +1,158 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.lang.reflect.*; | |||
import java.util.*; | |||
/** | |||
* This task acts as a loader for java applications but allows to use the same JVM | |||
* for the called application thus resulting in much faster operation. | |||
* | |||
* @author Stefano Mazzocchi <a href="mailto:stefano@pache.org">stefano@apache.org</a> | |||
*/ | |||
public class Java extends Task { | |||
private String classname = null; | |||
private String args = null; | |||
/** | |||
* Do the execution. | |||
*/ | |||
public void execute() throws BuildException { | |||
project.log("Calling " + classname, "java", project.MSG_VERBOSE); | |||
if (classname == null) { | |||
throw new BuildException("Class name must not be null."); | |||
} | |||
Vector argList = tokenize(args); | |||
project.log("Java args: " + argList.toString(), "java", project.MSG_VERBOSE); | |||
run(classname, argList); | |||
} | |||
/** | |||
* Set the source file. | |||
*/ | |||
public void setClass(String s) { | |||
this.classname = s; | |||
} | |||
/** | |||
* Set the destination file. | |||
*/ | |||
public void setArgs(String s) { | |||
this.args = s; | |||
} | |||
/** | |||
* Executes the given classname with the given arguments as it | |||
* was a command line application. | |||
*/ | |||
protected void run(String classname, Vector args) throws BuildException { | |||
try { | |||
Class[] param = { Class.forName("[Ljava.lang.String;") }; | |||
Class c = Class.forName(classname); | |||
Method main = c.getMethod("main", param); | |||
Object[] a = { array(args) }; | |||
main.invoke(null, a); | |||
} catch (NullPointerException e) { | |||
throw new BuildException("Could not find main() method in " + classname); | |||
} catch (ClassNotFoundException e) { | |||
throw new BuildException("Could not find " + classname + ". Make sure you have it in your classpath"); | |||
} catch (InvocationTargetException e) { | |||
Throwable t = e.getTargetException(); | |||
if (!(t instanceof SecurityException)) { | |||
throw new BuildException(t.toString()); | |||
} | |||
// else ignore because the security exception is thrown | |||
// if the invoked application tried to call System.exit() | |||
} catch (Exception e) { | |||
throw new BuildException(e.toString()); | |||
} | |||
} | |||
/** | |||
* Transforms an argument string into a vector of strings. | |||
*/ | |||
protected Vector tokenize(String args) { | |||
Vector v = new Vector(); | |||
StringTokenizer t = new StringTokenizer(args, " "); | |||
while (t.hasMoreTokens()) { | |||
v.addElement(t.nextToken()); | |||
} | |||
return v; | |||
} | |||
/** | |||
* Transforms a vector of strings into an array. | |||
*/ | |||
protected String[] array(Vector v) { | |||
String[] s = new String[v.size()]; | |||
Enumeration e = v.elements(); | |||
for (int i = 0; e.hasMoreElements(); i++) { | |||
s[i] = (String) e.nextElement(); | |||
} | |||
return s; | |||
} | |||
} |
@@ -0,0 +1,574 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
import java.util.Enumeration; | |||
import java.util.Hashtable; | |||
import java.util.StringTokenizer; | |||
import java.util.Vector; | |||
/** | |||
* Task to compile Java source files. This task can take the following | |||
* arguments: | |||
* <ul> | |||
* <li>sourcedir | |||
* <li>destdir | |||
* <li>deprecation | |||
* <li>classpath | |||
* <li>bootclasspath | |||
* <li>extdirs | |||
* <li>optimize | |||
* <li>debug | |||
* <li>target | |||
* </ul> | |||
* Of these arguments, the <b>sourcedir</b> and <b>destdir</b> are required. | |||
* <p> | |||
* When this task executes, it will recursively scan the sourcedir and | |||
* destdir looking for Java source files to compile. This task makes its | |||
* compile decision based on timestamp. Any other file in the | |||
* sourcedir will be copied to the destdir allowing support files to be | |||
* located properly in the classpath. | |||
* | |||
* @author duncan@x180.com | |||
*/ | |||
public class Javac extends Task { | |||
private File srcDir; | |||
private File destDir; | |||
private String compileClasspath; | |||
private boolean debug = false; | |||
private boolean optimize = false; | |||
private boolean deprecation = false; | |||
private String target; | |||
private String bootclasspath; | |||
private String extdirs; | |||
private Vector compileList = new Vector(); | |||
private Hashtable filecopyList = new Hashtable(); | |||
/** | |||
* Set the source dir to find the source Java files. | |||
*/ | |||
public void setSrcdir(String srcDirName) { | |||
srcDir = project.resolveFile(srcDirName); | |||
} | |||
/** | |||
* Set the destination directory into which the Java source | |||
* files should be compiled. | |||
*/ | |||
public void setDestdir(String destDirName) { | |||
destDir = project.resolveFile(destDirName); | |||
} | |||
/** | |||
* Set the classpath to be used for this compilation. | |||
*/ | |||
public void setClasspath(String classpath) { | |||
compileClasspath = Project.translatePath(classpath); | |||
} | |||
/** | |||
* Sets the bootclasspath that will be used to compile the classes | |||
* against. | |||
*/ | |||
public void setBootclasspath(String bootclasspath) { | |||
this.bootclasspath = Project.translatePath(bootclasspath); | |||
} | |||
/** | |||
* Sets the extension directories that will be used during the | |||
* compilation. | |||
*/ | |||
public void setExtdirs(String extdirs) { | |||
this.extdirs = Project.translatePath(extdirs); | |||
} | |||
/** | |||
* Set the deprecation flag. Valid strings are "on", "off", "true", and | |||
* "false". | |||
*/ | |||
public void setDeprecation(String deprecation) { | |||
if (deprecation.equalsIgnoreCase("on") || | |||
deprecation.equalsIgnoreCase("true")) { | |||
this.deprecation = true; | |||
} else { | |||
this.deprecation = false; | |||
} | |||
} | |||
/** | |||
* Set the debug flag. Valid strings are "on", "off", "true", and "false". | |||
*/ | |||
public void setDebug(String debugString) { | |||
if (debugString.equalsIgnoreCase("on") || | |||
debugString.equalsIgnoreCase("true")) { | |||
debug = true; | |||
} else { | |||
debug = false; | |||
} | |||
} | |||
/** | |||
* Set the optimize flag. Valid strings are "on", "off", "true", and | |||
* "false". | |||
*/ | |||
public void setOptimize(String optimizeString) { | |||
if (optimizeString.equalsIgnoreCase("on") || | |||
optimizeString.equalsIgnoreCase("true")) { | |||
optimize = true; | |||
} else { | |||
optimize = false; | |||
} | |||
} | |||
/** | |||
* Sets the target VM that the classes will be compiled for. Valid | |||
* strings are "1.1", "1.2", and "1.3". | |||
*/ | |||
public void setTarget(String target) { | |||
this.target = target; | |||
} | |||
/** | |||
* Executes the task. | |||
*/ | |||
public void execute() throws BuildException { | |||
// first off, make sure that we've got a srcdir and destdir | |||
if (srcDir == null || destDir == null ) { | |||
String msg = "srcDir and destDir attributes must be set!"; | |||
throw new BuildException(msg); | |||
} | |||
// scan source and dest dirs to build up both copy lists and | |||
// compile lists | |||
scanDir(srcDir, destDir); | |||
// compile the source files | |||
String compiler = project.getProperty("build.compiler"); | |||
if (compiler == null) { | |||
if (Project.getJavaVersion().startsWith("1.3")) { | |||
compiler = "modern"; | |||
} else { | |||
compiler = "classic"; | |||
} | |||
} | |||
if (compileList.size() > 0) { | |||
project.log("Compiling " + compileList.size() + | |||
" source files to " + destDir); | |||
if (compiler.equalsIgnoreCase("classic")) { | |||
doClassicCompile(); | |||
} else if (compiler.equalsIgnoreCase("modern")) { | |||
doModernCompile(); | |||
} else if (compiler.equalsIgnoreCase("jikes")) { | |||
doJikesCompile(); | |||
} else { | |||
String msg = "Don't know how to use compiler " + compiler; | |||
throw new BuildException(msg); | |||
} | |||
} | |||
// copy the support files | |||
if (filecopyList.size() > 0) { | |||
project.log("Copying " + filecopyList.size() + | |||
" support files to " + destDir.getAbsolutePath()); | |||
Enumeration enum = filecopyList.keys(); | |||
while (enum.hasMoreElements()) { | |||
String fromFile = (String)enum.nextElement(); | |||
String toFile = (String)filecopyList.get(fromFile); | |||
try { | |||
copyFile(fromFile, toFile); | |||
} catch (IOException ioe) { | |||
String msg = "Failed to copy " + fromFile + " to " + toFile | |||
+ " due to " + ioe.getMessage(); | |||
throw new BuildException(msg); | |||
} | |||
} | |||
} | |||
} | |||
/** | |||
* Scans the directory looking for source files to be compiled and | |||
* support files to be copied. | |||
*/ | |||
private void scanDir(File srcDir, File destDir) { | |||
String[] list = srcDir.list(new DesirableFilter()); | |||
int len = (list==null ? 0 : list.length); | |||
for (int i = 0; i < len; i++) { | |||
String filename = list[i]; | |||
File srcFile = new File(srcDir, filename); | |||
File destFile = new File(destDir, filename); | |||
if (srcFile.isDirectory()) { | |||
// it's a dir, scan that recursively | |||
scanDir(srcFile, destFile); | |||
} else { | |||
// it's a file, see if we compile it or just copy it | |||
if (filename.endsWith(".java")) { | |||
File classFile = | |||
new File(destDir, | |||
filename.substring(0, | |||
filename.indexOf(".java")) | |||
+ ".class"); | |||
if (srcFile.lastModified() > classFile.lastModified()) { | |||
compileList.addElement(srcFile.getAbsolutePath()); | |||
} | |||
} else { | |||
if (srcFile.lastModified() > destFile.lastModified()) { | |||
filecopyList.put(srcFile.getAbsolutePath(), | |||
destFile.getAbsolutePath()); | |||
} | |||
} | |||
} | |||
} | |||
} | |||
/** | |||
* Builds the compilation classpath. | |||
*/ | |||
// XXX | |||
// we need a way to not use the current classpath. | |||
private String getCompileClasspath() { | |||
StringBuffer classpath = new StringBuffer(); | |||
// add dest dir to classpath so that previously compiled and | |||
// untouched classes are on classpath | |||
//classpath.append(sourceDir.getAbsolutePath()); | |||
//classpath.append(File.pathSeparator); | |||
classpath.append(destDir.getAbsolutePath()); | |||
// add our classpath to the mix | |||
if (compileClasspath != null) { | |||
addExistingToClasspath(classpath,compileClasspath); | |||
} | |||
// add the system classpath | |||
addExistingToClasspath(classpath,System.getProperty("java.class.path")); | |||
return classpath.toString(); | |||
} | |||
/** | |||
* Takes a classpath-like string, and adds each element of | |||
* this string to a new classpath, if the components exist. | |||
* Components that don't exist, aren't added. | |||
* We do this, because jikes issues warnings for non-existant | |||
* files/dirs in his classpath, and these warnings are pretty | |||
* annoying. | |||
* @param target - target classpath | |||
* @param source - source classpath | |||
* to get file objects. | |||
*/ | |||
private void addExistingToClasspath(StringBuffer target,String source) { | |||
StringTokenizer tok = new StringTokenizer(source, | |||
System.getProperty("path.separator"), false); | |||
while (tok.hasMoreTokens()) { | |||
File f = project.resolveFile(tok.nextToken()); | |||
if (f.exists()) { | |||
target.append(File.pathSeparator); | |||
target.append(f.getAbsolutePath()); | |||
} else { | |||
project.log("Dropping from classpath: "+ | |||
f.getAbsolutePath(),project.MSG_VERBOSE); | |||
} | |||
} | |||
} | |||
/** | |||
* Peforms a copmile using the classic compiler that shipped with | |||
* JDK 1.1 and 1.2. | |||
*/ | |||
private void doClassicCompile() throws BuildException { | |||
project.log("Using classic compiler", project.MSG_VERBOSE); | |||
String classpath = getCompileClasspath(); | |||
Vector argList = new Vector(); | |||
if (deprecation == true) | |||
argList.addElement("-deprecation"); | |||
argList.addElement("-d"); | |||
argList.addElement(destDir.getAbsolutePath()); | |||
argList.addElement("-classpath"); | |||
// Just add "sourcepath" to classpath ( for JDK1.1 ) | |||
if (Project.getJavaVersion().startsWith("1.1")) { | |||
argList.addElement(classpath + File.pathSeparator + | |||
srcDir.getAbsolutePath()); | |||
} else { | |||
argList.addElement(classpath); | |||
argList.addElement("-sourcepath"); | |||
argList.addElement(srcDir.getAbsolutePath()); | |||
if (target != null) { | |||
argList.addElement("-target"); | |||
argList.addElement(target); | |||
} | |||
} | |||
if (debug) { | |||
argList.addElement("-g"); | |||
} | |||
if (optimize) { | |||
argList.addElement("-O"); | |||
} | |||
if (bootclasspath != null) { | |||
argList.addElement("-bootclasspath"); | |||
argList.addElement(bootclasspath); | |||
} | |||
if (extdirs != null) { | |||
argList.addElement("-extdirs"); | |||
argList.addElement(extdirs); | |||
} | |||
project.log("Compilation args: " + argList.toString(), | |||
project.MSG_VERBOSE); | |||
String[] args = new String[argList.size() + compileList.size()]; | |||
int counter = 0; | |||
for (int i = 0; i < argList.size(); i++) { | |||
args[i] = (String)argList.elementAt(i); | |||
counter++; | |||
} | |||
// XXX | |||
// should be using system independent line feed! | |||
StringBuffer niceSourceList = new StringBuffer("Files to be compiled:" | |||
+ "\r\n"); | |||
Enumeration enum = compileList.elements(); | |||
while (enum.hasMoreElements()) { | |||
args[counter] = (String)enum.nextElement(); | |||
niceSourceList.append(" " + args[counter] + "\r\n"); | |||
counter++; | |||
} | |||
project.log(niceSourceList.toString(), project.MSG_VERBOSE); | |||
// XXX | |||
// provide the compiler a different message sink - namely our own | |||
JavacOutputStream jos = new JavacOutputStream(project); | |||
sun.tools.javac.Main compiler = | |||
new sun.tools.javac.Main(jos, "javac"); | |||
compiler.compile(args); | |||
if (jos.getErrorFlag()) { | |||
String msg = "Compile failed, messages should have been provided."; | |||
throw new BuildException(msg); | |||
} | |||
} | |||
/** | |||
* Performs a compile using the newer compiler that ships with JDK 1.3 | |||
*/ | |||
private void doModernCompile() throws BuildException { | |||
project.log("Performing a Modern Compile"); | |||
} | |||
/** | |||
* Performs a compile using the Jikes compiler from IBM.. | |||
* Mostly of this code is identical to doClassicCompile() | |||
* However, it does not support all options like | |||
* bootclasspath, extdirs, deprecation and so on, because | |||
* there is no option in jikes and I don't understand | |||
* what they should do. | |||
* | |||
* It has been successfully tested with jikes 1.10 | |||
* | |||
* @author skanthak@muehlheim.de | |||
*/ | |||
private void doJikesCompile() throws BuildException { | |||
project.log("Using jikes compiler",project.MSG_VERBOSE); | |||
String classpath = getCompileClasspath(); | |||
Vector argList = new Vector(); | |||
if (deprecation == true) | |||
argList.addElement("-deprecation"); | |||
// We want all output on stdout to make | |||
// parsing easier | |||
argList.addElement("-Xstdout"); | |||
argList.addElement("-d"); | |||
argList.addElement(destDir.getAbsolutePath()); | |||
argList.addElement("-classpath"); | |||
// Jikes has no option for source-path so we | |||
// will add it to classpath. | |||
// XXX is this correct? | |||
argList.addElement(classpath+File.pathSeparator + | |||
srcDir.getAbsolutePath()); | |||
if (debug) { | |||
argList.addElement("-g"); | |||
} | |||
if (optimize) { | |||
argList.addElement("-O"); | |||
} | |||
/** | |||
* XXX | |||
* Perhaps we shouldn't use properties for these | |||
* two options (emacs mode and warnings), | |||
* but include it in the javac directive? | |||
*/ | |||
/** | |||
* Jikes has the nice feature to print error | |||
* messages in a form readable by emacs, so | |||
* that emcas can directly set the cursor | |||
* to the place, where the error occured. | |||
*/ | |||
boolean emacsMode = false; | |||
String emacsProperty = project.getProperty("build.compiler.emacs"); | |||
if (emacsProperty != null && | |||
(emacsProperty.equalsIgnoreCase("on") || | |||
emacsProperty.equalsIgnoreCase("true")) | |||
) { | |||
emacsMode = true; | |||
} | |||
/** | |||
* Jikes issues more warnings that javac, for | |||
* example, when you have files in your classpath | |||
* that don't exist. As this is often the case, these | |||
* warning can be pretty annoying. | |||
*/ | |||
boolean warnings = true; | |||
String warningsProperty = project.getProperty("build.compiler.warnings"); | |||
if (warningsProperty != null && | |||
(warningsProperty.equalsIgnoreCase("off") || | |||
warningsProperty.equalsIgnoreCase("false")) | |||
) { | |||
warnings = false; | |||
} | |||
if (emacsMode) | |||
argList.addElement("+E"); | |||
if (!warnings) | |||
argList.addElement("-nowarn"); | |||
project.log("Compilation args: " + argList.toString(), | |||
project.MSG_VERBOSE); | |||
String[] args = new String[argList.size() + compileList.size()]; | |||
int counter = 0; | |||
for (int i = 0; i < argList.size(); i++) { | |||
args[i] = (String)argList.elementAt(i); | |||
counter++; | |||
} | |||
// XXX | |||
// should be using system independent line feed! | |||
StringBuffer niceSourceList = new StringBuffer("Files to be compiled:" | |||
+ "\r\n"); | |||
Enumeration enum = compileList.elements(); | |||
while (enum.hasMoreElements()) { | |||
args[counter] = (String)enum.nextElement(); | |||
niceSourceList.append(" " + args[counter] + "\r\n"); | |||
counter++; | |||
} | |||
project.log(niceSourceList.toString(), project.MSG_VERBOSE); | |||
// XXX | |||
// provide the compiler a different message sink - namely our own | |||
JikesOutputParser jop = new JikesOutputParser(project,emacsMode); | |||
Jikes compiler = new Jikes(jop,"jikes"); | |||
compiler.compile(args); | |||
if (jop.getErrorFlag()) { | |||
String msg = "Compile failed, messages should have been provided."; | |||
throw new BuildException(msg); | |||
} | |||
} | |||
} |
@@ -0,0 +1,125 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
/** | |||
* Serves as an output stream to Javac. This let's us print messages | |||
* out to the project and detect whether or not Javac had an error | |||
* while compiling. | |||
* | |||
* @author James Duncan Davidson (duncan@x180.com) | |||
*/ | |||
class JavacOutputStream extends OutputStream { | |||
private Project project; | |||
private StringBuffer line; | |||
private boolean errorFlag = false; | |||
/** | |||
* Constructs a new JavacOutputStream with the given project | |||
* as the output source for messages. | |||
*/ | |||
JavacOutputStream(Project project) { | |||
this.project = project; | |||
line = new StringBuffer(); | |||
} | |||
/** | |||
* Write a character to the output stream. This method looks | |||
* to make sure that there isn't an error being reported and | |||
* will flush each line of input out to the project's log stream. | |||
*/ | |||
public void write(int c) throws IOException { | |||
char cc = (char)c; | |||
if (cc == '\r' || cc == '\n') { | |||
// line feed | |||
if (line.length() > 0) { | |||
processLine(); | |||
} | |||
} else { | |||
line.append(cc); | |||
} | |||
} | |||
/** | |||
* Processes a line of input and determines if an error occured. | |||
*/ | |||
private void processLine() { | |||
String s = line.toString(); | |||
if (s.indexOf("error") > -1) { | |||
errorFlag = true; | |||
} | |||
project.log(s); | |||
line = new StringBuffer(); | |||
} | |||
/** | |||
* Returns the error status of the compile. If no errors occured, | |||
* this method will return false, else this method will return true. | |||
*/ | |||
boolean getErrorFlag() { | |||
return errorFlag; | |||
} | |||
} | |||
@@ -0,0 +1,564 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
import java.util.*; | |||
/** | |||
* This Task makes it easy to generate javadocs for a collection of source code. | |||
* | |||
* Current known limitations are: | |||
* - multiple source path breaks operation | |||
* - patterns must be of the form "xxx.*", every other pattern doesn't work. | |||
* - the java comment-stripper reader is horribly slow | |||
* - stupid javadoc calls System.exit() and breaks Ant execution | |||
* (two solutions: security manager and decompilation for better hooks) | |||
* - there is no control on arguments sanity since they are left | |||
* to the javadoc implementation. | |||
* | |||
* @author Jon S. Stevens <a href="mailto:jon@clearink.com">jon@clearink.com</a> | |||
* @author Stefano Mazzocchi <a href="mailto:stefano@pache.org">stefano@apache.org</a> | |||
*/ | |||
public class Javadoc2 extends Java { | |||
private String sourcePath = null; | |||
private File destDir = null; | |||
private File overviewFile = null; | |||
private String sourceFiles = null; | |||
private String packageNames = null; | |||
private boolean pub = false; | |||
private boolean prot = false; | |||
private boolean pack = false; | |||
private boolean priv = false; | |||
private boolean author = true; | |||
private boolean version = true; | |||
private String doclet = null; | |||
private File docletpath = null; | |||
private boolean old = false; | |||
private String classpath = null; | |||
private String bootclasspath = null; | |||
private String extdirs = null; | |||
private boolean verbose = false; | |||
private String locale = null; | |||
private String encoding = null; | |||
private boolean use = false; | |||
private boolean splitindex = false; | |||
private String windowtitle = null; | |||
private String doctitle = null; | |||
private String header = null; | |||
private String footer = null; | |||
private String bottom = null; | |||
private String link = null; | |||
private String linkoffline = null; | |||
private String group = null; | |||
private boolean nodeprecated = false; | |||
private boolean nodeprecatedlist = false; | |||
private boolean notree = false; | |||
private boolean noindex = false; | |||
private boolean nohelp = false; | |||
private boolean nonavbar = false; | |||
private File stylesheetfile = null; | |||
private File helpfile = null; | |||
private String docencoding = null; | |||
private Vector compileList = new Vector(); | |||
public void setSourcepath(String src) { | |||
sourcePath = project.translatePath(src); | |||
} | |||
public void setDestdir(String src) { | |||
destDir = project.resolveFile(src); | |||
} | |||
public void setSourcefiles(String src) { | |||
sourceFiles = src; | |||
} | |||
public void setPackagenames(String src) { | |||
packageNames = src; | |||
} | |||
public void setOverview(String src) { | |||
overviewFile = project.resolveFile(src); | |||
} | |||
public void setPublic(String src) { | |||
pub = new Boolean(src).booleanValue(); | |||
} | |||
public void setProtected(String src) { | |||
prot = new Boolean(src).booleanValue(); | |||
} | |||
public void setPackage(String src) { | |||
pack = new Boolean(src).booleanValue(); | |||
} | |||
public void setPrivate(String src) { | |||
priv = new Boolean(src).booleanValue(); | |||
} | |||
public void setDoclet(String src) { | |||
doclet = src; | |||
} | |||
public void setDocletPath(String src) { | |||
docletpath = project.resolveFile(src); | |||
} | |||
public void setOld(String src) { | |||
old = new Boolean(src).booleanValue(); | |||
} | |||
public void setClasspath(String src) { | |||
classpath = Project.translatePath(src); | |||
} | |||
public void setBootclasspath(String src) { | |||
bootclasspath = Project.translatePath(src); | |||
} | |||
public void setExtdirs(String src) { | |||
extdirs = src; | |||
} | |||
public void setVerbose(String src) { | |||
verbose = new Boolean(src).booleanValue(); | |||
} | |||
public void setLocale(String src) { | |||
locale = src; | |||
} | |||
public void setEncoding(String src) { | |||
encoding = src; | |||
} | |||
public void setVersion(String src) { | |||
version = new Boolean(src).booleanValue(); | |||
} | |||
public void setUse(String src) { | |||
use = new Boolean(src).booleanValue(); | |||
} | |||
public void setAuthor(String src) { | |||
author = new Boolean(src).booleanValue(); | |||
} | |||
public void setSplitindex(String src) { | |||
splitindex = new Boolean(src).booleanValue(); | |||
} | |||
public void setWindowtitle(String src) { | |||
windowtitle = src; | |||
} | |||
public void setDoctitle(String src) { | |||
doctitle = src; | |||
} | |||
public void setHeader(String src) { | |||
header = src; | |||
} | |||
public void setFooter(String src) { | |||
footer = src; | |||
} | |||
public void setBottom(String src) { | |||
bottom = src; | |||
} | |||
public void setLink(String src) { | |||
link = src; | |||
} | |||
public void setLinkoffline(String src) { | |||
linkoffline = src; | |||
} | |||
public void setGroup(String src) { | |||
group = src; | |||
} | |||
public void setNodeprecated(String src) { | |||
nodeprecated = new Boolean(src).booleanValue(); | |||
} | |||
public void setNodeprecatedlist(String src) { | |||
nodeprecatedlist = new Boolean(src).booleanValue(); | |||
} | |||
public void setNotree(String src) { | |||
notree = new Boolean(src).booleanValue(); | |||
} | |||
public void setNoindex(String src) { | |||
noindex = new Boolean(src).booleanValue(); | |||
} | |||
public void setNohelp(String src) { | |||
nohelp = new Boolean(src).booleanValue(); | |||
} | |||
public void setNonavbar(String src) { | |||
nonavbar = new Boolean(src).booleanValue(); | |||
} | |||
public void setStylesheetfile(String src) { | |||
stylesheetfile = project.resolveFile(src); | |||
} | |||
public void setDocencoding(String src) { | |||
docencoding = src; | |||
} | |||
public void execute() throws BuildException { | |||
if (sourcePath == null && destDir == null ) { | |||
String msg = "sourcePath and destDir attributes must be set!"; | |||
throw new BuildException(msg); | |||
} | |||
project.log("Generating Javadoc", project.MSG_INFO); | |||
Vector argList = new Vector(); | |||
if (overviewFile != null) { | |||
argList.addElement("-overview"); | |||
argList.addElement(overviewFile.getAbsolutePath()); | |||
} | |||
if (pub) | |||
argList.addElement ("-public"); | |||
if (prot) | |||
argList.addElement ("-protected"); | |||
if (pack) | |||
argList.addElement ("-package"); | |||
if (priv) | |||
argList.addElement ("-private"); | |||
if (old) | |||
argList.addElement ("-1.1"); | |||
if (verbose) | |||
argList.addElement ("-verbose"); | |||
if (version) | |||
argList.addElement ("-version"); | |||
if (use) | |||
argList.addElement ("-use"); | |||
if (author) | |||
argList.addElement ("-author"); | |||
if (splitindex) | |||
argList.addElement ("-splitindex"); | |||
if (nodeprecated) | |||
argList.addElement ("-nodeprecated"); | |||
if (nodeprecatedlist) | |||
argList.addElement ("-nodeprecatedlist"); | |||
if (notree) | |||
argList.addElement ("-notree"); | |||
if (noindex) | |||
argList.addElement ("-noindex"); | |||
if (nohelp) | |||
argList.addElement ("-nohelp"); | |||
if (nonavbar) | |||
argList.addElement ("-nonavbar"); | |||
if (doclet != null) { | |||
argList.addElement("-doclet"); | |||
argList.addElement(doclet); | |||
} | |||
argList.addElement("-classpath"); | |||
if (classpath != null) { | |||
argList.addElement(classpath); | |||
} else { | |||
argList.addElement(System.getProperty("java.class.path")); | |||
} | |||
if (bootclasspath != null) { | |||
argList.addElement("-bootclasspath"); | |||
argList.addElement(bootclasspath); | |||
} | |||
if (extdirs != null) { | |||
argList.addElement("-extdirs"); | |||
argList.addElement(extdirs); | |||
} | |||
if (locale != null) { | |||
argList.addElement("-locale"); | |||
argList.addElement(locale); | |||
} | |||
if (encoding != null) { | |||
argList.addElement("-encoding"); | |||
argList.addElement(encoding); | |||
} | |||
if (windowtitle != null) { | |||
argList.addElement("-windowtitle"); | |||
argList.addElement(windowtitle); | |||
} | |||
if (doctitle != null) { | |||
argList.addElement("-doctitle"); | |||
argList.addElement(doctitle); | |||
} | |||
if (header != null) { | |||
argList.addElement("-header"); | |||
argList.addElement(header); | |||
} | |||
if (footer != null) { | |||
argList.addElement("-footer"); | |||
argList.addElement(footer); | |||
} | |||
if (bottom != null) { | |||
argList.addElement("-bottom"); | |||
argList.addElement(bottom); | |||
} | |||
if (link != null) { | |||
argList.addElement("-link"); | |||
argList.addElement(link); | |||
} | |||
if (linkoffline != null) { | |||
argList.addElement("-linkoffline"); | |||
argList.addElement(linkoffline); | |||
} | |||
if (group != null) { | |||
argList.addElement("-group"); | |||
argList.addElement(group); | |||
} | |||
if (stylesheetfile != null) { | |||
argList.addElement("-stylesheetfile"); | |||
argList.addElement(stylesheetfile.getAbsolutePath()); | |||
} | |||
if (helpfile != null) { | |||
argList.addElement("-helpfile"); | |||
argList.addElement(helpfile.getAbsolutePath()); | |||
} | |||
if (docencoding != null) { | |||
argList.addElement("-docencoding"); | |||
argList.addElement(docencoding); | |||
} | |||
if (destDir != null) { | |||
argList.addElement("-d"); | |||
argList.addElement(destDir.getAbsolutePath()); | |||
} | |||
if (sourcePath != null) { | |||
argList.addElement("-sourcepath"); | |||
argList.addElement(sourcePath); | |||
} | |||
if ((packageNames != null) && (packageNames.length() > 0)) { | |||
Vector packages = new Vector(); | |||
StringTokenizer tok = new StringTokenizer(packageNames, ",", false); | |||
while (tok.hasMoreTokens()) { | |||
String name = tok.nextToken().trim(); | |||
if (name.endsWith(".*")) { | |||
packages.addElement(name); | |||
} else { | |||
argList.addElement(name); | |||
} | |||
} | |||
if (packages.size() > 0) { | |||
evaluatePackages(sourcePath, packages, argList); | |||
} | |||
} | |||
if ((sourceFiles != null) && (sourceFiles.length() > 0)) { | |||
StringTokenizer tok = new StringTokenizer(sourceFiles, ",", false); | |||
while (tok.hasMoreTokens()) { | |||
argList.addElement(tok.nextToken().trim()); | |||
} | |||
} | |||
project.log("Javadoc args: " + argList.toString(), "javadoc", project.MSG_VERBOSE); | |||
project.log("Javadoc execution", project.MSG_INFO); | |||
run("com.sun.tools.javadoc.Main", argList); | |||
} | |||
/** | |||
* Given a source path, a list of package patterns, fill the given list | |||
* with the packages found in that path subdirs matching one of the given | |||
* patterns. | |||
*/ | |||
private void evaluatePackages(String source, Vector packages, Vector list) { | |||
project.log("Parsing source files for packages (will take a while)", project.MSG_INFO); | |||
Hashtable map = mapClasses(new File(source)); | |||
Enumeration e = map.keys(); | |||
while (e.hasMoreElements()) { | |||
String pack = (String) e.nextElement(); | |||
for (int i = 0; i < packages.size(); i++) { | |||
if (matches(pack, (String) packages.elementAt(i))) { | |||
list.addElement(pack); | |||
break; | |||
} | |||
} | |||
} | |||
} | |||
/** | |||
* Implements the pattern matching. For now it's only able to | |||
* guarantee that "aaa.bbb.ccc" matches "aaa.*" and "aaa.bbb.*" | |||
* FIXME: this code needs much improvement. | |||
*/ | |||
private boolean matches(String string, String pattern) { | |||
return string.startsWith(pattern.substring(0, pattern.length() - 2)); | |||
} | |||
/** | |||
* Returns an hashtable of packages linked to the last parsed | |||
* file in that package. This map is use to return a list of unique | |||
* packages as map keys. | |||
*/ | |||
private Hashtable mapClasses(File path) { | |||
Hashtable map = new Hashtable(); | |||
Vector files = new Vector(); | |||
getFiles(path, files); | |||
Enumeration e = files.elements(); | |||
while (e.hasMoreElements()) { | |||
File file = (File) e.nextElement(); | |||
String packageName = getPackageName(file); | |||
if (packageName != null) map.put(packageName, file); | |||
} | |||
return map; | |||
} | |||
/** | |||
* Fills the given vector with files under the given path filtered | |||
* by the given file filter. | |||
*/ | |||
private void getFiles(File path, Vector list) { | |||
if (!path.exists()) { | |||
throw new BuildException("Path " + path + " does not exist."); | |||
} | |||
String[] files = path.list(); | |||
String cwd = path.getName() + System.getProperty("path.separator"); | |||
if (files != null) { | |||
int count = 0; | |||
for (int i = 0; i < files.length; i++) { | |||
File file = new File(cwd + files[i]); | |||
if (file.isDirectory()) { | |||
getFiles(file, list); | |||
} else if (files[i].endsWith(".java")) { | |||
count++; | |||
list.addElement(files[i]); | |||
} | |||
} | |||
if (count > 0) { | |||
project.log("found " + count + " source files in " + path, "javadoc", project.MSG_VERBOSE); | |||
} | |||
} else { | |||
throw new BuildException("Error occurred during " + path + " evaluation."); | |||
} | |||
} | |||
/** | |||
* Return the package name of the given java source file. | |||
* This method performs valid java parsing to figure out the package. | |||
*/ | |||
private String getPackageName(File file) { | |||
String name = null; | |||
try { | |||
BufferedReader reader = new BufferedReader(new JavaReader(new FileReader(file))); | |||
String line; | |||
while (true) { | |||
line = reader.readLine(); | |||
if (line == null) { | |||
project.log("Could not evaluate package for " + file, "javadoc", project.MSG_WARN); | |||
return null; | |||
} | |||
if (line.trim().startsWith("package ")) { | |||
name = line.substring(8, line.indexOf(";")).trim(); | |||
break; | |||
} | |||
} | |||
reader.close(); | |||
} catch (Exception e) { | |||
project.log("Exception " + e + " parsing " + file, "javadoc", project.MSG_WARN); | |||
return null; | |||
} | |||
project.log(file + " --> " + name, "javadoc", project.MSG_VERBOSE); | |||
return name; | |||
} | |||
/** | |||
* This is a java comment stripper reader that filters comments out | |||
* for more significant java parsing. | |||
*/ | |||
class JavaReader extends FilterReader { | |||
public JavaReader(Reader in) { | |||
super(in); | |||
} | |||
public int read() throws IOException { | |||
int c = in.read(); | |||
if (c == '/') { | |||
c = in.read(); | |||
if (c == '*') { | |||
while (true) { | |||
c = in.read(); | |||
if (c == '*') { | |||
c = in.read(); | |||
if (c == '/') { | |||
c = in.read(); | |||
break; | |||
} | |||
} | |||
} | |||
} | |||
} | |||
return c; | |||
} | |||
/** | |||
* FIXME: this method is the one called by BuffereReader and it should | |||
* use char[] based methods instead of relying on single char ones | |||
* to speed up execution. Please, make this faster. | |||
*/ | |||
public int read(char cbuf[], int off, int len) throws IOException { | |||
for (int i = 0; i < len; i++) { | |||
int c = read(); | |||
if (c == -1) { | |||
if (i == 0) { | |||
return -1; | |||
} else { | |||
return i; | |||
} | |||
} | |||
cbuf[off + i] = (char) c; | |||
} | |||
return len; | |||
} | |||
public long skip(long n) throws IOException { | |||
for (long i = 0; i < n; i++) { | |||
if (in.read() == -1) return i; | |||
} | |||
return n; | |||
} | |||
} | |||
} |
@@ -0,0 +1,47 @@ | |||
package org.apache.tools.ant.taskdefs; | |||
import java.io.*; | |||
/** | |||
* Encapsulates a Jikes compiler, by | |||
* directly executing an external process. | |||
* @author skanthak@muehlheim.de | |||
*/ | |||
public class Jikes { | |||
protected JikesOutputParser jop; | |||
protected String command; | |||
/** | |||
* Constructs a new Jikes obect. | |||
* @param jop - Parser to send jike's output to | |||
* @param command - name of jikes executeable | |||
*/ | |||
protected Jikes(JikesOutputParser jop,String command) { | |||
super(); | |||
this.jop = jop; | |||
this.command = command; | |||
} | |||
/** | |||
* Do the compile with the specified arguments. | |||
* @param args - arguments to pass to process on command line | |||
*/ | |||
protected void compile(String[] args) { | |||
String[] commandArray = new String[args.length+1]; | |||
commandArray[0] = command; | |||
System.arraycopy(args,0,commandArray,1,args.length); | |||
// We assume, that everything jikes writes goes to | |||
// standard output, not to standard error. The option | |||
// -Xstdout that is given to Jikes in Javac.doJikesCompile() | |||
// should guarantee this. At least I hope so. :) | |||
try { | |||
Process jikes = Runtime.getRuntime().exec(commandArray); | |||
BufferedReader reader = new BufferedReader(new InputStreamReader(jikes.getInputStream())); | |||
jop.parseOutput(reader); | |||
} catch (IOException e) { | |||
// Where could we log this to? We don't have an instance | |||
// of project. Perhaps we should add one to our constructor? | |||
} | |||
} | |||
} |
@@ -0,0 +1,103 @@ | |||
package org.apache.tools.ant.taskdefs; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
/** | |||
* Parses output from jikes and | |||
* passes errors and warnings | |||
* into the right logging channels of Project. | |||
* | |||
* TODO: | |||
* Parsing could be much better | |||
* @author skanthak@muehlheim.de | |||
*/ | |||
public class JikesOutputParser { | |||
protected Project project; | |||
protected boolean errorFlag = false; // no errors so far | |||
protected int errors,warnings; | |||
protected boolean error = false; | |||
protected boolean emacsMode; | |||
/** | |||
* Construct a new Parser object | |||
* @param project - project in whichs context we are called | |||
*/ | |||
protected JikesOutputParser(Project project, boolean emacsMode) { | |||
super(); | |||
this.project = project; | |||
this.emacsMode = emacsMode; | |||
} | |||
/** | |||
* Parse the output of a jikes compiler | |||
* @param reader - Reader used to read jikes's output | |||
*/ | |||
protected void parseOutput(BufferedReader reader) throws IOException { | |||
if (emacsMode) | |||
parseEmacsOutput(reader); | |||
else | |||
parseStandardOutput(reader); | |||
} | |||
private void parseStandardOutput(BufferedReader reader) throws IOException { | |||
String line; | |||
String lower; | |||
// We assume, that every output, jike does, stands for an error/warning | |||
// XXX | |||
// Is this correct? | |||
// TODO: | |||
// A warning line, that shows code, which contains a variable | |||
// error will cause some trouble. The parser should definitely | |||
// be much better. | |||
while ((line = reader.readLine()) != null) { | |||
lower = line.toLowerCase(); | |||
if (line.trim().equals("")) | |||
continue; | |||
if (lower.indexOf("error") != -1) | |||
setError(true); | |||
else if (lower.indexOf("warning") != -1) | |||
setError(false); | |||
else { | |||
// If we don't know the type of the line | |||
// and we are in emacs mode, it will be | |||
// an error, because in this mode, jikes won't | |||
// always print "error", but sometimes other | |||
// keywords like "Syntax". We should look for | |||
// all those keywords. | |||
if (emacsMode) | |||
setError(true); | |||
} | |||
log(line); | |||
} | |||
} | |||
private void parseEmacsOutput(BufferedReader reader) throws IOException { | |||
// This may change, if we add advanced parsing capabilities. | |||
parseStandardOutput(reader); | |||
} | |||
private void setError(boolean err) { | |||
error = err; | |||
if(error) | |||
errorFlag = true; | |||
} | |||
private void log(String line) { | |||
if (!emacsMode) { | |||
project.log("", (error ? Project.MSG_ERR : Project.MSG_WARN)); | |||
} | |||
project.log(line, (error ? Project.MSG_ERR : Project.MSG_WARN)); | |||
} | |||
/** | |||
* Indicate if there were errors during the compile | |||
* @return if errors ocured | |||
*/ | |||
protected boolean getErrorFlag() { | |||
return errorFlag; | |||
} | |||
} |
@@ -0,0 +1,202 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
import java.util.*; | |||
/** | |||
* Keyword substitution. Input file is written to output file. | |||
* Do not make input file same as output file. | |||
* Keywords in input files look like this: @foo@. See the docs for the | |||
* setKeys method to understand how to do the substitutions. | |||
* | |||
* @author Jon S. Stevens <a href="mailto:jon@clearink.com">jon@clearink.com</a> | |||
*/ | |||
public class KeySubst extends Task { | |||
private File source = null; | |||
private File dest = null; | |||
private String sep = "*"; | |||
private Hashtable replacements = new Hashtable(); | |||
/** | |||
Do the execution. | |||
*/ | |||
public void execute() throws BuildException { | |||
project.log("Performing Substitions"); | |||
if ( source == null || dest == null ) { | |||
project.log("Source and destinations must not be null"); | |||
return; | |||
} | |||
BufferedReader br = null; | |||
BufferedWriter bw = null; | |||
try { | |||
br = new BufferedReader(new FileReader(source)); | |||
dest.delete(); | |||
bw = new BufferedWriter(new FileWriter(dest)); | |||
String line = null; | |||
String newline = null; | |||
int length; | |||
line = br.readLine(); | |||
while (line != null) { | |||
if ( line.length() == 0 ) { | |||
bw.newLine(); | |||
} else { | |||
newline = KeySubst.replace ( line, replacements ); | |||
bw.write ( newline ); | |||
bw.newLine(); | |||
} | |||
line = br.readLine(); | |||
} | |||
bw.flush(); | |||
bw.close(); | |||
br.close(); | |||
} catch (IOException ioe) { | |||
ioe.printStackTrace(); | |||
} | |||
} | |||
/** | |||
Set the source file. | |||
*/ | |||
public void setSrc(String s) { | |||
this.source=project.resolveFile(s); | |||
} | |||
/** | |||
Set the destination file. | |||
*/ | |||
public void setDest(String dest) { | |||
this.dest = project.resolveFile(dest); | |||
} | |||
/** | |||
Sets the seperator between name=value arguments | |||
in setKeys(). By default it is "*". | |||
*/ | |||
public void setSep(String sep) { | |||
this.sep = sep; | |||
} | |||
/** | |||
Format string is like this: | |||
<p> | |||
name=value*name2=value | |||
<p> | |||
Names are case sensitive. | |||
<p> | |||
Use the setSep() method to change the * to something else | |||
if you need to use * as a name or value. | |||
*/ | |||
public void setKeys(String keys) { | |||
if (keys != null && keys.length() > 0) { | |||
StringTokenizer tok = | |||
new StringTokenizer(keys, this.sep, false); | |||
while (tok.hasMoreTokens()) { | |||
String token = tok.nextToken().trim(); | |||
StringTokenizer itok = | |||
new StringTokenizer(token, "=", false); | |||
String name = itok.nextToken(); | |||
String value = itok.nextToken(); | |||
// project.log ( "Name: " + name ); | |||
// project.log ( "Value: " + value ); | |||
replacements.put ( name, value ); | |||
} | |||
} | |||
} | |||
public static void main(String[] args) | |||
{ | |||
try{ | |||
Hashtable hash = new Hashtable(); | |||
hash.put ( "VERSION", "1.0.3" ); | |||
hash.put ( "b", "ffff" ); | |||
System.out.println ( KeySubst.replace ( "$f ${VERSION} f ${b} jj $", hash ) ); | |||
}catch ( Exception e) | |||
{ | |||
e.printStackTrace(); | |||
} | |||
} | |||
/** | |||
Does replacement on text using the hashtable of keys. | |||
@returns the string with the replacements in it. | |||
*/ | |||
public static String replace ( String origString, Hashtable keys ) | |||
throws BuildException | |||
{ | |||
StringBuffer finalString=new StringBuffer(); | |||
int index=0; | |||
int i = 0; | |||
String key = null; | |||
while ((index = origString.indexOf("${", i)) > -1) { | |||
key = origString.substring(index + 2, origString.indexOf("}", index+3)); | |||
finalString.append (origString.substring(i, index)); | |||
if ( keys.containsKey ( key ) ) { | |||
finalString.append (keys.get(key)); | |||
} else { | |||
finalString.append ( "${" ); | |||
finalString.append ( key ); | |||
finalString.append ( "}" ); | |||
} | |||
i = index + 3 + key.length(); | |||
} | |||
finalString.append (origString.substring(i)); | |||
return finalString.toString(); | |||
} | |||
} |
@@ -0,0 +1,87 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.File; | |||
/** | |||
* Creates a given directory. | |||
* | |||
* @author duncan@x180.com | |||
*/ | |||
public class Mkdir extends Task { | |||
private String dirName; | |||
public void execute() throws BuildException { | |||
File dir = project.resolveFile(dirName); | |||
if (!dir.exists()) { | |||
boolean result = dir.mkdirs(); | |||
if (result == false) { | |||
String msg = "Directory " + dirName + " creation was not " + | |||
"succesful for an unknown reason"; | |||
throw new BuildException(msg); | |||
} | |||
project.log("Created dir: " + dir.getAbsolutePath()); | |||
} | |||
} | |||
public void setDir(String dirName) { | |||
this.dirName = dirName; | |||
} | |||
} |
@@ -0,0 +1,151 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
import java.util.*; | |||
/** | |||
* Will set a Project property. Used to be a hack in ProjectHelper | |||
* | |||
* @author costin@dnt.ro | |||
*/ | |||
public class Property extends Task { | |||
String name; | |||
String value; | |||
String file; | |||
String resource; | |||
// needs to be set at XML-reading time, | |||
// no runtime action | |||
public void execute() throws BuildException { | |||
} | |||
// XXX ugly - needs to be fixed | |||
/** Called after each setter, will set the property at read-time | |||
*/ | |||
private void initTimeSetProperty() { | |||
try { | |||
if((name!=null) && (value!=null) ) { | |||
String value1= ProjectHelper.replaceProperties(value, project.getProperties()); | |||
project.setProperty( name,value1); | |||
} | |||
if( file!=null) | |||
loadFile( file ); | |||
if( resource!=null) | |||
loadResource( resource ); | |||
} catch (Exception ex) { | |||
ex.printStackTrace(); | |||
} | |||
} | |||
public void setName( String name) { | |||
this.name=name; | |||
initTimeSetProperty(); | |||
} | |||
public void setValue(String v) { | |||
value=v; | |||
initTimeSetProperty(); | |||
} | |||
public void setFile(String v) { | |||
file=v; | |||
initTimeSetProperty(); | |||
} | |||
public void setResource(String v) { | |||
resource=v; | |||
initTimeSetProperty(); | |||
} | |||
private void loadFile( String name ) { | |||
Properties props = new Properties(); | |||
project.log("Loading " + name, project.MSG_VERBOSE); | |||
try { | |||
if( new File(name).exists() ) | |||
props.load(new FileInputStream( name )); | |||
} catch(Exception ex) { | |||
ex.printStackTrace(); | |||
} | |||
addProperties( props ); | |||
} | |||
private void loadResource( String name ) { | |||
Properties props = new Properties(); | |||
project.log("Resource Loading " + name, | |||
project.MSG_VERBOSE); | |||
try { | |||
InputStream is=this.getClass().getResourceAsStream(name); | |||
if(is!=null) | |||
props.load(is); | |||
} catch (Exception ex) { | |||
ex.printStackTrace(); | |||
} | |||
addProperties( props ); | |||
} | |||
private void addProperties( Properties props) { | |||
Enumeration e=props.keys(); | |||
while( e.hasMoreElements() ) { | |||
String name=(String)e.nextElement(); | |||
String value=(String)props.getProperty(name); | |||
String value1= ProjectHelper.replaceProperties(value, project.getProperties()); | |||
project.setProperty( name, value1); | |||
} | |||
} | |||
} |
@@ -0,0 +1,153 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
import java.util.*; | |||
/** | |||
* Replaces all the occurrences of the given string token with the given | |||
* string value of the indicated file. | |||
* | |||
* @author Stefano Mazzocchi <a href="mailto:stefano@apache.org">stefano@apache.org</a> | |||
*/ | |||
public class Replace extends Task { | |||
private File src = null; | |||
private File dest = null; | |||
private String token = null; | |||
private String value = ""; | |||
/** | |||
* Do the execution. | |||
*/ | |||
public void execute() throws BuildException { | |||
project.log("Replacing " + token + " --> " + value); | |||
if (src == null || token == null ) { | |||
project.log("File and token must not be null"); | |||
return; | |||
} | |||
if (dest == null) { | |||
throw new BuildException("Error creating temp file."); | |||
} | |||
try { | |||
BufferedReader br = new BufferedReader(new FileReader(src)); | |||
BufferedWriter bw = new BufferedWriter(new FileWriter(dest)); | |||
String line; | |||
while (true) { | |||
line = br.readLine(); | |||
if (line == null) break; | |||
if (line.length() != 0) bw.write(replace(line)); | |||
bw.newLine(); | |||
} | |||
bw.flush(); | |||
bw.close(); | |||
br.close(); | |||
src.delete(); | |||
dest.renameTo(src); | |||
} catch (IOException ioe) { | |||
ioe.printStackTrace(); | |||
} | |||
} | |||
/** | |||
* Set the source file. | |||
*/ | |||
public void setFile(String file) { | |||
this.src = project.resolveFile(file); | |||
this.dest = project.resolveFile(file + ".temp"); | |||
} | |||
/** | |||
* Set the string token to replace. | |||
*/ | |||
public void setToken(String token) { | |||
this.token = token; | |||
} | |||
/** | |||
* Set the string value to use as token replacement. | |||
*/ | |||
public void setValue(String value) { | |||
this.value = value; | |||
} | |||
/** | |||
* Perform the token substitution. | |||
*/ | |||
private String replace (String orig) { | |||
StringBuffer buffer = new StringBuffer(); | |||
int start = 0, end = 0; | |||
while ((end = orig.indexOf(token, start)) > -1) { | |||
buffer.append(orig.substring(start, end)); | |||
buffer.append(value); | |||
start = end + token.length(); | |||
} | |||
buffer.append(orig.substring(start)); | |||
return buffer.toString(); | |||
} | |||
} |
@@ -0,0 +1,113 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
/** | |||
* | |||
* | |||
* @author duncan@x180.com | |||
*/ | |||
public class Rmic extends Task { | |||
private String base; | |||
private String classname; | |||
public void setBase(String base) { | |||
this.base = base; | |||
} | |||
public void setClass(String classname) { | |||
this.classname = classname; | |||
} | |||
public void execute() throws BuildException { | |||
String pathsep = System.getProperty("path.separator"); | |||
StringBuffer classpath = new StringBuffer(); | |||
File baseFile = project.resolveFile(base); | |||
classpath.append(baseFile.getAbsolutePath()); | |||
classpath.append(pathsep); | |||
classpath.append(System.getProperty("java.class.path")); | |||
// in jdk 1.2, the system classes are not on the visible classpath. | |||
if (Project.getJavaVersion().startsWith("1.2")) { | |||
String bootcp = System.getProperty("sun.boot.class.path"); | |||
if (bootcp != null) { | |||
classpath.append(pathsep); | |||
classpath.append(bootcp); | |||
} | |||
} | |||
// XXX | |||
// need to provide an input stream that we read in from! | |||
sun.rmi.rmic.Main compiler = new sun.rmi.rmic.Main(System.out, "rmic"); | |||
String[] args = new String[5]; | |||
args[0] = "-d"; | |||
args[1] = baseFile.getAbsolutePath(); | |||
args[2] = "-classpath"; | |||
args[3] = classpath.toString(); | |||
args[4] = classname; | |||
compiler.compile(args); | |||
} | |||
} | |||
@@ -0,0 +1,96 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
import java.util.*; | |||
/** | |||
* Define a new task - name and class | |||
* | |||
* @author costin@dnt.ro | |||
*/ | |||
public class Taskdef extends Task { | |||
String name; | |||
String value; | |||
public void execute() throws BuildException { | |||
try { | |||
if (name==null || value==null ) { | |||
String msg = "name or class attributes of taskdef element " | |||
+ "are undefined"; | |||
throw new BuildException(msg); | |||
} | |||
try { | |||
Class taskClass = Class.forName(value); | |||
project.addTaskDefinition(name, taskClass); | |||
} catch (ClassNotFoundException cnfe) { | |||
String msg = "taskdef class " + value + | |||
" cannot be found"; | |||
throw new BuildException(msg); | |||
} | |||
} catch (Exception ex) { | |||
ex.printStackTrace(); | |||
} | |||
} | |||
public void setName( String name) { | |||
this.name=name; | |||
} | |||
public void setClass(String v) { | |||
value=v; | |||
} | |||
} |
@@ -0,0 +1,91 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
import java.util.*; | |||
/** | |||
* Will set TSTAMP and DSTAMP | |||
* | |||
* @author costin@dnt.ro | |||
*/ | |||
public class Tstamp extends Task { | |||
public void execute() throws BuildException { | |||
try { | |||
Calendar d=Calendar.getInstance(); | |||
StringBuffer tstamp=new StringBuffer(); | |||
tstamp.append( d.get(Calendar.YEAR)); | |||
if(d.get(Calendar.MONTH) < 9) tstamp.append("0"); | |||
tstamp.append( 1+d.get(Calendar.MONTH)); | |||
if( d.get(Calendar.DAY_OF_MONTH) < 10 ) tstamp.append("0"); | |||
tstamp.append(d.get(Calendar.DAY_OF_MONTH)); | |||
project.setProperty( "DSTAMP" , tstamp.toString()); | |||
if( d.get(Calendar.HOUR_OF_DAY) < 10 ) tstamp.append("0"); | |||
tstamp.append( d.get(Calendar.HOUR_OF_DAY)); | |||
if( d.get(Calendar.MINUTE) < 10 ) tstamp.append("0"); | |||
tstamp.append(d.get(Calendar.MINUTE)); | |||
project.setProperty( "TSTAMP" , tstamp.toString()); | |||
} catch (Exception ex) { | |||
ex.printStackTrace(); | |||
} | |||
} | |||
} |
@@ -0,0 +1,230 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 1999 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", "Tomcat", 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; | |||
import org.apache.tools.ant.*; | |||
import java.io.*; | |||
import java.util.Enumeration; | |||
import java.util.StringTokenizer; | |||
import java.util.Vector; | |||
import java.util.zip.*; | |||
/** | |||
* Same as the Jar task, but creates .zip files without the MANIFEST | |||
* stuff that .jar files have. | |||
* | |||
* @author James Davidson <a href="mailto:duncan@x180.com">duncan@x180.com</a> | |||
* @author Jon S. Stevens <a href="mailto:jon@clearink.com">jon@clearink.com</a> | |||
*/ | |||
public class Zip extends Task { | |||
private File zipFile; | |||
private File baseDir; | |||
private Vector items = new Vector(); | |||
private File manifest; | |||
private Vector ignoreList = new Vector(); | |||
private boolean allItems = false; | |||
protected String archiveType = "zip"; | |||
/** | |||
This is the name/location of where to | |||
create the .zip file. | |||
*/ | |||
public void setZipfile(String zipFilename) { | |||
zipFile = project.resolveFile(zipFilename); | |||
} | |||
/** | |||
This is the base directory to look in for | |||
things to zip. | |||
*/ | |||
public void setBasedir(String baseDirname) { | |||
baseDir = project.resolveFile(baseDirname); | |||
} | |||
/** | |||
Set this to be the items in the base directory | |||
that you want to include in the zip archive. | |||
(ie: items="foo, bar, ack.html, f.java"). | |||
You can also specify "*" for the items (ie: items="*") | |||
and it will include all the items in the base directory. | |||
Do not try to have items="*, foo". Also note that | |||
you can specify items to ignore with setIgnore and they | |||
will still be ignored if you choose "*". Sometimes | |||
ignore lists are easier than include lists. ;-) | |||
*/ | |||
public void setItems(String itemString) { | |||
if ( itemString.equals("*") ) { | |||
allItems = true; | |||
} else { | |||
StringTokenizer tok = new StringTokenizer(itemString, ",", false); | |||
while (tok.hasMoreTokens()) { | |||
items.addElement(tok.nextToken().trim()); | |||
} | |||
} | |||
} | |||
/** | |||
List of filenames and directory names to not | |||
include in the final .jar file. They should be either | |||
, or " " (space) separated. | |||
<p> | |||
For example: | |||
<p> | |||
ignore="package.html, foo.class" | |||
<p> | |||
The ignored files will be logged. | |||
@author Jon S. Stevens <a href="mailto:jon@clearink.com">jon@clearink.com</a> | |||
*/ | |||
public void setIgnore(String ignoreString) { | |||
ignoreString = ignoreString; | |||
if (ignoreString != null && ignoreString.length() > 0) { | |||
StringTokenizer tok = | |||
new StringTokenizer(ignoreString, ", ", false); | |||
while (tok.hasMoreTokens()) { | |||
ignoreList.addElement ( tok.nextToken().trim() ); | |||
} | |||
} | |||
} | |||
public void execute() throws BuildException { | |||
project.log("Building " + archiveType + ": " + zipFile.getAbsolutePath()); | |||
try { | |||
ZipOutputStream zOut = new ZipOutputStream(new FileOutputStream(zipFile)); | |||
initZipOutputStream(zOut); | |||
if ( allItems ) { | |||
String[] lst = baseDir.list(); | |||
for (int i=0;i<lst.length;i++) { | |||
items.addElement(lst[i]); | |||
} | |||
} | |||
// add items | |||
Enumeration e = items.elements(); | |||
while (e.hasMoreElements()) { | |||
String s = (String)e.nextElement(); | |||
// check to make sure item is not in ignore list | |||
// shouldn't be ignored here, but just want to make sure | |||
if (! ignoreList.contains(s)) { | |||
File f = new File(baseDir, s); | |||
if (f.isDirectory()) { | |||
zipDir(f, zOut, s + "/"); | |||
} else { | |||
zipFile(f, zOut, s); | |||
} | |||
} else { | |||
project.log("Ignoring: " + s, Project.MSG_WARN); | |||
} | |||
} | |||
// close up | |||
zOut.close(); | |||
} catch (IOException ioe) { | |||
String msg = "Problem creating " + archiveType + " " + ioe.getMessage(); | |||
throw new BuildException(msg); | |||
} | |||
} | |||
protected void initZipOutputStream(ZipOutputStream zOut) | |||
throws IOException, BuildException | |||
{ | |||
zOut.setMethod(ZipOutputStream.DEFLATED); | |||
} | |||
protected void zipDir(File dir, ZipOutputStream zOut, String vPath) | |||
throws IOException | |||
{ | |||
String[] list = dir.list(); | |||
for (int i = 0; i < list.length; i++) { | |||
String f = list[i]; | |||
// check to make sure item is not in ignore list | |||
if (! ignoreList.contains(f)) { | |||
File file = new File(dir, f); | |||
if (file.isDirectory()) { | |||
zipDir(file, zOut, vPath + f + "/"); | |||
} else { | |||
zipFile(file, zOut, vPath + f); | |||
} | |||
} else { | |||
project.log("Ignoring: " + f, Project.MSG_WARN); | |||
} | |||
} | |||
} | |||
protected void zipFile(InputStream in, ZipOutputStream zOut, String vPath) | |||
throws IOException | |||
{ | |||
ZipEntry ze = new ZipEntry(vPath); | |||
zOut.putNextEntry(ze); | |||
byte[] buffer = new byte[8 * 1024]; | |||
int count = 0; | |||
do { | |||
zOut.write(buffer, 0, count); | |||
count = in.read(buffer, 0, buffer.length); | |||
} while (count != -1); | |||
} | |||
protected void zipFile(File file, ZipOutputStream zOut, String vPath) | |||
throws IOException | |||
{ | |||
FileInputStream fIn = new FileInputStream(file); | |||
zipFile(fIn, zOut, vPath); | |||
fIn.close(); | |||
} | |||
} |
@@ -0,0 +1,23 @@ | |||
mkdir=org.apache.tools.ant.taskdefs.Mkdir | |||
javac=org.apache.tools.ant.taskdefs.Javac | |||
chmod=org.apache.tools.ant.taskdefs.Chmod | |||
deltree=org.apache.tools.ant.taskdefs.Deltree | |||
jar=org.apache.tools.ant.taskdefs.Jar | |||
copydir=org.apache.tools.ant.taskdefs.Copydir | |||
copyfile=org.apache.tools.ant.taskdefs.Copyfile | |||
rmic=org.apache.tools.ant.taskdefs.Rmic | |||
cvs=org.apache.tools.ant.taskdefs.Cvs | |||
get=org.apache.tools.ant.taskdefs.Get | |||
expand=org.apache.tools.ant.taskdefs.Expand | |||
echo=org.apache.tools.ant.taskdefs.Echo | |||
javadoc2=org.apache.tools.ant.taskdefs.Javadoc2 | |||
keysubst=org.apache.tools.ant.taskdefs.KeySubst | |||
zip=org.apache.tools.ant.taskdefs.Zip | |||
gzip=org.apache.tools.ant.taskdefs.GZip | |||
replace=org.apache.tools.ant.taskdefs.Replace | |||
java=org.apache.tools.ant.taskdefs.Java | |||
tstamp=org.apache.tools.ant.taskdefs.Tstamp | |||
property=org.apache.tools.ant.taskdefs.Property | |||
taskdef=org.apache.tools.ant.taskdefs.Taskdef | |||
ant=org.apache.tools.ant.taskdefs.Ant | |||
exec=org.apache.tools.ant.taskdefs.Exec |