ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From dun...@locus.apache.org
Subject cvs commit: jakarta-ant/src/main/org/apache/tools/ant/taskdefs Ant.java Chmod.java Copydir.java Copyfile.java Cvs.java Deltree.java Echo.java Exec.java Expand.java GZip.java Get.java Jar.java Java.java Javac.java JavacOutputStream.java Javadoc2.java Jikes.java JikesOutputParser.java KeySubst.java Mkdir.java Property.java Replace.java Rmic.java Taskdef.java Tstamp.java Zip.java defaults.properties
Date Thu, 13 Jan 2000 10:41:43 GMT
duncan      00/01/13 02:41:43

  Added:       .        bootstrap.bat bootstrap.sh build.bat build.sh
                        build.xml
               src/bin  ant ant.bat antRun antRun.bat
               src/etc  ant.spec manifest pkginfo prototype
               src/main/com/ice/tar InvalidHeaderException.java
                        TarArchive.java TarBuffer.java TarEntry.java
                        TarHeader.java TarProgressDisplay.java
               src/main/org/apache/tools/ant AntSecurityManager.java
                        ApacheParser.java BuildException.java
                        DesirableFilter.java Main.java Map.java Parser.java
                        Project.java ProjectHelper.java SunParser.java
                        Target.java Task.java defaultManifest.mf
                        parser.properties
               src/main/org/apache/tools/ant/taskdefs Ant.java Chmod.java
                        Copydir.java Copyfile.java Cvs.java Deltree.java
                        Echo.java Exec.java Expand.java GZip.java Get.java
                        Jar.java Java.java Javac.java
                        JavacOutputStream.java Javadoc2.java Jikes.java
                        JikesOutputParser.java KeySubst.java Mkdir.java
                        Property.java Replace.java Rmic.java Taskdef.java
                        Tstamp.java Zip.java defaults.properties
  Log:
  initial checkin
  
  Revision  Changes    Path
  1.1                  jakarta-ant/bootstrap.bat
  
  Index: bootstrap.bat
  ===================================================================
  @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
  
  
  
  
  1.1                  jakarta-ant/bootstrap.sh
  
  Index: bootstrap.sh
  ===================================================================
  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}
  
  
  
  
  1.1                  jakarta-ant/build.bat
  
  Index: build.bat
  ===================================================================
  @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
  
  
  
  1.1                  jakarta-ant/build.sh
  
  Index: build.sh
  ===================================================================
  #!/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 $*
  
  
  
  1.1                  jakarta-ant/build.xml
  
  Index: build.xml
  ===================================================================
  <!-- 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>
  
  
  
  
  1.1                  jakarta-ant/src/bin/ant
  
  Index: ant
  ===================================================================
  #! /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 $@
  
  
  
  1.1                  jakarta-ant/src/bin/ant.bat
  
  Index: ant.bat
  ===================================================================
  @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
  
  
  
  1.1                  jakarta-ant/src/bin/antRun
  
  Index: antRun
  ===================================================================
  #! /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
  
  
  
  1.1                  jakarta-ant/src/bin/antRun.bat
  
  Index: antRun.bat
  ===================================================================
  cd %1
  echo %2 %3 %4 %5 %6 %7 %8 %9
  %2 %3 %4 %5 %6 %7 %8 %9 2>&1
  
  
  
  1.1                  jakarta-ant/src/etc/ant.spec
  
  Index: ant.spec
  ===================================================================
  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
  
  
  
  1.1                  jakarta-ant/src/etc/manifest
  
  Index: manifest
  ===================================================================
  Manifest-Version: 1.0
  Main-Class: org.apache.tools.ant.Main
  Class-Path: javac.jar projectx-tr2.jar
  
  
  
  
  
  1.1                  jakarta-ant/src/etc/pkginfo
  
  Index: pkginfo
  ===================================================================
  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=/
  
  
  
  1.1                  jakarta-ant/src/etc/prototype
  
  Index: prototype
  ===================================================================
  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
  
  
  
  1.1                  jakarta-ant/src/main/com/ice/tar/InvalidHeaderException.java
  
  Index: InvalidHeaderException.java
  ===================================================================
  /*
  ** 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 );
  		}
  
  	}
  
  
  
  
  1.1                  jakarta-ant/src/main/com/ice/tar/TarArchive.java
  
  Index: TarArchive.java
  ===================================================================
  /*
  ** 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: 1.1 $
   * @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 );
  		}
  
  	}
  
  
  
  
  1.1                  jakarta-ant/src/main/com/ice/tar/TarBuffer.java
  
  Index: TarBuffer.java
  ===================================================================
  /*
  ** 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: 1.1 $
   * @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;
  				}
  			}
  		}
  
  	}
  
  
  
  
  1.1                  jakarta-ant/src/main/com/ice/tar/TarEntry.java
  
  Index: TarEntry.java
  ===================================================================
  /*
  ** 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;
  		}
  
  	}
  
  
  
  
  1.1                  jakarta-ant/src/main/com/ice/tar/TarHeader.java
  
  Index: TarHeader.java
  ===================================================================
  /*
  ** 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();
  		}
  
  	}
   
  
  
  
  1.1                  jakarta-ant/src/main/com/ice/tar/TarProgressDisplay.java
  
  Index: TarProgressDisplay.java
  ===================================================================
  /*
  ** 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 );
  	}
  
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/AntSecurityManager.java
  
  Index: AntSecurityManager.java
  ===================================================================
  /*
   * 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;
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/ApacheParser.java
  
  Index: ApacheParser.java
  ===================================================================
  /*
   * 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());
          }
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/BuildException.java
  
  Index: BuildException.java
  ===================================================================
  /*
   * 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;
      }
  }
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/DesirableFilter.java
  
  Index: DesirableFilter.java
  ===================================================================
  /*
   * 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;
      }
  }
  
  
  
  
  
  
  
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/Main.java
  
  Index: Main.java
  ===================================================================
  /*
   * 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);
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/Map.java
  
  Index: Map.java
  ===================================================================
  
  
  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 );
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/Parser.java
  
  Index: Parser.java
  ===================================================================
  /*
   * 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;
  }
  
          
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/Project.java
  
  Index: Project.java
  ===================================================================
  /*
   * 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));
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/ProjectHelper.java
  
  Index: ProjectHelper.java
  ===================================================================
  /*
   * 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();
      }
  }
  
  
  
  
  
  
  
  
  
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/SunParser.java
  
  Index: SunParser.java
  ===================================================================
  /*
   * 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);
      }
  }
  
          
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/Target.java
  
  Index: Target.java
  ===================================================================
  /*
   * 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();
  	}
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/Task.java
  
  Index: Task.java
  ===================================================================
  /*
   * 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();
  	}
      }
  }
  
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/defaultManifest.mf
  
  Index: defaultManifest.mf
  ===================================================================
  Manifest-Version: 1.0
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/parser.properties
  
  Index: parser.properties
  ===================================================================
  parser=org.apache.tools.ant.SunParser
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Ant.java
  
  Index: Ant.java
  ===================================================================
  /*
   * 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;
      }
  
  
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Chmod.java
  
  Index: Chmod.java
  ===================================================================
  /*
   * 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() );
  	}
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Copydir.java
  
  Index: Copydir.java
  ===================================================================
  /*
   * 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);
              }
          }
      }
  }
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Copyfile.java
  
  Index: Copyfile.java
  ===================================================================
  /*
   * 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);
  	    }
  	}
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Cvs.java
  
  Index: Cvs.java
  ===================================================================
  /*
   * 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;
      }
  }
  
  
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Deltree.java
  
  Index: Deltree.java
  ===================================================================
  /*
   * 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();
      }
  }
  
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Echo.java
  
  Index: Echo.java
  ===================================================================
  /*
   * 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;
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Exec.java
  
  Index: Exec.java
  ===================================================================
  /*
   * 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;
      }
  
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Expand.java
  
  Index: Expand.java
  ===================================================================
  /*
   * 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;
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/GZip.java
  
  Index: GZip.java
  ===================================================================
  /*
   * 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();
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Get.java
  
  Index: Get.java
  ===================================================================
  /*
   * 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;
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Jar.java
  
  Index: Jar.java
  ===================================================================
  /*
   * 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);
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Java.java
  
  Index: Java.java
  ===================================================================
  /*
   * 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;
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Javac.java
  
  Index: Javac.java
  ===================================================================
  /*
   * 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);
  	}
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/JavacOutputStream.java
  
  Index: JavacOutputStream.java
  ===================================================================
  /*
   * 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;
      }
  }
  
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Javadoc2.java
  
  Index: Javadoc2.java
  ===================================================================
  /*
   * 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;
          }
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Jikes.java
  
  Index: Jikes.java
  ===================================================================
  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?
  	}
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/JikesOutputParser.java
  
  Index: JikesOutputParser.java
  ===================================================================
  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;
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/KeySubst.java
  
  Index: KeySubst.java
  ===================================================================
  /*
   * 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();
      }
  }
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Mkdir.java
  
  Index: Mkdir.java
  ===================================================================
  /*
   * 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;
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Property.java
  
  Index: Property.java
  ===================================================================
  /*
   * 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);
  	}
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Replace.java
  
  Index: Replace.java
  ===================================================================
  /*
   * 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();            
      }
  }
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Rmic.java
  
  Index: Rmic.java
  ===================================================================
  /*
   * 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);
      }
  
      
  }
  
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Taskdef.java
  
  Index: Taskdef.java
  ===================================================================
  /*
   * 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;
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Tstamp.java
  
  Index: Tstamp.java
  ===================================================================
  /*
   * 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();
  	}
  
      }
  
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/Zip.java
  
  Index: Zip.java
  ===================================================================
  /*
   * 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();
      }
  }
  
  
  
  1.1                  jakarta-ant/src/main/org/apache/tools/ant/taskdefs/defaults.properties
  
  Index: defaults.properties
  ===================================================================
  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
  
  
  


Mime
View raw message