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 |