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 | |||