git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@272457 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -1,45 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.archive; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.excalibur.bzip2.CBZip2InputStream; | |||
| /** | |||
| * Expands a file that has been compressed with the BZIP2 algorithm. Normally | |||
| * used to compress non-compressed archives such as TAR files. | |||
| * | |||
| * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | |||
| * @ant.task name="bunzip2" | |||
| */ | |||
| public class BUnzip2 | |||
| extends Unpack | |||
| { | |||
| private static final String DEFAULT_EXTENSION = ".bz2"; | |||
| protected String getDefaultExtension() | |||
| { | |||
| return DEFAULT_EXTENSION; | |||
| } | |||
| protected InputStream getUnpackingStream( final InputStream input ) | |||
| throws TaskException, IOException | |||
| { | |||
| final int b1 = input.read(); | |||
| final int b2 = input.read(); | |||
| if( b1 != 'B' || b2 != 'Z' ) | |||
| { | |||
| final String message = "Invalid bz2 file."; | |||
| throw new TaskException( message ); | |||
| } | |||
| return new CBZip2InputStream( input ); | |||
| } | |||
| } | |||
| @@ -1,34 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.archive; | |||
| import java.io.IOException; | |||
| import java.io.OutputStream; | |||
| import org.apache.excalibur.bzip2.CBZip2OutputStream; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * Compresses a file with the BZip2 algorithm. Normally used to compress | |||
| * non-compressed archives such as TAR files. | |||
| * | |||
| * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @ant.task name="bzip2" | |||
| */ | |||
| public class BZip2 | |||
| extends Pack | |||
| { | |||
| private static final byte[] HEADER = new byte[]{(byte)'B', (byte)'Z'}; | |||
| protected OutputStream getPackingStream( OutputStream output ) | |||
| throws TaskException, IOException | |||
| { | |||
| output.write( HEADER ); | |||
| return new CBZip2OutputStream( output ); | |||
| } | |||
| } | |||
| @@ -1,38 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.archive; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.util.zip.GZIPInputStream; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * Expands a file that has been compressed with the GZIP algorithm. Normally | |||
| * used to compress non-compressed archives such as TAR files. | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | |||
| * @ant.task name="gunzip" | |||
| */ | |||
| public class GUnzip | |||
| extends Unpack | |||
| { | |||
| private static final String DEFAULT_EXTENSION = ".gz"; | |||
| protected String getDefaultExtension() | |||
| { | |||
| return DEFAULT_EXTENSION; | |||
| } | |||
| protected InputStream getUnpackingStream( InputStream input ) | |||
| throws TaskException, IOException | |||
| { | |||
| return new GZIPInputStream( input ); | |||
| } | |||
| } | |||
| @@ -1,33 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.archive; | |||
| import java.io.IOException; | |||
| import java.io.OutputStream; | |||
| import java.util.zip.GZIPOutputStream; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * Compresses a file with the GZIP algorithm. Normally used to compress | |||
| * non-compressed archives such as TAR files. | |||
| * | |||
| * @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> | |||
| * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @ant.task name="gzip" | |||
| */ | |||
| public class GZip | |||
| extends Pack | |||
| { | |||
| protected OutputStream getPackingStream( final OutputStream output ) | |||
| throws TaskException, IOException | |||
| { | |||
| return new GZIPOutputStream( output ); | |||
| } | |||
| } | |||
| @@ -1,121 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.archive; | |||
| import java.io.File; | |||
| import java.io.FileInputStream; | |||
| import java.io.FileOutputStream; | |||
| import java.io.IOException; | |||
| import java.io.OutputStream; | |||
| import org.apache.avalon.excalibur.io.IOUtil; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * Abstract Base class for pack tasks. | |||
| * | |||
| * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| */ | |||
| public abstract class Pack | |||
| extends AbstractTask | |||
| { | |||
| private File m_src; | |||
| private File m_zipFile; | |||
| public void setSrc( final File src ) | |||
| { | |||
| m_src = src; | |||
| } | |||
| public void setZipfile( final File zipFile ) | |||
| { | |||
| m_zipFile = zipFile; | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| validate(); | |||
| final String message = "Building: " + m_zipFile.getAbsolutePath(); | |||
| getContext().verbose( message ); | |||
| pack(); | |||
| } | |||
| private void pack() | |||
| throws TaskException | |||
| { | |||
| OutputStream output = null; | |||
| try | |||
| { | |||
| final FileOutputStream fileOutput = new FileOutputStream( getZipFile() ); | |||
| output = getPackingStream( fileOutput ); | |||
| copy( getSrc(), output ); | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| final String message = "Problem creating " + getContext().getName() + | |||
| ":" + ioe.getMessage(); | |||
| throw new TaskException( message, ioe ); | |||
| } | |||
| finally | |||
| { | |||
| IOUtil.shutdownStream( output ); | |||
| } | |||
| } | |||
| protected abstract OutputStream getPackingStream( OutputStream output ) | |||
| throws TaskException, IOException; | |||
| protected final void copy( final File file, final OutputStream output ) | |||
| throws IOException | |||
| { | |||
| final FileInputStream input = new FileInputStream( file ); | |||
| try | |||
| { | |||
| IOUtil.copy( input, output ); | |||
| } | |||
| finally | |||
| { | |||
| IOUtil.shutdownStream( input ); | |||
| } | |||
| } | |||
| private void validate() | |||
| throws TaskException | |||
| { | |||
| if( null == m_zipFile ) | |||
| { | |||
| final String message = "zipfile attribute is required"; | |||
| throw new TaskException( message ); | |||
| } | |||
| if( null == m_src ) | |||
| { | |||
| final String message = "src attribute is required"; | |||
| throw new TaskException( message ); | |||
| } | |||
| if( m_src.isDirectory() ) | |||
| { | |||
| final String message = "Src attribute must not " + | |||
| "represent a directory!"; | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| protected final File getSrc() | |||
| { | |||
| return m_src; | |||
| } | |||
| protected final File getZipFile() | |||
| { | |||
| return m_zipFile; | |||
| } | |||
| } | |||
| @@ -1,154 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.archive; | |||
| import java.io.File; | |||
| import java.io.FileInputStream; | |||
| import java.io.FileOutputStream; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.io.OutputStream; | |||
| import org.apache.avalon.excalibur.io.IOUtil; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * Abstract Base class for unpack tasks. | |||
| * | |||
| * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| */ | |||
| public abstract class Unpack | |||
| extends AbstractTask | |||
| { | |||
| private File m_dest; | |||
| private File m_src; | |||
| public void setDest( final File dest ) | |||
| { | |||
| m_dest = dest; | |||
| } | |||
| public void setSrc( final File src ) | |||
| { | |||
| m_src = src; | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| validate(); | |||
| final File src = getSrc(); | |||
| final File dest = getDest(); | |||
| if( src.lastModified() > dest.lastModified() ) | |||
| { | |||
| final String message = "Expanding " + src.getAbsolutePath() + | |||
| " to " + dest.getAbsolutePath(); | |||
| getContext().verbose( message ); | |||
| extract(); | |||
| } | |||
| } | |||
| protected abstract String getDefaultExtension(); | |||
| protected abstract InputStream getUnpackingStream( InputStream input ) | |||
| throws TaskException, IOException; | |||
| private void extract() | |||
| throws TaskException | |||
| { | |||
| OutputStream output = null; | |||
| InputStream input = null; | |||
| InputStream fileInput = null; | |||
| try | |||
| { | |||
| output = new FileOutputStream( getDest() ); | |||
| fileInput = new FileInputStream( getSrc() ); | |||
| input = getUnpackingStream( fileInput ); | |||
| IOUtil.copy( input, output ); | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| final String message = "Problem expanding " + getSrc() + | |||
| ":" + ioe.getMessage(); | |||
| throw new TaskException( message, ioe ); | |||
| } | |||
| finally | |||
| { | |||
| IOUtil.shutdownStream( fileInput ); | |||
| IOUtil.shutdownStream( output ); | |||
| IOUtil.shutdownStream( input ); | |||
| } | |||
| } | |||
| private File createDestFile() | |||
| { | |||
| final String extension = getDefaultExtension(); | |||
| final String sourceName = m_src.getName(); | |||
| final int length = sourceName.length(); | |||
| final int index = length - extension.length(); | |||
| if( null != extension && | |||
| length > extension.length() && | |||
| extension.equalsIgnoreCase( sourceName.substring( index ) ) ) | |||
| { | |||
| final String child = sourceName.substring( 0, index ); | |||
| return new File( m_dest, child ); | |||
| } | |||
| else | |||
| { | |||
| return new File( m_dest, sourceName ); | |||
| } | |||
| } | |||
| private void validate() | |||
| throws TaskException | |||
| { | |||
| if( null == m_src ) | |||
| { | |||
| final String message = "No Src for " + getContext().getName() + " specified"; | |||
| throw new TaskException( message ); | |||
| } | |||
| if( !m_src.exists() ) | |||
| { | |||
| final String message = "Src doesn't exist"; | |||
| throw new TaskException( message ); | |||
| } | |||
| if( m_src.isDirectory() ) | |||
| { | |||
| final String message = "Cannot expand a directory"; | |||
| throw new TaskException( message ); | |||
| } | |||
| if( null == m_dest ) | |||
| { | |||
| m_dest = new File( m_src.getParent() ); | |||
| } | |||
| if( m_dest.isDirectory() ) | |||
| { | |||
| m_dest = createDestFile(); | |||
| } | |||
| } | |||
| protected final File getDest() | |||
| { | |||
| return m_dest; | |||
| } | |||
| protected final File getSrc() | |||
| { | |||
| return m_src; | |||
| } | |||
| } | |||
| @@ -1,200 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.build; | |||
| import java.io.File; | |||
| import java.io.FileInputStream; | |||
| import java.io.FileOutputStream; | |||
| import java.io.IOException; | |||
| import java.util.Properties; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.avalon.excalibur.io.IOUtil; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * This is a basic task that can be used to track build numbers. | |||
| * | |||
| * It will first attempt to read a build number from a file, then | |||
| * set the property "build.number" to the value that was read in | |||
| * (or 0 if no such value). Then it will increment the build number | |||
| * by one and write it back out into the file. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @version $Revision$ $Date$ | |||
| * @ant.task name="build-number" | |||
| */ | |||
| public class BuildNumber | |||
| extends AbstractTask | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( BuildNumber.class ); | |||
| /** | |||
| * The name of the property in which the build number is stored. | |||
| */ | |||
| private static final String DEFAULT_PROPERTY_NAME = "build.number"; | |||
| /** | |||
| * The default filename to use if no file specified. | |||
| */ | |||
| private static final String DEFAULT_FILENAME = DEFAULT_PROPERTY_NAME; | |||
| /** | |||
| * The File in which the build number is stored. | |||
| */ | |||
| private File m_file; | |||
| /** | |||
| * Specify the file in which the build numberis stored. | |||
| * Defaults to "build.number" if not specified. | |||
| * | |||
| * @param file the file in which build number is stored. | |||
| */ | |||
| public void setFile( final File file ) | |||
| { | |||
| m_file = file; | |||
| } | |||
| /** | |||
| * Run task. | |||
| * | |||
| * @exception TaskException if an error occurs | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| validate(); | |||
| final Properties properties = loadProperties(); | |||
| final int buildNumber = getBuildNumber( properties ); | |||
| properties.put( DEFAULT_PROPERTY_NAME, | |||
| String.valueOf( buildNumber + 1 ) ); | |||
| // Write the properties file back out | |||
| FileOutputStream output = null; | |||
| try | |||
| { | |||
| final String header = REZ.getString( "buildnumber.header.info" ); | |||
| output = new FileOutputStream( m_file ); | |||
| properties.store( output, header ); | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "buildnumber.badwrite.error", m_file ); | |||
| throw new TaskException( message, ioe ); | |||
| } | |||
| finally | |||
| { | |||
| IOUtil.shutdownStream( output ); | |||
| } | |||
| //Finally set the property | |||
| getContext().setProperty( DEFAULT_PROPERTY_NAME, | |||
| String.valueOf( buildNumber ) ); | |||
| } | |||
| /** | |||
| * Utility method to retrieve build number from properties object. | |||
| * | |||
| * @param properties the properties to retrieve build number from | |||
| * @return the build number or if no number in properties object | |||
| * @throws TaskException if build.number property is not an integer | |||
| */ | |||
| private int getBuildNumber( final Properties properties ) | |||
| throws TaskException | |||
| { | |||
| final String buildNumber = | |||
| properties.getProperty( DEFAULT_PROPERTY_NAME, "0" ).trim(); | |||
| // Try parsing the line into an integer. | |||
| try | |||
| { | |||
| return Integer.parseInt( buildNumber ); | |||
| } | |||
| catch( final NumberFormatException nfe ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "buildnumber.noparse.error", m_file, buildNumber ); | |||
| throw new TaskException( message, nfe ); | |||
| } | |||
| } | |||
| /** | |||
| * Utility method to load properties from file. | |||
| * | |||
| * @return the loaded properties | |||
| * @throws TaskException | |||
| */ | |||
| private Properties loadProperties() | |||
| throws TaskException | |||
| { | |||
| FileInputStream input = null; | |||
| try | |||
| { | |||
| final Properties properties = new Properties(); | |||
| input = new FileInputStream( m_file ); | |||
| properties.load( input ); | |||
| return properties; | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| throw new TaskException( ioe.getMessage(), ioe ); | |||
| } | |||
| finally | |||
| { | |||
| IOUtil.shutdownStream( input ); | |||
| } | |||
| } | |||
| /** | |||
| * Validate that the task parameters are valid. | |||
| * | |||
| * @throws TaskException if parameters are invalid | |||
| */ | |||
| private void validate() | |||
| throws TaskException | |||
| { | |||
| if( null == m_file ) | |||
| { | |||
| m_file = getContext().resolveFile( DEFAULT_FILENAME ); | |||
| } | |||
| if( !m_file.exists() ) | |||
| { | |||
| try | |||
| { | |||
| m_file.createNewFile(); | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "buildnumber.nocreate.error", m_file ); | |||
| throw new TaskException( message, ioe ); | |||
| } | |||
| } | |||
| if( !m_file.canRead() ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "buildnumber.noread.error", m_file ); | |||
| throw new TaskException( message ); | |||
| } | |||
| if( !m_file.canWrite() ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "buildnumber.nowrite.error", m_file ); | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,437 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.build; | |||
| import java.io.File; | |||
| import java.io.FileInputStream; | |||
| import java.io.FileOutputStream; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.security.DigestInputStream; | |||
| import java.security.MessageDigest; | |||
| import java.security.NoSuchAlgorithmException; | |||
| import java.security.NoSuchProviderException; | |||
| import java.util.ArrayList; | |||
| import java.util.Enumeration; | |||
| import java.util.Hashtable; | |||
| import org.apache.avalon.excalibur.io.IOUtil; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.AbstractMatchingTask; | |||
| import org.apache.myrmidon.framework.FileSet; | |||
| import org.apache.tools.todo.types.DirectoryScanner; | |||
| import org.apache.tools.todo.types.ScannerUtil; | |||
| /** | |||
| * This task can be used to create checksums for files. It can also be used to | |||
| * verify checksums. | |||
| * | |||
| * @ant.task name="checksum" | |||
| * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public class Checksum | |||
| extends AbstractMatchingTask | |||
| { | |||
| /** | |||
| * File for which checksum is to be calculated. | |||
| */ | |||
| private File m_file; | |||
| /** | |||
| * MessageDigest algorithm to be used. | |||
| */ | |||
| private String m_algorithm = "MD5"; | |||
| /** | |||
| * MessageDigest Algorithm provider | |||
| */ | |||
| private String m_provider; | |||
| /** | |||
| * ArrayList to hold source file sets. | |||
| */ | |||
| private ArrayList m_filesets = new ArrayList(); | |||
| /** | |||
| * Stores SourceFile, DestFile pairs and SourceFile, Property String pairs. | |||
| */ | |||
| private Hashtable m_includeFileMap = new Hashtable(); | |||
| /** | |||
| * File Extension that is be to used to create or identify destination file | |||
| */ | |||
| private String m_fileext; | |||
| /** | |||
| * Create new destination file? Defaults to false. | |||
| */ | |||
| private boolean m_forceOverwrite; | |||
| /** | |||
| * Message Digest instance | |||
| */ | |||
| private MessageDigest m_messageDigest; | |||
| /** | |||
| * Holds generated checksum and gets set as a Project Property. | |||
| */ | |||
| private String m_property; | |||
| /** | |||
| * Contains the result of a checksum verification. ("true" or "false") | |||
| */ | |||
| private String m_verifyProperty; | |||
| /** | |||
| * Sets the MessageDigest algorithm to be used to calculate the checksum. | |||
| */ | |||
| public void setAlgorithm( final String algorithm ) | |||
| { | |||
| m_algorithm = algorithm; | |||
| } | |||
| /** | |||
| * Sets the file for which the checksum is to be calculated. | |||
| */ | |||
| public void setFile( final File file ) | |||
| { | |||
| m_file = file; | |||
| } | |||
| /** | |||
| * Sets the File Extension that is be to used to create or identify | |||
| * destination file | |||
| */ | |||
| public void setFileext( final String fileext ) | |||
| { | |||
| m_fileext = fileext; | |||
| } | |||
| /** | |||
| * Overwrite existing file irrespective of whether it is newer than the | |||
| * source file? Defaults to false. | |||
| */ | |||
| public void setForceOverwrite( boolean forceOverwrite ) | |||
| { | |||
| this.m_forceOverwrite = forceOverwrite; | |||
| } | |||
| /** | |||
| * Sets the property to hold the generated checksum | |||
| */ | |||
| public void setProperty( String property ) | |||
| { | |||
| this.m_property = property; | |||
| } | |||
| /** | |||
| * Sets the MessageDigest algorithm provider to be used to calculate the | |||
| * checksum. | |||
| * | |||
| * @param provider The new Provider value | |||
| */ | |||
| public void setProvider( final String provider ) | |||
| { | |||
| m_provider = provider; | |||
| } | |||
| /** | |||
| * Sets verify property. This project property holds the result of a | |||
| * checksum verification - "true" or "false" | |||
| */ | |||
| public void setVerifyproperty( final String verifyProperty ) | |||
| { | |||
| m_verifyProperty = verifyProperty; | |||
| } | |||
| /** | |||
| * Adds a set of files (nested fileset attribute). | |||
| */ | |||
| public void addFileset( final FileSet set ) | |||
| { | |||
| m_filesets.add( set ); | |||
| } | |||
| /** | |||
| * Calculate the checksum(s). | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| final boolean value = validateAndExecute(); | |||
| if( m_verifyProperty != null ) | |||
| { | |||
| getContext().setProperty( m_verifyProperty, "" + value ); | |||
| } | |||
| } | |||
| /** | |||
| * Add key-value pair to the hashtable upon which to later operate upon. | |||
| * | |||
| * @param file The feature to be added to the ToIncludeFileMap attribute | |||
| * @exception TaskException Description of Exception | |||
| */ | |||
| private void addToIncludeFileMap( final File file ) | |||
| throws TaskException | |||
| { | |||
| if( file != null ) | |||
| { | |||
| if( file.exists() ) | |||
| { | |||
| if( m_property == null ) | |||
| { | |||
| final File dest = new File( file.getParent(), file.getName() + m_fileext ); | |||
| if( m_forceOverwrite || | |||
| ( file.lastModified() > dest.lastModified() ) ) | |||
| { | |||
| m_includeFileMap.put( file, dest ); | |||
| } | |||
| else | |||
| { | |||
| final String message = file + " omitted as " + dest + | |||
| " is up to date."; | |||
| getContext().debug( message ); | |||
| } | |||
| } | |||
| else | |||
| { | |||
| m_includeFileMap.put( file, m_property ); | |||
| } | |||
| } | |||
| else | |||
| { | |||
| final String message = "Could not find file " + file.getAbsolutePath() + | |||
| " to generate checksum for."; | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Generate checksum(s) using the message digest created earlier. | |||
| */ | |||
| private boolean generateChecksums() | |||
| throws TaskException | |||
| { | |||
| boolean checksumMatches = true; | |||
| final Enumeration includes = m_includeFileMap.keys(); | |||
| while( includes.hasMoreElements() ) | |||
| { | |||
| final File src = (File)includes.nextElement(); | |||
| final String message = "Calculating " + m_algorithm + " checksum for " + src; | |||
| getContext().verbose( message ); | |||
| checksumMatches = z( src, checksumMatches ); | |||
| } | |||
| return checksumMatches; | |||
| } | |||
| private boolean z( final File src, final boolean checksumMatches ) | |||
| throws TaskException | |||
| { | |||
| boolean match = checksumMatches; | |||
| FileInputStream fis = null; | |||
| FileOutputStream fos = null; | |||
| try | |||
| { | |||
| fis = new FileInputStream( src ); | |||
| final byte[] fileDigest = buildDigest( fis ); | |||
| IOUtil.shutdownStream( fis ); | |||
| final StringBuffer sb = new StringBuffer(); | |||
| for( int i = 0; i < fileDigest.length; i++ ) | |||
| { | |||
| final String hexStr = Integer.toHexString( 0x00ff & fileDigest[ i ] ); | |||
| if( hexStr.length() < 2 ) | |||
| { | |||
| sb.append( '0' ); | |||
| } | |||
| sb.append( hexStr ); | |||
| } | |||
| final String checksum = sb.toString(); | |||
| //can either be a property name string or a file | |||
| final Object destination = m_includeFileMap.get( src ); | |||
| if( destination instanceof String ) | |||
| { | |||
| final String prop = (String)destination; | |||
| match = checksum.equals( m_property ); | |||
| getContext().setProperty( prop, checksum ); | |||
| } | |||
| else if( destination instanceof File ) | |||
| { | |||
| final File file = (File)destination; | |||
| fos = new FileOutputStream( file ); | |||
| fos.write( checksum.getBytes() ); | |||
| fos.close(); | |||
| fos = null; | |||
| } | |||
| } | |||
| catch( final Exception e ) | |||
| { | |||
| throw new TaskException( e.getMessage(), e ); | |||
| } | |||
| finally | |||
| { | |||
| IOUtil.shutdownStream( fis ); | |||
| IOUtil.shutdownStream( fos ); | |||
| } | |||
| return match; | |||
| } | |||
| private byte[] buildDigest( final InputStream input ) | |||
| throws IOException | |||
| { | |||
| m_messageDigest.reset(); | |||
| final DigestInputStream digester = | |||
| new DigestInputStream( input, m_messageDigest ); | |||
| while( digester.read() != -1 ) | |||
| { | |||
| } | |||
| digester.close(); | |||
| return m_messageDigest.digest(); | |||
| } | |||
| /** | |||
| * Validate attributes and get down to business. | |||
| */ | |||
| private boolean validateAndExecute() | |||
| throws TaskException | |||
| { | |||
| if( null == m_file && 0 == m_filesets.size() ) | |||
| { | |||
| final String message = "Specify at least one source - a file or a fileset."; | |||
| throw new TaskException( message ); | |||
| } | |||
| if( null != m_file && m_file.exists() && m_file.isDirectory() ) | |||
| { | |||
| final String message = "Checksum cannot be generated for directories"; | |||
| throw new TaskException( message ); | |||
| } | |||
| if( null != m_property && null != m_fileext ) | |||
| { | |||
| final String message = "Property and FileExt cannot co-exist."; | |||
| throw new TaskException( message ); | |||
| } | |||
| if( m_property != null ) | |||
| { | |||
| if( m_forceOverwrite ) | |||
| { | |||
| final String message = | |||
| "ForceOverwrite cannot be used when Property is specified"; | |||
| throw new TaskException( message ); | |||
| } | |||
| if( m_file != null ) | |||
| { | |||
| if( m_filesets.size() > 0 ) | |||
| { | |||
| final String message = | |||
| "Multiple files cannot be used when Property is specified"; | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| else | |||
| { | |||
| if( m_filesets.size() > 1 ) | |||
| { | |||
| final String message = | |||
| "Multiple files cannot be used when Property is specified"; | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| } | |||
| if( m_verifyProperty != null && m_forceOverwrite ) | |||
| { | |||
| final String message = "VerifyProperty and ForceOverwrite cannot co-exist."; | |||
| throw new TaskException( message ); | |||
| } | |||
| if( m_fileext == null ) | |||
| { | |||
| m_fileext = "." + m_algorithm; | |||
| } | |||
| else if( m_fileext.trim().length() == 0 ) | |||
| { | |||
| final String message = "File extension when specified must not be an empty string"; | |||
| throw new TaskException( message ); | |||
| } | |||
| setupMessageDigest(); | |||
| if( m_messageDigest == null ) | |||
| { | |||
| final String message = "Unable to create Message Digest"; | |||
| throw new TaskException( message ); | |||
| } | |||
| addIncludes(); | |||
| return generateChecksums(); | |||
| } | |||
| private void setupMessageDigest() | |||
| throws TaskException | |||
| { | |||
| m_messageDigest = null; | |||
| if( m_provider != null ) | |||
| { | |||
| try | |||
| { | |||
| m_messageDigest = MessageDigest.getInstance( m_algorithm, m_provider ); | |||
| } | |||
| catch( final NoSuchAlgorithmException nsae ) | |||
| { | |||
| throw new TaskException( nsae.toString(), nsae ); | |||
| } | |||
| catch( final NoSuchProviderException nspe ) | |||
| { | |||
| throw new TaskException( nspe.toString(), nspe ); | |||
| } | |||
| } | |||
| else | |||
| { | |||
| try | |||
| { | |||
| m_messageDigest = MessageDigest.getInstance( m_algorithm ); | |||
| } | |||
| catch( final NoSuchAlgorithmException nsae ) | |||
| { | |||
| throw new TaskException( nsae.toString(), nsae ); | |||
| } | |||
| } | |||
| } | |||
| private void addIncludes() | |||
| throws TaskException | |||
| { | |||
| addToIncludeFileMap( m_file ); | |||
| final int size = m_filesets.size(); | |||
| for( int i = 0; i < size; i++ ) | |||
| { | |||
| final FileSet fileSet = (FileSet)m_filesets.get( i ); | |||
| final DirectoryScanner scanner = ScannerUtil.getDirectoryScanner( fileSet ); | |||
| final String[] srcFiles = scanner.getIncludedFiles(); | |||
| for( int j = 0; j < srcFiles.length; j++ ) | |||
| { | |||
| final File src = new File( fileSet.getDir(), srcFiles[ j ] ); | |||
| addToIncludeFileMap( src ); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -1,171 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.build; | |||
| import java.io.File; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.nativelib.Execute; | |||
| /** | |||
| * Task as a layer on top of patch. Patch applies a diff file to an original. | |||
| * | |||
| * @ant.task name="patchx" | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public class Patch | |||
| extends AbstractTask | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( Patch.class ); | |||
| private File m_originalFile; | |||
| private File m_patchFile; | |||
| private boolean m_backups; | |||
| private boolean m_ignorewhitespace; | |||
| private boolean m_reverse; | |||
| private boolean m_quiet; | |||
| private Integer m_strip; | |||
| /** | |||
| * Shall patch write backups. | |||
| * | |||
| * @param backups The new Backups value | |||
| */ | |||
| public void setBackups( final boolean backups ) | |||
| { | |||
| m_backups = backups; | |||
| } | |||
| /** | |||
| * Ignore whitespace differences. | |||
| */ | |||
| public void setIgnorewhitespace( final boolean ignorewhitespace ) | |||
| { | |||
| m_ignorewhitespace = ignorewhitespace; | |||
| } | |||
| /** | |||
| * The file to patch. | |||
| */ | |||
| public void setOriginalfile( final File originalFile ) | |||
| { | |||
| m_originalFile = originalFile; | |||
| } | |||
| /** | |||
| * The file containing the diff output. | |||
| */ | |||
| public void setPatchfile( final File patchFile ) | |||
| { | |||
| m_patchFile = patchFile; | |||
| } | |||
| /** | |||
| * Work silently unless an error occurs. | |||
| */ | |||
| public void setQuiet( final boolean quiet ) | |||
| { | |||
| m_quiet = quiet; | |||
| } | |||
| /** | |||
| * Assume patch was created with old and new files swapped. | |||
| */ | |||
| public void setReverse( final boolean reverse ) | |||
| { | |||
| m_reverse = reverse; | |||
| } | |||
| /** | |||
| * Strip the smallest prefix containing <i>num</i> leading slashes from | |||
| * filenames. <p> | |||
| * | |||
| * patch's <i>-p</i> option. | |||
| * | |||
| * @param strip The new Strip value | |||
| */ | |||
| public void setStrip( final Integer strip ) | |||
| { | |||
| m_strip = strip; | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| validate(); | |||
| final Execute exe = buildCommand(); | |||
| exe.execute( getContext() ); | |||
| } | |||
| private void validate() | |||
| throws TaskException | |||
| { | |||
| if( null == m_patchFile ) | |||
| { | |||
| final String message = REZ.getString( "patch.missing-file.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| if( !m_patchFile.exists() ) | |||
| { | |||
| final String message = REZ.getString( "patch.file-noexist.error", m_patchFile ); | |||
| throw new TaskException( message ); | |||
| } | |||
| if( null != m_strip && m_strip.intValue() < 0 ) | |||
| { | |||
| final String message = REZ.getString( "patch.neg-strip.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| private Execute buildCommand( ) | |||
| { | |||
| final Execute cmd = new Execute(); | |||
| cmd.setExecutable( "patch" ); | |||
| if( m_backups ) | |||
| { | |||
| cmd.addArgument( "-b" ); | |||
| } | |||
| if( null != m_strip ) | |||
| { | |||
| cmd.addArgument( "-p" + m_strip.intValue() ); | |||
| } | |||
| if( m_quiet ) | |||
| { | |||
| cmd.addArgument( "-s" ); | |||
| } | |||
| if( m_reverse ) | |||
| { | |||
| cmd.addArgument( "-R" ); | |||
| } | |||
| cmd.addArgument( "-i" ); | |||
| cmd.addArgument( m_patchFile ); | |||
| if( m_ignorewhitespace ) | |||
| { | |||
| cmd.addArgument( "-l" ); | |||
| } | |||
| if( null != m_originalFile ) | |||
| { | |||
| cmd.addArgument( m_originalFile ); | |||
| } | |||
| return cmd; | |||
| } | |||
| } | |||
| @@ -1,13 +0,0 @@ | |||
| sleep.duration.notice=Sleeping for {0} milliseconds. | |||
| sleep.neg-time.error=Negative sleep periods are not supported. | |||
| patch.missing-file.error=Patchfile argument is required. | |||
| patch.file-noexist.error=Patchfile "{0}" doesn\'t exist. | |||
| patch.neg-strip.error=Strip has to be >= 0 | |||
| buildnumber.nocreate.error={0} doesn't exist and new file can't be created. | |||
| buildnumber.noread.error=Unable to read from {0}. | |||
| buildnumber.nowrite.error=Unable to write to {0}. | |||
| buildnumber.noparse.error={0} contains a non integer build number: {1} | |||
| buildnumber.badwrite.error=Error while writing {0}. | |||
| buildnumber.header.info=Build Number for ANT. Do not edit! | |||
| @@ -1,124 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.build; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * A task to sleep for a period of time | |||
| * | |||
| * @ant.task name="sleep" | |||
| * @author steve_l@iseran.com steve loughran | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public class SleepTask | |||
| extends AbstractTask | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( SleepTask.class ); | |||
| private int m_seconds; | |||
| private int m_hours; | |||
| private int m_minutes; | |||
| private int m_milliseconds; | |||
| /** | |||
| * Sets the Hours attribute of the Sleep object | |||
| */ | |||
| public void setHours( final int hours ) | |||
| { | |||
| m_hours = hours; | |||
| } | |||
| /** | |||
| * Sets the Milliseconds attribute of the Sleep object | |||
| */ | |||
| public void setMilliseconds( final int milliseconds ) | |||
| { | |||
| m_milliseconds = milliseconds; | |||
| } | |||
| /** | |||
| * Sets the Minutes attribute of the Sleep object | |||
| */ | |||
| public void setMinutes( final int minutes ) | |||
| { | |||
| m_minutes = minutes; | |||
| } | |||
| /** | |||
| * Sets the Seconds attribute of the Sleep object | |||
| */ | |||
| public void setSeconds( final int seconds ) | |||
| { | |||
| m_seconds = seconds; | |||
| } | |||
| /** | |||
| * sleep for a period of time | |||
| * | |||
| * @param millis time to sleep | |||
| */ | |||
| private void doSleep( final long millis ) | |||
| { | |||
| try | |||
| { | |||
| Thread.sleep( millis ); | |||
| } | |||
| catch( InterruptedException ie ) | |||
| { | |||
| } | |||
| } | |||
| /** | |||
| * Executes this build task. throws org.apache.tools.ant.TaskException if | |||
| * there is an error during task execution. | |||
| * | |||
| * @exception TaskException Description of Exception | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| validate(); | |||
| final long sleepTime = getSleepTime(); | |||
| final String message = REZ.getString( "sleep.duration.notice", new Long( sleepTime ) ); | |||
| getContext().debug( message ); | |||
| doSleep( sleepTime ); | |||
| } | |||
| /** | |||
| * verify parameters | |||
| * | |||
| * @throws TaskException if something is invalid | |||
| */ | |||
| private void validate() | |||
| throws TaskException | |||
| { | |||
| if( getSleepTime() < 0 ) | |||
| { | |||
| final String message = REZ.getString( "sleep.neg-time.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| /** | |||
| * return time to sleep | |||
| * | |||
| * @return sleep time. if below 0 then there is an error | |||
| */ | |||
| private long getSleepTime() | |||
| { | |||
| return ( ( ( (long)m_hours * 60 ) + m_minutes ) * 60 + m_seconds ) * 1000 + m_milliseconds; | |||
| } | |||
| } | |||
| @@ -1,130 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.build; | |||
| import java.io.File; | |||
| import java.util.ArrayList; | |||
| import java.util.Iterator; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.FileNameMapper; | |||
| import org.apache.myrmidon.framework.FileSet; | |||
| import org.apache.myrmidon.framework.conditions.Condition; | |||
| import org.apache.tools.todo.types.DirectoryScanner; | |||
| import org.apache.tools.todo.types.ScannerUtil; | |||
| import org.apache.tools.todo.types.SourceFileScanner; | |||
| import org.apache.tools.todo.util.mappers.MergingMapper; | |||
| /** | |||
| * A condition which evaluates to true when the specified target has a | |||
| * timestamp greater than all of the source files. | |||
| * | |||
| * @author William Ferguson <a href="mailto:williamf@mincom.com"> | |||
| * williamf@mincom.com</a> | |||
| * @author Hiroaki Nakamura <a href="mailto:hnakamur@mc.neweb.ne.jp"> | |||
| * hnakamur@mc.neweb.ne.jp</a> | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * | |||
| * @ant.type type="condition" name="uptodate" | |||
| */ | |||
| public class UpToDateCondition | |||
| implements Condition | |||
| { | |||
| private final ArrayList m_fileSets = new ArrayList(); | |||
| private FileNameMapper m_mapper; | |||
| private File m_targetFile; | |||
| /** | |||
| * The file which must be more up to date than each of the source files if | |||
| * the property is to be set. | |||
| * | |||
| * @param file the file which we are checking against. | |||
| */ | |||
| public void setTargetFile( final File file ) | |||
| { | |||
| m_targetFile = file; | |||
| } | |||
| /** | |||
| * Nested <srcfiles> element. | |||
| * | |||
| * @param fs The feature to be added to the Srcfiles attribute | |||
| */ | |||
| public void addSrcfiles( final FileSet fs ) | |||
| { | |||
| m_fileSets.add( fs ); | |||
| } | |||
| /** | |||
| * Defines the FileNameMapper to use (nested mapper element). | |||
| */ | |||
| public void add( final FileNameMapper mapper ) | |||
| throws TaskException | |||
| { | |||
| if( m_mapper != null ) | |||
| { | |||
| throw new TaskException( "Cannot define more than one mapper" ); | |||
| } | |||
| m_mapper = mapper; | |||
| } | |||
| /** | |||
| * Evaluates this condition. | |||
| * | |||
| * @param context | |||
| * The context to evaluate the condition in. | |||
| */ | |||
| public boolean evaluate( TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| if( m_targetFile == null && m_mapper == null ) | |||
| { | |||
| throw new TaskException( "The targetfile attribute or a nested mapper element must be set" ); | |||
| } | |||
| // if not there then it can't be up to date | |||
| if( m_targetFile != null && !m_targetFile.exists() ) | |||
| { | |||
| return false; | |||
| } | |||
| final Iterator enum = m_fileSets.iterator(); | |||
| while( enum.hasNext() ) | |||
| { | |||
| final FileSet fs = (FileSet)enum.next(); | |||
| final DirectoryScanner ds = ScannerUtil.getDirectoryScanner( fs ); | |||
| if ( !scanDir( fs.getDir(), ds.getIncludedFiles(), context ) ) | |||
| { | |||
| return false; | |||
| } | |||
| } | |||
| return true; | |||
| } | |||
| private boolean scanDir( final File srcDir, | |||
| final String files[], | |||
| final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| final SourceFileScanner scanner = new SourceFileScanner(); | |||
| FileNameMapper mapper = null; | |||
| File dir = srcDir; | |||
| if( m_mapper == null ) | |||
| { | |||
| final MergingMapper mm = new MergingMapper(); | |||
| mm.setTo( m_targetFile.getAbsolutePath() ); | |||
| mapper = mm; | |||
| dir = null; | |||
| } | |||
| else | |||
| { | |||
| mapper = m_mapper; | |||
| } | |||
| return scanner.restrict( files, srcDir, dir, mapper, context ).length == 0; | |||
| } | |||
| } | |||
| @@ -1,161 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import java.util.ArrayList; | |||
| import java.util.HashMap; | |||
| import java.util.Map; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.interfaces.embeddor.Embeddor; | |||
| import org.apache.myrmidon.interfaces.model.Project; | |||
| import org.apache.myrmidon.interfaces.workspace.Workspace; | |||
| /** | |||
| * Abstract base class for Tasks which execute targets. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public abstract class AbstractAntTask | |||
| extends AbstractTask | |||
| { | |||
| /** | |||
| * If true, inherit all properties from parent Project | |||
| * If false, inherit only userProperties and those defined | |||
| * inside the ant call itself | |||
| */ | |||
| private boolean m_inheritAll; | |||
| /** | |||
| * The target to process in build file. If not specified | |||
| * will use default in specified build file. | |||
| */ | |||
| private String m_target; | |||
| /** | |||
| * The parameters/properties which will be passed to the workspace | |||
| * for the target execution. | |||
| */ | |||
| private final ArrayList m_parameters = new ArrayList(); | |||
| /** | |||
| * Specify whether should inherit properties in sub-build. | |||
| * | |||
| * @param inheritAll true to inherit else false | |||
| */ | |||
| public void setInheritAll( final boolean inheritAll ) | |||
| { | |||
| m_inheritAll = inheritAll; | |||
| } | |||
| /** | |||
| * set the target to process. If none is defined it will | |||
| * execute the default target of the build file | |||
| */ | |||
| public void setTarget( final String target ) | |||
| { | |||
| m_target = target; | |||
| } | |||
| /** | |||
| * Add a parameter to processing of build file. | |||
| * | |||
| * @param param the parameter | |||
| */ | |||
| public void addParam( final AntParam param ) | |||
| { | |||
| m_parameters.add( param ); | |||
| } | |||
| /** | |||
| * Execute the specified build, with specified parameters. | |||
| * | |||
| * @throws TaskException if an error occurs. | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| try | |||
| { | |||
| Project project = getProject(); | |||
| Embeddor embeddor = getEmbeddor(); | |||
| final Workspace workspace = | |||
| embeddor.createWorkspace( buildParameters() ); | |||
| // TODO - inherit listeners, and services (TypeManager specifically) | |||
| workspace.addProjectListener( embeddor.createListener("default")); | |||
| if( null == m_target ) | |||
| { | |||
| m_target = project.getDefaultTargetName(); | |||
| } | |||
| workspace.executeProject( project, m_target ); | |||
| } | |||
| catch( final Exception e ) | |||
| { | |||
| throw new TaskException( e.toString(), e ); | |||
| } | |||
| } | |||
| /** | |||
| * A convenience method for obtaining the Embeddor from the | |||
| * TaskContext. | |||
| * @return The Embeddor contained in the TaskContext | |||
| * @throws TaskException if the Embeddor could not be obtained. | |||
| */ | |||
| protected Embeddor getEmbeddor() throws TaskException | |||
| { | |||
| final Embeddor embeddor = | |||
| (Embeddor)getContext().getService( Embeddor.class ); | |||
| return embeddor; | |||
| } | |||
| /** | |||
| * Get/create/build the project containing the target to be executed. | |||
| * Subclasses will override this method to provide different means | |||
| * of obtaining a project to execute. | |||
| * @return The project containing the target to execute. | |||
| * @throws Exception If a problem occurred building the project. | |||
| */ | |||
| protected abstract Project getProject() throws Exception; | |||
| /** | |||
| * Build the parameters to pass to sub-project. | |||
| * These include the current tasks properties | |||
| * (if inheritall=true) and any supplied by the user. | |||
| * | |||
| * @return the created parameters | |||
| */ | |||
| private Map buildParameters() | |||
| throws TaskException | |||
| { | |||
| final Map parameters = new HashMap(); | |||
| if( m_inheritAll ) | |||
| { | |||
| parameters.putAll( getContext().getProperties() ); | |||
| } | |||
| final int size = m_parameters.size(); | |||
| for( int i = 0; i < size; i++ ) | |||
| { | |||
| final AntParam param = (AntParam)m_parameters.get( i ); | |||
| param.validate(); | |||
| final String name = param.getName(); | |||
| final Object value = param.getValue(); | |||
| parameters.put( name, value ); | |||
| } | |||
| return parameters; | |||
| } | |||
| } | |||
| @@ -1,51 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.conditions.Condition; | |||
| import org.apache.myrmidon.framework.file.Path; | |||
| import org.apache.myrmidon.framework.file.FileListUtil; | |||
| /** | |||
| * An abstract condition which checks for the availability of a particular | |||
| * resource in a classpath. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public abstract class AbstractAvailableCondition | |||
| implements Condition | |||
| { | |||
| private Path m_classpath = new Path(); | |||
| /** | |||
| * Adds a classpath element. | |||
| */ | |||
| public void setClasspath( final Path classpath ) | |||
| { | |||
| m_classpath.add( classpath ); | |||
| } | |||
| /** | |||
| * Adds a classpath element. | |||
| */ | |||
| public void addClasspath( final Path classpath ) | |||
| { | |||
| m_classpath.add( classpath ); | |||
| } | |||
| /** | |||
| * Builds the ClassLoader to use to check resources. | |||
| */ | |||
| protected ClassLoader buildClassLoader( final TaskContext context ) throws TaskException | |||
| { | |||
| return FileListUtil.createClassLoader( m_classpath, context ); | |||
| } | |||
| } | |||
| @@ -1,69 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.interfaces.model.Project; | |||
| /** | |||
| * A task which executes a target in the current project, | |||
| * or a referenced project. | |||
| * | |||
| * @author <a href="mailto:darrell@apache.org">Darrell DeBoer</a> | |||
| * @version $Revision$ $Date$ | |||
| * @ant.task name="ant-call" | |||
| */ | |||
| public class AntCallTask | |||
| extends AbstractAntTask | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( AntCallTask.class ); | |||
| private String m_project; | |||
| /** | |||
| * Specifies the project to execute. If not specified, the current | |||
| * project is used. | |||
| * @param project the name of the Project to execute. | |||
| */ | |||
| public void setProject( String project ) | |||
| { | |||
| m_project = project; | |||
| } | |||
| /** | |||
| * Get/create/build the project which will be executed. | |||
| * Subclasses will override this method to provide different means | |||
| * of obtaining a project to execute. | |||
| * @return The project containing the target to execute. | |||
| * @throws Exception If a problem occurred building the project. | |||
| */ | |||
| protected Project getProject() throws Exception | |||
| { | |||
| Project currentProject = | |||
| (Project)getContext().getService( Project.class ); | |||
| // By default, use the current project. | |||
| Project referencedProject = currentProject; | |||
| if( m_project != null ) | |||
| { | |||
| referencedProject = currentProject.getProject( m_project ); | |||
| if( referencedProject == null ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "antcall.invalid-project.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| return referencedProject; | |||
| } | |||
| } | |||
| @@ -1,89 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * Simple holder for parameters. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @version $Revision$ $Date$ | |||
| * @todo Refactor this and all the other parameter, sysproperty, | |||
| * property etc into a single class in framework | |||
| */ | |||
| public class AntParam | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( AntParam.class ); | |||
| private String m_name; | |||
| private Object m_value; | |||
| /** | |||
| * Set the name of the parameter. | |||
| * | |||
| * @param name the name of parameter | |||
| */ | |||
| public void setName( final String name ) | |||
| { | |||
| m_name = name; | |||
| } | |||
| /** | |||
| * Set the value of the parameter. | |||
| * | |||
| * @param value the parameter value | |||
| */ | |||
| public void setValue( final Object value ) | |||
| { | |||
| m_value = value; | |||
| } | |||
| /** | |||
| * Retrieve name of parameter. | |||
| * | |||
| * @return the name of parameter. | |||
| */ | |||
| public String getName() | |||
| { | |||
| return m_name; | |||
| } | |||
| /** | |||
| * Retrieve the value of parameter. | |||
| * | |||
| * @return the value of parameter. | |||
| */ | |||
| public Object getValue() | |||
| { | |||
| return m_value; | |||
| } | |||
| /** | |||
| * Make sure that neither the name or the value | |||
| * is null. | |||
| */ | |||
| public void validate() | |||
| throws TaskException | |||
| { | |||
| if( null == m_name ) | |||
| { | |||
| final String message = REZ.getString( "param.noname.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| else if( null == m_value ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "param.novalue.error", m_name ); | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,79 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import java.io.File; | |||
| import org.apache.avalon.framework.parameters.Parameters; | |||
| import org.apache.myrmidon.interfaces.model.Project; | |||
| /** | |||
| * Executes a target in a named build file. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @ant.task name="ant" | |||
| */ | |||
| public class AntTask | |||
| extends AbstractAntTask | |||
| { | |||
| /** | |||
| * Default build file. | |||
| */ | |||
| private static final String DEFAULT_BUILD_FILE = "build.ant"; | |||
| /** | |||
| * The build file which to execute. If not set defaults to | |||
| * using "build.ant" in the basedir of current project. | |||
| */ | |||
| private File m_file; | |||
| /** | |||
| * The "type" of the build file. By default this is null which | |||
| * means the type will be determined by the build file extension. | |||
| */ | |||
| private String m_type; | |||
| /** | |||
| * set the build file to process. | |||
| * | |||
| * @param file the build file | |||
| */ | |||
| public void setFile( final File file ) | |||
| { | |||
| m_file = file; | |||
| } | |||
| /** | |||
| * set the type of build file. | |||
| * | |||
| * @param type the type of build file | |||
| */ | |||
| public void setType( final String type ) | |||
| { | |||
| m_type = type; | |||
| } | |||
| /** | |||
| * @return The project containing the target to execute. | |||
| * @throws Exception If a problem occurred building the project. | |||
| */ | |||
| protected Project getProject() throws Exception | |||
| { | |||
| if( null == m_file ) | |||
| { | |||
| m_file = getContext().resolveFile( DEFAULT_BUILD_FILE ); | |||
| } | |||
| final Project project = | |||
| getEmbeddor().createProject( m_file.toString(), | |||
| m_type, | |||
| new Parameters() ); | |||
| return project; | |||
| } | |||
| } | |||
| @@ -1,64 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.conditions.Condition; | |||
| /** | |||
| * A condition that evaluates to true if the requested class is available | |||
| * at runtime. | |||
| * | |||
| * @author Stefano Mazzocchi <a href="mailto:stefano@apache.org"> | |||
| * stefano@apache.org</a> | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| * | |||
| * @ant.type type="condition" name="class-available" | |||
| */ | |||
| public class ClassAvailableCondition | |||
| extends AbstractAvailableCondition | |||
| implements Condition | |||
| { | |||
| private String m_classname; | |||
| /** | |||
| * Sets the name of the class to search for. | |||
| */ | |||
| public void setClassname( final String classname ) | |||
| { | |||
| m_classname = classname; | |||
| } | |||
| /** | |||
| * Evaluates the condition. | |||
| */ | |||
| public boolean evaluate( final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| if( m_classname == null ) | |||
| { | |||
| throw new TaskException( "Classname not specified." ); | |||
| } | |||
| // Build the classloader to use to check resources | |||
| final ClassLoader classLoader = buildClassLoader( context ); | |||
| // Do the check | |||
| try | |||
| { | |||
| classLoader.loadClass( m_classname ); | |||
| return true; | |||
| } | |||
| catch( final Exception e ) | |||
| { | |||
| return false; | |||
| } | |||
| } | |||
| } | |||
| @@ -1,80 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.conditions.AndCondition; | |||
| import org.apache.myrmidon.framework.conditions.Condition; | |||
| /** | |||
| * <condition> task as a generalization of <available> and | |||
| * <uptodate> <p> | |||
| * | |||
| * This task supports boolean logic as well as pluggable conditions to decide, | |||
| * whether a property should be set.</p> <p> | |||
| * | |||
| * This task does not extend Task to take advantage of ConditionBase.</p> | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @version $Revision$ | |||
| * | |||
| * @ant.task name="condition" | |||
| */ | |||
| public class ConditionTask | |||
| extends AbstractTask | |||
| { | |||
| private AndCondition m_condition = new AndCondition(); | |||
| private String m_property; | |||
| private String m_value = "true"; | |||
| /** | |||
| * Adds a condition. | |||
| */ | |||
| public void add( final Condition condition ) | |||
| { | |||
| m_condition.add( condition ); | |||
| } | |||
| /** | |||
| * The name of the property to set. Required. | |||
| * | |||
| * @param p The new Property value | |||
| */ | |||
| public void setProperty( final String p ) | |||
| { | |||
| m_property = p; | |||
| } | |||
| /** | |||
| * The value for the property to set. Defaults to "true". | |||
| * | |||
| * @param v The new Value value | |||
| */ | |||
| public void setValue( final String v ) | |||
| { | |||
| m_value = v; | |||
| } | |||
| /** | |||
| * See whether our nested condition holds and set the property. | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| if( m_property == null ) | |||
| { | |||
| throw new TaskException( "No property was specified" ); | |||
| } | |||
| if( m_condition.evaluate( getContext() ) ) | |||
| { | |||
| getContext().setProperty( m_property, m_value ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,53 +0,0 @@ | |||
| package org.apache.antlib.core; | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.framework.conditions.Condition; | |||
| /** | |||
| * Simple String comparison condition. | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @version $Revision$ | |||
| * | |||
| * @ant.type type="condition" name="equals" | |||
| */ | |||
| public class Equals implements Condition | |||
| { | |||
| private String arg1, arg2; | |||
| public void setArg1( String a1 ) | |||
| { | |||
| arg1 = a1; | |||
| } | |||
| public void setArg2( String a2 ) | |||
| { | |||
| arg2 = a2; | |||
| } | |||
| /** | |||
| * Evaluates this condition. | |||
| * | |||
| * @param context | |||
| * The context to evaluate the condition in. | |||
| */ | |||
| public boolean evaluate( final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| if( arg1 == null || arg2 == null ) | |||
| { | |||
| throw new TaskException( "both arg1 and arg2 are required in equals" ); | |||
| } | |||
| return arg1.equals( arg2 ); | |||
| } | |||
| } | |||
| @@ -1,43 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import org.apache.avalon.excalibur.io.FileUtil; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.FileNameMapper; | |||
| /** | |||
| * Maps file extensions. | |||
| * | |||
| * @ant.type type="mapper" name="map-extension" | |||
| */ | |||
| public class ExtFileNameMapper | |||
| implements FileNameMapper | |||
| { | |||
| private String m_extension; | |||
| public void setExtension( final String extension ) | |||
| { | |||
| m_extension = extension; | |||
| } | |||
| public String[] mapFileName( final String filename, TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| final String name = FileUtil.removeExtension( filename ); | |||
| if( m_extension != null ) | |||
| { | |||
| return new String[]{ name + '.' + m_extension }; | |||
| } | |||
| else | |||
| { | |||
| return new String[]{ name }; | |||
| } | |||
| } | |||
| } | |||
| @@ -1,59 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * This is a task used to throw a TaskException. | |||
| * Useful for forcing a build to fail on a certain condition. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @ant.task name="fail" | |||
| */ | |||
| public class Fail | |||
| extends AbstractTask | |||
| { | |||
| private String m_message; | |||
| public void setMessage( final String message ) | |||
| { | |||
| checkNullMessage(); | |||
| m_message = message; | |||
| } | |||
| public void addContent( final String message ) | |||
| { | |||
| checkNullMessage(); | |||
| m_message = message; | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| if( null != m_message ) | |||
| { | |||
| throw new TaskException( m_message ); | |||
| } | |||
| else | |||
| { | |||
| throw new TaskException(); | |||
| } | |||
| } | |||
| private void checkNullMessage() | |||
| { | |||
| if( null != m_message ) | |||
| { | |||
| final String message = "Message can only be set once by " + | |||
| "either nested content or the message attribute"; | |||
| throw new IllegalStateException( message ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,81 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import java.io.File; | |||
| import java.io.FileInputStream; | |||
| import java.util.HashMap; | |||
| import java.util.Map; | |||
| import java.util.Properties; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.avalon.excalibur.io.IOUtil; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.filters.TokenSet; | |||
| /** | |||
| * A set of tokens that are read from a file. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.type type="token-set" name="tokens-file" | |||
| */ | |||
| public class FileTokenSet | |||
| implements TokenSet | |||
| { | |||
| private static final Resources REZ | |||
| = ResourceManager.getPackageResources( FileTokenSet.class ); | |||
| private Map m_tokens = new HashMap(); | |||
| /** | |||
| * set the file containing the tokens for this tokenset. | |||
| */ | |||
| public void setFile( final File file ) | |||
| throws TaskException | |||
| { | |||
| // TODO - defer loading the tokens | |||
| if( !file.isFile() ) | |||
| { | |||
| final String message = REZ.getString( "filetokenset.not-a-file.error", file ); | |||
| throw new TaskException( message ); | |||
| } | |||
| try | |||
| { | |||
| FileInputStream instr = new FileInputStream( file ); | |||
| try | |||
| { | |||
| Properties props = new Properties(); | |||
| props.load( instr ); | |||
| m_tokens.putAll( props ); | |||
| } | |||
| finally | |||
| { | |||
| IOUtil.shutdownStream( instr ); | |||
| } | |||
| } | |||
| catch( final Exception e ) | |||
| { | |||
| final String message = REZ.getString( "filetokenset.read-tokens.error", file ); | |||
| throw new TaskException( message, e ); | |||
| } | |||
| } | |||
| /** | |||
| * Evaluates the value for a token. | |||
| */ | |||
| public String getValue( String token, TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| return (String)m_tokens.get( token ); | |||
| } | |||
| } | |||
| @@ -1,41 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import org.apache.avalon.excalibur.io.FileUtil; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.FileNameMapper; | |||
| /** | |||
| * Implementation of FileNameMapper that always returns the source file name | |||
| * without any leading directory information. <p> | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * | |||
| * @ant.type type="mapper" name="flatten" | |||
| */ | |||
| public class FlatFileNameMapper | |||
| extends PrefixFileNameMapper | |||
| implements FileNameMapper | |||
| { | |||
| /** | |||
| * Returns an one-element array containing the source file name without any | |||
| * leading directory information. | |||
| * | |||
| * @param sourceFileName Description of Parameter | |||
| * @return Description of the Returned Value | |||
| */ | |||
| public String[] mapFileName( final String sourceFileName, TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| final String baseName = FileUtil.removePath( sourceFileName, '/' ); | |||
| return super.mapFileName( baseName, context ); | |||
| } | |||
| } | |||
| @@ -1,123 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import java.util.ArrayList; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.avalon.framework.configuration.Configuration; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.AbstractContainerTask; | |||
| import org.apache.myrmidon.framework.conditions.AndCondition; | |||
| import org.apache.myrmidon.framework.conditions.Condition; | |||
| import org.apache.myrmidon.framework.conditions.IsTrueCondition; | |||
| import org.apache.myrmidon.framework.conditions.NotCondition; | |||
| /** | |||
| * A simple task to test a supplied condition. If the condition is true | |||
| * then it will execute the inner tasks, else it won't. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @version $Revision$ $Date$ | |||
| * @ant.task name="if" | |||
| */ | |||
| public class IfTask | |||
| extends AbstractContainerTask | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( IfTask.class ); | |||
| private Condition m_condition; | |||
| private ArrayList m_tasks = new ArrayList(); | |||
| /** | |||
| * Set if clause on pattern. | |||
| * | |||
| * @param condition the condition | |||
| * @exception TaskException if an error occurs | |||
| */ | |||
| public void setTest( final String condition ) | |||
| throws TaskException | |||
| { | |||
| verifyConditionNull(); | |||
| m_condition = new IsTrueCondition( condition ); | |||
| } | |||
| /** | |||
| * Set unless clause of pattern. | |||
| * | |||
| * @param condition the unless clause | |||
| * @exception TaskException if an error occurs | |||
| */ | |||
| public void setNotTest( final String condition ) | |||
| throws TaskException | |||
| { | |||
| verifyConditionNull(); | |||
| m_condition = new NotCondition( new IsTrueCondition( condition ) ); | |||
| } | |||
| /** | |||
| * Add a nested "condition" element, which provides an AndCondition | |||
| * container for any type of condition. | |||
| * @param andCondition The configured Condition | |||
| * @throws TaskException If a condition has already been set. | |||
| */ | |||
| public void addCondition( final AndCondition andCondition ) | |||
| throws TaskException | |||
| { | |||
| verifyConditionNull(); | |||
| m_condition = andCondition; | |||
| } | |||
| public void add( final Configuration task ) | |||
| { | |||
| m_tasks.add( task ); | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| if( null == m_condition ) | |||
| { | |||
| final String message = REZ.getString( "if.no-condition.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| // Evaluate the condition | |||
| if( !m_condition.evaluate( getContext() ) ) | |||
| { | |||
| return; | |||
| } | |||
| final Configuration[] tasks = | |||
| (Configuration[])m_tasks.toArray( new Configuration[ m_tasks.size() ] ); | |||
| executeTasks( tasks ); | |||
| } | |||
| public String toString() | |||
| { | |||
| return "If['" + m_condition + "]"; | |||
| } | |||
| /** | |||
| * Utility method to make sure condition unset. | |||
| * Made so that it is not possible for both if and unless to be set. | |||
| * | |||
| * @exception TaskException if an error occurs | |||
| */ | |||
| private void verifyConditionNull() | |||
| throws TaskException | |||
| { | |||
| if( null != m_condition ) | |||
| { | |||
| final String message = REZ.getString( "if.ifelse-duplicate.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,126 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import java.io.File; | |||
| import java.io.FileInputStream; | |||
| import java.io.IOException; | |||
| import java.util.Properties; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.avalon.excalibur.io.IOUtil; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * This task loads properties from a property file and places them in the context. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @ant.task name="load-properties" | |||
| */ | |||
| public class LoadProperties | |||
| extends AbstractTask | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( LoadProperties.class ); | |||
| private String m_prefix; | |||
| private File m_file; | |||
| /** | |||
| * Specify the prefix to be placed before all properties (if any). | |||
| */ | |||
| public void setPrefix( final String prefix ) | |||
| { | |||
| m_prefix = prefix; | |||
| } | |||
| public void setFile( final File file ) | |||
| { | |||
| m_file = file; | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| if( null == m_file ) | |||
| { | |||
| final String message = REZ.getString( "loadprop.no-file.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| //Make sure prefix ends with a '.' if specified | |||
| if( null == m_prefix ) | |||
| { | |||
| m_prefix = ""; | |||
| } | |||
| else if( !m_prefix.endsWith( "." ) ) | |||
| { | |||
| m_prefix += "."; | |||
| } | |||
| loadFile( m_file ); | |||
| } | |||
| /** | |||
| * Utility method to load properties file. | |||
| */ | |||
| private void loadFile( final File file ) | |||
| throws TaskException | |||
| { | |||
| if( getContext().isDebugEnabled() ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "loadprop.file.notice", file.getAbsolutePath() ); | |||
| getContext().debug( message ); | |||
| } | |||
| if( !file.exists() ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "loadprop.missing-file.notice", file.getAbsolutePath() ); | |||
| getContext().debug( message ); | |||
| } | |||
| else | |||
| { | |||
| FileInputStream input = null; | |||
| try | |||
| { | |||
| input = new FileInputStream( file ); | |||
| final Properties properties = new PropertyLoader( this ); | |||
| properties.load( input ); | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| throw new TaskException( ioe.getMessage(), ioe ); | |||
| } | |||
| IOUtil.shutdownStream( input ); | |||
| } | |||
| } | |||
| /** | |||
| * Utility method that will resolve and add specified proeprty. | |||
| * Used by external PropertyLoader class as a call back method. | |||
| */ | |||
| protected final void addUnresolvedValue( final String name, final String value ) | |||
| { | |||
| try | |||
| { | |||
| final Object objectValue = getContext().resolveValue( value.toString() ); | |||
| final String name1 = m_prefix + name; | |||
| getContext().setProperty( name1, objectValue ); | |||
| } | |||
| catch( final TaskException te ) | |||
| { | |||
| final String message = REZ.getString( "loadprop.bad-resolve.error", name, value ); | |||
| getContext().info( message, te ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,82 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.LogLevel; | |||
| /** | |||
| * This is a task used to log messages in the build file. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @ant.task name="log" | |||
| */ | |||
| public class Log | |||
| extends AbstractTask | |||
| { | |||
| /** | |||
| * The message to printout when logging | |||
| */ | |||
| private String m_message; | |||
| /** | |||
| * The level at which to print out messages. | |||
| */ | |||
| private LogLevel m_level = LogLevel.INFO; | |||
| /** | |||
| * Set the level at which the message will be logged. | |||
| * | |||
| * @param level the level at which message will be logged | |||
| */ | |||
| public void setLevel( final LogLevel level ) | |||
| { | |||
| m_level = level; | |||
| } | |||
| /** | |||
| * Set the message to print out when logging message | |||
| */ | |||
| public void setMessage( final String message ) | |||
| { | |||
| checkNullMessage(); | |||
| m_message = message; | |||
| } | |||
| /** | |||
| * Set the message to print out when logging message | |||
| */ | |||
| public void addContent( final String message ) | |||
| { | |||
| checkNullMessage(); | |||
| m_message = message; | |||
| } | |||
| /** | |||
| * Log message at specified level. | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| LogLevel.log( getContext(), m_level, m_message ); | |||
| } | |||
| /** | |||
| * Utility message to verify that the message has not already been set. | |||
| */ | |||
| private void checkNullMessage() | |||
| { | |||
| if( null != m_message ) | |||
| { | |||
| final String message = "Message can only be set once by " + | |||
| "either nested content or the message attribute"; | |||
| throw new IllegalStateException( message ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,56 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.FileNameMapper; | |||
| /** | |||
| * A filename mapper that applies a prefix to each file. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.type type="mapper" name="prefix" | |||
| */ | |||
| public class PrefixFileNameMapper | |||
| implements FileNameMapper | |||
| { | |||
| private String m_prefix; | |||
| /** | |||
| * Sets the prefix. | |||
| */ | |||
| public void setPrefix( final String prefix ) | |||
| { | |||
| m_prefix = prefix; | |||
| if( ! m_prefix.endsWith( "/" ) ) | |||
| { | |||
| m_prefix = m_prefix + '/'; | |||
| } | |||
| } | |||
| /** | |||
| * Returns an array containing the target filename(s) for the given source | |||
| * file. | |||
| */ | |||
| public String[] mapFileName( final String sourceFileName, | |||
| final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| if( m_prefix == null ) | |||
| { | |||
| return new String[]{ sourceFileName }; | |||
| } | |||
| else | |||
| { | |||
| return new String[] { m_prefix + sourceFileName }; | |||
| } | |||
| } | |||
| } | |||
| @@ -1,89 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.DataType; | |||
| /** | |||
| * This is the property "task" to declare a binding of a datatype to a name. | |||
| * | |||
| * TODO: Determine final format of property task. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @version $Revision$ $Date$ | |||
| * @ant.task name="property" | |||
| */ | |||
| public class Property | |||
| extends AbstractTask | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( Property.class ); | |||
| private String m_name; | |||
| private Object m_value; | |||
| public void setName( final String name ) | |||
| { | |||
| m_name = name; | |||
| } | |||
| /** | |||
| * Sets the property value from a nested element. | |||
| */ | |||
| public void add( final DataType value ) | |||
| throws TaskException | |||
| { | |||
| setValue( value ); | |||
| } | |||
| /** | |||
| * Sets the property value from text content. | |||
| */ | |||
| public void addContent( final String value ) | |||
| throws TaskException | |||
| { | |||
| setValue( value ); | |||
| } | |||
| /** | |||
| * Sets the property value from an attribute. | |||
| */ | |||
| public void setValue( final Object value ) | |||
| throws TaskException | |||
| { | |||
| if( null != m_value ) | |||
| { | |||
| final String message = REZ.getString( "property.multi-set.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| m_value = value; | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| if( null == m_name ) | |||
| { | |||
| final String message = REZ.getString( "property.no-name.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| if( null == m_value ) | |||
| { | |||
| final String message = REZ.getString( "property.no-value.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| getContext().setProperty( m_name, m_value ); | |||
| } | |||
| } | |||
| @@ -1,68 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import java.util.Iterator; | |||
| import java.util.Map; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * This is a simple task used to dump out all the proeprtys in the | |||
| * runtime. Useful for debugging behaviour in ant build directives. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @author <a href="mailto:jimcook@visualxs.com">Jim Cook</a> | |||
| * @version $Revision$ $Date$ | |||
| * @ant.task name="property-dump" | |||
| * @todo Consider moving to new antlib | |||
| */ | |||
| public class PropertyDump | |||
| extends AbstractTask | |||
| { | |||
| /** | |||
| * The prefix which the keys must start with if they are | |||
| * to be dumped. | |||
| */ | |||
| private String m_prefix; | |||
| /** | |||
| * Set the prefix which the keys must start with if they are | |||
| * to be dumped. If not specified then all keys are dumped. | |||
| * | |||
| * @param prefix the prefix | |||
| */ | |||
| public void setPrefix( final String prefix ) | |||
| { | |||
| m_prefix = prefix; | |||
| } | |||
| /** | |||
| * Printout all the properties in ant runtime. | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| final Map properties = getContext().getProperties(); | |||
| final Iterator iterator = properties.keySet().iterator(); | |||
| while( iterator.hasNext() ) | |||
| { | |||
| final String key = (String)iterator.next(); | |||
| final Object value = properties.get( key ); | |||
| //Check to see if property starts with specified prefix | |||
| //and if it doesn't then skip property | |||
| if( null != m_prefix && !key.startsWith( m_prefix ) ) | |||
| { | |||
| continue; | |||
| } | |||
| getContext().info( key + "=" + value ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,34 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import java.util.Properties; | |||
| /** | |||
| * This class is an UGLY HACK utility class to enable us to reuse | |||
| * the property parsing and loading code from Properties object. | |||
| */ | |||
| class PropertyLoader | |||
| extends Properties | |||
| { | |||
| private LoadProperties m_loadProperties; | |||
| public PropertyLoader( LoadProperties loadProperties ) | |||
| { | |||
| m_loadProperties = loadProperties; | |||
| } | |||
| /** | |||
| * Overidden put to add unresolved values. | |||
| */ | |||
| public synchronized Object put( Object key, Object value ) | |||
| { | |||
| m_loadProperties.addUnresolvedValue( key.toString(), value.toString() ); | |||
| return null; | |||
| } | |||
| } | |||
| @@ -1,38 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.filters.TokenSet; | |||
| /** | |||
| * A token set that uses the project's properties as tokens. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.type type="token-set" name="properties" | |||
| */ | |||
| public class PropertyTokenSet | |||
| implements TokenSet | |||
| { | |||
| /** | |||
| * Evaluates the value for a token. | |||
| */ | |||
| public String getValue( String token, TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| final Object propValue = context.getProperty( token ); | |||
| if( propValue == null ) | |||
| { | |||
| return null; | |||
| } | |||
| return propValue.toString(); | |||
| } | |||
| } | |||
| @@ -1,61 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import java.io.InputStream; | |||
| import org.apache.avalon.excalibur.io.IOUtil; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.conditions.Condition; | |||
| /** | |||
| * A condition that evaluates to true if the requested resource is available | |||
| * at runtime. | |||
| * | |||
| * @author Stefano Mazzocchi <a href="mailto:stefano@apache.org"> | |||
| * stefano@apache.org</a> | |||
| * @author <a href="mailto:umagesh@apache.org">Magesh Umasankar</a> | |||
| * | |||
| * @ant.type type="condition" name="resource-available" | |||
| */ | |||
| public class ResourceAvailableCondition | |||
| extends AbstractAvailableCondition | |||
| implements Condition | |||
| { | |||
| private String m_resource; | |||
| /** | |||
| * Sets the name of the resource to look for. | |||
| */ | |||
| public void setResource( final String resource ) | |||
| { | |||
| m_resource = resource; | |||
| } | |||
| /** | |||
| * Evaluates the condition. | |||
| */ | |||
| public boolean evaluate( final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| if( m_resource == null ) | |||
| { | |||
| throw new TaskException( "Resource was not specified." ); | |||
| } | |||
| // Check whether the resource is available | |||
| final ClassLoader classLoader = buildClassLoader( context ); | |||
| final InputStream instr = classLoader.getResourceAsStream( m_resource ); | |||
| if( instr != null ) | |||
| { | |||
| IOUtil.shutdownStream( instr ); | |||
| return true; | |||
| } | |||
| return false; | |||
| } | |||
| } | |||
| @@ -1,39 +0,0 @@ | |||
| property.no-set.error=Unable to set datatype. | |||
| property.multi-set.error=Value can not be set multiple times. | |||
| property.no-name.error=Name must be specified. | |||
| property.no-value.error=Value must be specified. | |||
| loadprop.no-file.error=No file specified to load properties from. | |||
| loadprop.file.notice=Loading proeprties from {0}. | |||
| loadprop.missing-file.notice=Unable to find property file: {0}. | |||
| loadprop.bad-resolve.error=Unable to resolve and set property named "{0}" to value "{1}". | |||
| convert.bad-boolean.error=Error converting object ({0}) to Boolean. | |||
| convert.bad-byte.error=Error converting object ({0}) to Byte. | |||
| convert.bad-class.error=Error converting object ({0}) to Class. | |||
| convert.bad-double.error=Error converting object ({0}) to Double. | |||
| convert.bad-file.error=Error converting object ({0}) to File. | |||
| getByName.error=Failed to retrieve enum by calling getByName on "{0}". (Reason: {1}). | |||
| enum.missing.getByName.error=Enum class "{0}" is missing a public static method named "getByName" that accepts a single string parameter. | |||
| enum.missing.getNames.error=Enum class "{0}" is missing a public static method named "getNames" that returns a String array of all enum names. | |||
| invalid.enum.error=Invalid value "{0}" for enum, expected one of {1}. | |||
| if.ifelse-duplicate.error=Can only set one condition for If task type. Conditions may be 'test' or 'not-test' attributes, or nested 'condition' elements. | |||
| if.no-condition.error=No condition was specified for If task. | |||
| trycatch.multiple-trys.error=Multiple <try/> elements can not be placed inside <try-catch/> task. | |||
| trycatch.missing-try-before-catch.error=There needs to be a <try/> element before <catch/> element. | |||
| trycatch.multiple-catches.error=Multiple <catch/> elements can not be placed inside <try-catch/> task. | |||
| trycatch.missing-try-before-finally.error=There needs to be a <try/> element before <finally/> element. | |||
| trycatch.multiple-finallys.error=Multiple <finally/> elements can not be placed inside <try-catch/> task. | |||
| trycatch.no-try.error=Missing <try/> element from <try-catch/> task. | |||
| trycatch.missing-second.error=Missing <catch/> or <finally/> elements from <try-catch/> task. | |||
| filetokenset.not-a-file.error=File {0} does not exist, or is not a file. | |||
| filetokenset.read-tokens.error=Could not read tokens from {0}. | |||
| param.noname.error=Missing name from parameter. | |||
| param.novalue.error=Missing value from parameter "{0}". | |||
| antcall.invalid-project.error=Project-reference "{0}" not found. | |||
| @@ -1,82 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.filters.TokenSet; | |||
| /** | |||
| * A single token and its value. | |||
| * | |||
| * @author Michael McCallum | |||
| * @created 14 March 2001 | |||
| * | |||
| * @ant.type type="token-set" name="token" | |||
| */ | |||
| public class SingletonTokenSet | |||
| implements TokenSet | |||
| { | |||
| /** | |||
| * Token which will be replaced in the filter operation | |||
| */ | |||
| private String m_token; | |||
| /** | |||
| * The value which will replace the token in the filtering operation | |||
| */ | |||
| private String m_value; | |||
| /** | |||
| * Constructor for the Filter object | |||
| * | |||
| * @param token The token which will be replaced when filtering | |||
| * @param value The value which will replace the token when filtering | |||
| */ | |||
| public SingletonTokenSet( final String token, final String value ) | |||
| { | |||
| m_token = token; | |||
| m_value = value; | |||
| } | |||
| /** | |||
| * No argument conmstructor | |||
| */ | |||
| public SingletonTokenSet() | |||
| { | |||
| } | |||
| /** | |||
| * Sets the Token attribute of the Filter object | |||
| */ | |||
| public void setToken( final String token ) | |||
| { | |||
| m_token = token; | |||
| } | |||
| /** | |||
| * Sets the Value attribute of the Filter object | |||
| */ | |||
| public void setValue( final String value ) | |||
| { | |||
| m_value = value; | |||
| } | |||
| /** | |||
| * Evaluates the value for a token. | |||
| */ | |||
| public String getValue( final String token, final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| if( token.equals( m_token ) ) | |||
| { | |||
| return m_value; | |||
| } | |||
| return null; | |||
| } | |||
| } | |||
| @@ -1,101 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import java.lang.reflect.InvocationTargetException; | |||
| import java.lang.reflect.Method; | |||
| import java.util.Arrays; | |||
| import org.apache.aut.converter.Converter; | |||
| import org.apache.aut.converter.ConverterException; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| /** | |||
| * String to Enum converter | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @ant.converter source="java.lang.String" destination="org.apache.avalon.framework.Enum" | |||
| */ | |||
| public class StringToEnumConverter | |||
| implements Converter | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( StringToEnumConverter.class ); | |||
| public Object convert( final Class destination, | |||
| final Object original, | |||
| final Object context ) | |||
| throws ConverterException | |||
| { | |||
| final Object object = getEnum( destination, original ); | |||
| if( null == object ) | |||
| { | |||
| final String[] names = getValidNames( destination ); | |||
| final String message = | |||
| REZ.getString( "invalid.enum.error", original, Arrays.asList( names ) ); | |||
| throw new ConverterException( message ); | |||
| } | |||
| else | |||
| { | |||
| return object; | |||
| } | |||
| } | |||
| private Object getEnum( final Class destination, final Object original ) | |||
| throws ConverterException | |||
| { | |||
| try | |||
| { | |||
| final Class[] types = new Class[]{String.class}; | |||
| final Object[] args = new Object[]{original.toString()}; | |||
| final Method method = destination.getMethod( "getByName", types ); | |||
| return method.invoke( null, args ); | |||
| } | |||
| catch( final InvocationTargetException ite ) | |||
| { | |||
| final Throwable target = ite.getTargetException(); | |||
| if( target instanceof IllegalArgumentException ) | |||
| { | |||
| return null; | |||
| } | |||
| else | |||
| { | |||
| final String message = | |||
| REZ.getString( "getByName.error", destination.getName(), target ); | |||
| throw new ConverterException( message, target ); | |||
| } | |||
| } | |||
| catch( final Exception e ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "enum.missing.getByName.error", destination.getName() ); | |||
| throw new ConverterException( message, e ); | |||
| } | |||
| } | |||
| private String[] getValidNames( final Class clazz ) | |||
| throws ConverterException | |||
| { | |||
| try | |||
| { | |||
| final Class[] types = new Class[ 0 ]; | |||
| final Object[] args = new Object[ 0 ]; | |||
| final Method method = clazz.getMethod( "getNames", types ); | |||
| return (String[])method.invoke( null, args ); | |||
| } | |||
| catch( final Exception e ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "enum.missing.getNames.error", clazz.getName() ); | |||
| throw new ConverterException( message, e ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,50 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import java.io.File; | |||
| import org.apache.aut.converter.AbstractConverter; | |||
| import org.apache.aut.converter.ConverterException; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * String to file converter | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @ant.converter source="java.lang.String" destination="java.io.File" | |||
| */ | |||
| public class StringToFileConverter | |||
| extends AbstractConverter | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( StringToFileConverter.class ); | |||
| public StringToFileConverter() | |||
| { | |||
| super( String.class, File.class ); | |||
| } | |||
| public Object convert( final Object object, final Object context ) | |||
| throws ConverterException | |||
| { | |||
| try | |||
| { | |||
| final TaskContext taskContext = (TaskContext)context; | |||
| return taskContext.resolveFile( (String)object ); | |||
| } | |||
| catch( final TaskException te ) | |||
| { | |||
| final String message = REZ.getString( "convert.bad-file.error", object ); | |||
| throw new ConverterException( message, te ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,129 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.core; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.avalon.framework.configuration.Configuration; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.AbstractContainerTask; | |||
| import org.apache.myrmidon.framework.TaskList; | |||
| /** | |||
| * A task that emulates the try-catch-finally construct in a number | |||
| * of languages. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @version $Revision$ $Date$ | |||
| * @ant.task name="try-catch" | |||
| */ | |||
| public final class TryCatchTask | |||
| extends AbstractContainerTask | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( TryCatchTask.class ); | |||
| private TaskList m_try; | |||
| private TaskList m_catch; | |||
| private TaskList m_finally; | |||
| public void addTry( final TaskList taskList ) | |||
| throws TaskException | |||
| { | |||
| if( null != m_try ) | |||
| { | |||
| final String message = REZ.getString( "trycatch.multiple-trys.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| m_try = taskList; | |||
| } | |||
| public void addCatch( final TaskList taskList ) | |||
| throws TaskException | |||
| { | |||
| if( null == m_try ) | |||
| { | |||
| final String message = REZ.getString( "trycatch.missing-try-before-catch.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| else if( null != m_catch ) | |||
| { | |||
| final String message = REZ.getString( "trycatch.multiple-catches.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| m_catch = taskList; | |||
| } | |||
| public void addFinally( final TaskList taskList ) | |||
| throws TaskException | |||
| { | |||
| if( null == m_try ) | |||
| { | |||
| final String message = REZ.getString( "trycatch.missing-try-before-finally.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| else if( null != m_finally ) | |||
| { | |||
| final String message = REZ.getString( "trycatch.multiple-finallys.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| m_finally = taskList; | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| validate(); | |||
| try | |||
| { | |||
| final Configuration[] tasks = m_try.getTasks(); | |||
| executeTasks( tasks ); | |||
| } | |||
| catch( final TaskException te ) | |||
| { | |||
| if( null != m_catch ) | |||
| { | |||
| final Configuration[] tasks = m_catch.getTasks(); | |||
| executeTasks( tasks ); | |||
| } | |||
| else | |||
| { | |||
| throw te; | |||
| } | |||
| } | |||
| finally | |||
| { | |||
| if( null != m_finally ) | |||
| { | |||
| final Configuration[] tasks = m_finally.getTasks(); | |||
| executeTasks( tasks ); | |||
| } | |||
| } | |||
| } | |||
| private void validate() | |||
| throws TaskException | |||
| { | |||
| if( null == m_try ) | |||
| { | |||
| final String message = REZ.getString( "trycatch.no-try.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| else if( null == m_catch && null == m_finally ) | |||
| { | |||
| final String message = REZ.getString( "trycatch.missing-second.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| public String toString() | |||
| { | |||
| return "Try-Catch-Finally"; | |||
| } | |||
| } | |||
| @@ -1,827 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.dotnet; | |||
| import java.io.File; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.nativelib.Execute; | |||
| import org.apache.tools.todo.taskdefs.MatchingTask; | |||
| import org.apache.tools.todo.types.DirectoryScanner; | |||
| import org.apache.myrmidon.framework.nativelib.ArgumentList; | |||
| import org.apache.myrmidon.framework.file.Path; | |||
| /** | |||
| * This task compiles CSharp source into executables or modules. The task will | |||
| * only work on win2K until other platforms support csc.exe or an equivalent. | |||
| * CSC.exe must be on the execute path too. <p> | |||
| * | |||
| * All parameters are optional: <csc/> should suffice to produce a debug | |||
| * build of all *.cs files. References to external files do require explicit | |||
| * enumeration, so are one of the first attributes to consider adding. <p> | |||
| * | |||
| * The task is a directory based task, so attributes like <b>includes="*.cs"</b> | |||
| * and <b>excludes="broken.cs"</b> can be used to control the files pulled in. | |||
| * By default, all *.cs files from the project folder down are included in the | |||
| * command. When this happens the output file -if not specified- is taken as the | |||
| * first file in the list, which may be somewhat hard to control. Specifying the | |||
| * output file with <b>'outfile'</b> seems prudent. <p> | |||
| * | |||
| * <p> | |||
| * | |||
| * TODO | |||
| * <ol> | |||
| * <li> is incremental build still broken in beta-1? | |||
| * <li> is Win32Icon broken? | |||
| * <li> all the missing options | |||
| * </ol> | |||
| * <p> | |||
| * | |||
| * History | |||
| * <Table> | |||
| * | |||
| * <tr> | |||
| * | |||
| * <td> | |||
| * 0.3 | |||
| * </td> | |||
| * | |||
| * <td> | |||
| * Beta 1 edition | |||
| * </td> | |||
| * | |||
| * <td> | |||
| * To avoid having to remember which assemblies to include, the task | |||
| * automatically refers to the main dotnet libraries in Beta1. | |||
| * </tr> | |||
| * | |||
| * <tr> | |||
| * | |||
| * <td> | |||
| * 0.2 | |||
| * </td> | |||
| * | |||
| * <td> | |||
| * Slightly different | |||
| * </td> | |||
| * | |||
| * <td> | |||
| * Split command execution to a separate class; | |||
| * </tr> | |||
| * | |||
| * <tr> | |||
| * | |||
| * <td> | |||
| * 0.1 | |||
| * </td> | |||
| * | |||
| * <td> | |||
| * "I can't believe it's so rudimentary" | |||
| * </td> | |||
| * | |||
| * <td> | |||
| * First pass; minimal builds only support; | |||
| * </tr> | |||
| * | |||
| * </table> | |||
| * | |||
| * | |||
| * @author Steve Loughran steve_l@iseran.com | |||
| * @version 0.3 | |||
| */ | |||
| public class CSharp | |||
| extends MatchingTask | |||
| { | |||
| /** | |||
| * name of the executable. the .exe suffix is deliberately not included in | |||
| * anticipation of the unix version | |||
| */ | |||
| private static final String EXE_NAME = "csc"; | |||
| /** | |||
| * what is the file extension we search on? | |||
| */ | |||
| private static final String FILE_EXT = "cs"; | |||
| /** | |||
| * derive the search pattern from the extension | |||
| */ | |||
| private static final String FILE_PATTERN = "**/*." + FILE_EXT; | |||
| /** | |||
| * Fix C# reference inclusion. C# is really dumb in how it handles | |||
| * inclusion. You have to list every 'assembly' -read DLL that is imported. | |||
| * So already you are making a platform assumption -shared libraries have a | |||
| * .dll;"+ extension and the poor developer has to know every library which | |||
| * is included why the compiler cant find classes on the path or in a | |||
| * directory, is a mystery. To reduce the need to be explicit, here is a | |||
| * long list of the core libraries used in Beta-1 of .NET ommitting the | |||
| * blatantly non portable (MS.win32.interop) and the .designer libraries. | |||
| * (ripping out Com was tempting) Casing is chosen to match that of the file | |||
| * system <i>exactly</i> so may work on a unix box too. | |||
| */ | |||
| private static final String DEFAULT_REFERENCE_LIST = | |||
| "Accessibility.dll;" + | |||
| "cscompmgd.dll;" + | |||
| "CustomMarshalers.dll;" + | |||
| "IEExecRemote.dll;" + | |||
| "IEHost.dll;" + | |||
| "IIEHost.dll;" + | |||
| "ISymWrapper.dll;" + | |||
| "Microsoft.JScript.dll;" + | |||
| "Microsoft.VisualBasic.dll;" + | |||
| "Microsoft.VisualC.dll;" + | |||
| "Microsoft.Vsa.dll;" + | |||
| "Mscorcfg.dll;" + | |||
| "RegCode.dll;" + | |||
| "System.Configuration.Install.dll;" + | |||
| "System.Data.dll;" + | |||
| "System.Design.dll;" + | |||
| "System.DirectoryServices.dll;" + | |||
| "System.EnterpriseServices.dll;" + | |||
| "System.dll;" + | |||
| "System.Drawing.Design.dll;" + | |||
| "System.Drawing.dll;" + | |||
| "System.Management.dll;" + | |||
| "System.Messaging.dll;" + | |||
| "System.Runtime.Remoting.dll;" + | |||
| "System.Runtime.Serialization.Formatters.Soap.dll;" + | |||
| "System.Security.dll;" + | |||
| "System.ServiceProcess.dll;" + | |||
| "System.Web.dll;" + | |||
| "System.Web.RegularExpressions.dll;" + | |||
| "System.Web.Services.dll;" + | |||
| "System.Windows.Forms.dll;" + | |||
| "System.XML.dll;"; | |||
| /** | |||
| * utf out flag | |||
| */ | |||
| private boolean m_utf8output; | |||
| private boolean m_fullpaths = true; | |||
| /** | |||
| * debug flag. Controls generation of debug information. | |||
| */ | |||
| private boolean m_debug = true; | |||
| /** | |||
| * output XML documentation flag | |||
| */ | |||
| private File m_docFile; | |||
| /** | |||
| * any extra command options? | |||
| */ | |||
| private String m_extraOptions; | |||
| /** | |||
| * flag to enable automatic reference inclusion | |||
| */ | |||
| private boolean m_includeDefaultReferences = true; | |||
| /** | |||
| * incremental build flag | |||
| */ | |||
| private boolean m_incremental; | |||
| /** | |||
| * main class (or null for automatic choice) | |||
| */ | |||
| private String m_mainClass; | |||
| /** | |||
| * optimise flag | |||
| */ | |||
| private boolean m_optimize; | |||
| /** | |||
| * output file. If not supplied this is derived from the source file | |||
| */ | |||
| private File m_outputFile; | |||
| /** | |||
| * using the path approach didnt work as it could not handle the implicit | |||
| * execution path. Perhaps that could be extracted from the runtime and then | |||
| * the path approach would be viable | |||
| */ | |||
| private Path m_referenceFiles; | |||
| /** | |||
| * list of reference classes. (pretty much a classpath equivalent) | |||
| */ | |||
| private String m_references; | |||
| /** | |||
| * type of target. Should be one of exe|library|module|winexe|(null) default | |||
| * is exe; the actual value (if not null) is fed to the command line. <br> | |||
| * See /target | |||
| */ | |||
| private String m_targetType; | |||
| /** | |||
| * enable unsafe code flag. Clearly set to false by default | |||
| */ | |||
| private boolean m_unsafe; | |||
| /** | |||
| * icon for incorporation into apps | |||
| */ | |||
| private File m_win32icon; | |||
| /** | |||
| * icon for incorporation into apps | |||
| */ | |||
| private File m_win32res; | |||
| /** | |||
| * list of extra modules to refer to | |||
| */ | |||
| private String m_additionalModules; | |||
| /** | |||
| * defines list something like 'RELEASE;WIN32;NO_SANITY_CHECKS;;SOMETHING_ELSE' | |||
| */ | |||
| private String m_definitions; | |||
| /** | |||
| * destination directory (null means use the source directory) NB: this is | |||
| * currently not used | |||
| */ | |||
| private File m_destDir; | |||
| /** | |||
| * source directory upon which the search pattern is applied | |||
| */ | |||
| private File m_srcDir; | |||
| /** | |||
| * warning level: 0-4, with 4 being most verbose | |||
| */ | |||
| private int m_warnLevel = 3; | |||
| /** | |||
| * constructor inits everything and set up the search pattern | |||
| */ | |||
| public CSharp() | |||
| throws TaskException | |||
| { | |||
| setIncludes( FILE_PATTERN ); | |||
| } | |||
| /** | |||
| * Set the definitions | |||
| */ | |||
| public void setAdditionalModules( final String additionalModules ) | |||
| { | |||
| m_additionalModules = additionalModules; | |||
| } | |||
| /** | |||
| * set the debug flag on or off | |||
| * | |||
| * @param debug on/off flag | |||
| */ | |||
| public void setDebug( final boolean debug ) | |||
| { | |||
| m_debug = debug; | |||
| } | |||
| /** | |||
| * Set the definitions | |||
| */ | |||
| public void setDefinitions( final String definitions ) | |||
| { | |||
| m_definitions = definitions; | |||
| } | |||
| /** | |||
| * Set the destination dir to find the files to be compiled | |||
| * | |||
| * @param destDir The new DestDir value | |||
| */ | |||
| public void setDestDir( final File destDir ) | |||
| { | |||
| m_destDir = destDir; | |||
| } | |||
| /** | |||
| * file for generated XML documentation | |||
| * | |||
| * @param docFile output file | |||
| */ | |||
| public void setDocFile( final File docFile ) | |||
| { | |||
| m_docFile = docFile; | |||
| } | |||
| /** | |||
| * Sets the ExtraOptions attribute | |||
| */ | |||
| public void setExtraOptions( final String extraOptions ) | |||
| { | |||
| m_extraOptions = extraOptions; | |||
| } | |||
| public void setFullPaths( final boolean fullpaths ) | |||
| { | |||
| m_fullpaths = fullpaths; | |||
| } | |||
| /** | |||
| * set the automatic reference inclusion flag on or off this flag controls | |||
| * the string of references and the /nostdlib option in CSC | |||
| * | |||
| * @param includeDefaultReferences on/off flag | |||
| */ | |||
| public void setIncludeDefaultReferences( final boolean includeDefaultReferences ) | |||
| { | |||
| m_includeDefaultReferences = includeDefaultReferences; | |||
| } | |||
| /** | |||
| * set the incremental compilation flag on or off | |||
| * | |||
| * @param incremental on/off flag | |||
| */ | |||
| public void setIncremental( final boolean incremental ) | |||
| { | |||
| m_incremental = incremental; | |||
| } | |||
| /** | |||
| * Sets the MainClass attribute | |||
| * | |||
| * @param mainClass The new MainClass value | |||
| */ | |||
| public void setMainClass( final String mainClass ) | |||
| { | |||
| m_mainClass = mainClass; | |||
| } | |||
| /** | |||
| * set the optimise flag on or off | |||
| * | |||
| * @param optimize on/off flag | |||
| */ | |||
| public void setOptimize( final boolean optimize ) | |||
| { | |||
| m_optimize = optimize; | |||
| } | |||
| /** | |||
| * Set the definitions | |||
| */ | |||
| public void setOutputFile( final File outputFile ) | |||
| { | |||
| m_outputFile = outputFile; | |||
| } | |||
| /** | |||
| * add another path to the reference file path list | |||
| * | |||
| * @param path another path to append | |||
| */ | |||
| public void setReferenceFiles( final Path path ) | |||
| throws TaskException | |||
| { | |||
| //demand create pathlist | |||
| if( null == m_referenceFiles ) | |||
| { | |||
| m_referenceFiles = new Path(); | |||
| } | |||
| m_referenceFiles.add( path ); | |||
| } | |||
| /** | |||
| * Set the reference list to be used for this compilation. | |||
| * | |||
| * @param references The new References value | |||
| */ | |||
| public void setReferences( final String references ) | |||
| { | |||
| m_references = references; | |||
| } | |||
| /** | |||
| * Set the source dir to find the files to be compiled | |||
| * | |||
| * @param srcDir The new SrcDir value | |||
| */ | |||
| public void setSrcDir( final File srcDir ) | |||
| { | |||
| m_srcDir = srcDir; | |||
| } | |||
| /** | |||
| * define the target | |||
| * | |||
| * @param targetType The new TargetType value | |||
| * @exception TaskException if target is not one of | |||
| * exe|library|module|winexe | |||
| */ | |||
| public void setTargetType( final String targetType ) | |||
| throws TaskException | |||
| { | |||
| final String type = targetType.toLowerCase(); | |||
| if( type.equals( "exe" ) || type.equals( "library" ) || | |||
| type.equals( "module" ) || type.equals( "winexe" ) ) | |||
| { | |||
| m_targetType = type; | |||
| } | |||
| else | |||
| { | |||
| final String message = "targetType " + type + " is not a valid type"; | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| /** | |||
| * Sets the Unsafe attribute | |||
| * | |||
| * @param unsafe The new Unsafe value | |||
| */ | |||
| public void setUnsafe( final boolean unsafe ) | |||
| { | |||
| m_unsafe = unsafe; | |||
| } | |||
| /** | |||
| * enable generation of utf8 output from the compiler. | |||
| * | |||
| * @param enabled The new Utf8Output value | |||
| */ | |||
| public void setUtf8Output( final boolean enabled ) | |||
| { | |||
| m_utf8output = enabled; | |||
| } | |||
| /** | |||
| * set warn level (no range checking) | |||
| * | |||
| * @param warnLevel warn level -see .net docs for valid range (probably 0-4) | |||
| */ | |||
| public void setWarnLevel( final int warnLevel ) | |||
| { | |||
| m_warnLevel = warnLevel; | |||
| } | |||
| /** | |||
| * Set the win32 icon | |||
| * | |||
| * @param fileName path to the file. Can be relative, absolute, whatever. | |||
| */ | |||
| public void setWin32Icon( final File fileName ) | |||
| { | |||
| m_win32icon = fileName; | |||
| } | |||
| /** | |||
| * Set the win32 icon | |||
| * | |||
| * @param win32res path to the file. Can be relative, absolute, whatever. | |||
| */ | |||
| public void setWin32Res( final File win32res ) | |||
| { | |||
| m_win32res = win32res; | |||
| } | |||
| /** | |||
| * do the work by building the command line and then calling it | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| if( null == m_srcDir ) | |||
| { | |||
| m_srcDir = getBaseDirectory(); | |||
| } | |||
| final Execute exe = new Execute(); | |||
| exe.setExecutable( EXE_NAME ); | |||
| addArgument( exe, "/nologo" ); | |||
| addArgument( exe, getAdditionalModulesParameter() ); | |||
| addArgument( exe, getDefinitionsParameter() ); | |||
| addArgument( exe, getDebugParameter() ); | |||
| addArgument( exe, getDocFileParameter() ); | |||
| addArgument( exe, getIncrementalParameter() ); | |||
| addArgument( exe, getMainClassParameter() ); | |||
| addArgument( exe, getOptimizeParameter() ); | |||
| addArgument( exe, getReferencesParameter() ); | |||
| addArgument( exe, getTargetTypeParameter() ); | |||
| addArgument( exe, getUnsafeParameter() ); | |||
| addArgument( exe, getWarnLevelParameter() ); | |||
| addArgument( exe, getWin32IconParameter() ); | |||
| addArgument( exe, getOutputFileParameter() ); | |||
| addArgument( exe, getIncludeDefaultReferencesParameter() ); | |||
| addArgument( exe, getDefaultReferenceParameter() ); | |||
| addArgument( exe, getWin32ResParameter() ); | |||
| addArgument( exe, getUtf8OutpuParameter() ); | |||
| addArgument( exe, getFullPathsParameter() ); | |||
| addArgument( exe, getExtraOptionsParameter() ); | |||
| //get dependencies list. | |||
| final DirectoryScanner scanner = super.getDirectoryScanner( m_srcDir ); | |||
| final String[] dependencies = scanner.getIncludedFiles(); | |||
| final String message = "compiling " + dependencies.length + " file" + | |||
| ( ( dependencies.length == 1 ) ? "" : "s" ); | |||
| getContext().info( message ); | |||
| final String baseDir = scanner.getBasedir().toString(); | |||
| //add to the command | |||
| for( int i = 0; i < dependencies.length; i++ ) | |||
| { | |||
| final String targetFile = baseDir + File.separator + dependencies[ i ]; | |||
| addArgument( exe, targetFile ); | |||
| } | |||
| //now run the command of exe + settings + files | |||
| exe.execute( getContext() ); | |||
| } | |||
| private void addArgument( final ArgumentList cmd, final String argument ) | |||
| { | |||
| if( null != argument && 0 != argument.length() ) | |||
| { | |||
| cmd.addArgument( argument ); | |||
| } | |||
| } | |||
| /** | |||
| * get the argument or null for no argument needed | |||
| * | |||
| * @return The AdditionalModules Parameter to CSC | |||
| */ | |||
| private String getAdditionalModulesParameter() | |||
| { | |||
| if( notEmpty( m_additionalModules ) ) | |||
| { | |||
| return "/addmodule:" + m_additionalModules; | |||
| } | |||
| else | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * get the debug switch argument | |||
| * | |||
| * @return The Debug Parameter to CSC | |||
| */ | |||
| private String getDebugParameter() | |||
| { | |||
| return "/debug" + ( m_debug ? "+" : "-" ); | |||
| } | |||
| /** | |||
| * get default reference list | |||
| * | |||
| * @return null or a string of references. | |||
| */ | |||
| private String getDefaultReferenceParameter() | |||
| { | |||
| if( m_includeDefaultReferences ) | |||
| { | |||
| StringBuffer s = new StringBuffer( "/reference:" ); | |||
| s.append( DEFAULT_REFERENCE_LIST ); | |||
| return new String( s ); | |||
| } | |||
| else | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * get the argument or null for no argument needed | |||
| * | |||
| * @return The Definitions Parameter to CSC | |||
| */ | |||
| private String getDefinitionsParameter() | |||
| { | |||
| if( notEmpty( m_definitions ) ) | |||
| { | |||
| return "/define:" + m_definitions; | |||
| } | |||
| else | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * get the argument or null for no argument needed | |||
| * | |||
| * @return The DocFile Parameter to CSC | |||
| */ | |||
| private String getDocFileParameter() | |||
| { | |||
| if( m_docFile != null ) | |||
| { | |||
| return "/doc:" + m_docFile.toString(); | |||
| } | |||
| else | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * get any extra options or null for no argument needed | |||
| * | |||
| * @return The ExtraOptions Parameter to CSC | |||
| */ | |||
| private String getExtraOptionsParameter() | |||
| { | |||
| if( m_extraOptions != null && m_extraOptions.length() != 0 ) | |||
| { | |||
| return m_extraOptions; | |||
| } | |||
| else | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| private String getFullPathsParameter() | |||
| { | |||
| return m_fullpaths ? "/fullpaths" : null; | |||
| } | |||
| /** | |||
| * get the include default references flag or null for no argument needed | |||
| * | |||
| * @return The Parameter to CSC | |||
| */ | |||
| private String getIncludeDefaultReferencesParameter() | |||
| { | |||
| return "/nostdlib" + ( m_includeDefaultReferences ? "-" : "+" ); | |||
| } | |||
| /** | |||
| * get the incremental build argument | |||
| * | |||
| * @return The Incremental Parameter to CSC | |||
| */ | |||
| private String getIncrementalParameter() | |||
| { | |||
| return "/incremental" + ( m_incremental ? "+" : "-" ); | |||
| } | |||
| /** | |||
| * get the /main argument or null for no argument needed | |||
| * | |||
| * @return The MainClass Parameter to CSC | |||
| */ | |||
| private String getMainClassParameter() | |||
| { | |||
| if( m_mainClass != null && m_mainClass.length() != 0 ) | |||
| { | |||
| return "/main:" + m_mainClass; | |||
| } | |||
| else | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * get the optimise flag or null for no argument needed | |||
| * | |||
| * @return The Optimize Parameter to CSC | |||
| */ | |||
| private String getOptimizeParameter() | |||
| { | |||
| return "/optimize" + ( m_optimize ? "+" : "-" ); | |||
| } | |||
| /** | |||
| * get the argument or null for no argument needed | |||
| * | |||
| * @return The OutputFile Parameter to CSC | |||
| */ | |||
| private String getOutputFileParameter() | |||
| { | |||
| if( m_outputFile != null ) | |||
| { | |||
| File f = m_outputFile; | |||
| return "/out:" + f.toString(); | |||
| } | |||
| else | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * get the reference string or null for no argument needed | |||
| * | |||
| * @return The References Parameter to CSC | |||
| */ | |||
| private String getReferencesParameter() | |||
| { | |||
| //bail on no references | |||
| if( notEmpty( m_references ) ) | |||
| { | |||
| return "/reference:" + m_references; | |||
| } | |||
| else | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * get the argument or null for no argument needed | |||
| * | |||
| * @return The TargetType Parameter to CSC | |||
| */ | |||
| private String getTargetTypeParameter() | |||
| { | |||
| if( notEmpty( m_targetType ) ) | |||
| { | |||
| return "/target:" + m_targetType; | |||
| } | |||
| else | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * get the argument or null for no argument needed | |||
| * | |||
| * @return The Unsafe Parameter to CSC | |||
| */ | |||
| private String getUnsafeParameter() | |||
| { | |||
| return m_unsafe ? "/unsafe" : null; | |||
| } | |||
| private String getUtf8OutpuParameter() | |||
| { | |||
| return m_utf8output ? "/utf8output" : null; | |||
| } | |||
| /** | |||
| * get the warn level switch | |||
| * | |||
| * @return The WarnLevel Parameter to CSC | |||
| */ | |||
| private String getWarnLevelParameter() | |||
| { | |||
| return "/warn:" + m_warnLevel; | |||
| } | |||
| /** | |||
| * get the argument or null for no argument needed | |||
| * | |||
| * @return The Win32Icon Parameter to CSC | |||
| */ | |||
| private String getWin32IconParameter() | |||
| { | |||
| if( m_win32icon != null ) | |||
| { | |||
| return "/win32icon:" + m_win32icon.toString(); | |||
| } | |||
| else | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * get the argument or null for no argument needed | |||
| * | |||
| * @return The Win32Icon Parameter to CSC | |||
| */ | |||
| private String getWin32ResParameter() | |||
| { | |||
| if( m_win32res != null ) | |||
| { | |||
| return "/win32res:" + m_win32res.toString(); | |||
| } | |||
| else | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * test for a string containing something useful | |||
| * | |||
| * @param string string in | |||
| * @return true if the argument is not null or empty | |||
| */ | |||
| private boolean notEmpty( final String string ) | |||
| { | |||
| return string != null && string.length() != 0; | |||
| } | |||
| } | |||
| @@ -1,395 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.dotnet; | |||
| import java.io.File; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.nativelib.Execute; | |||
| import org.apache.tools.todo.taskdefs.MatchingTask; | |||
| import org.apache.myrmidon.framework.nativelib.ArgumentList; | |||
| import org.apache.tools.todo.types.DirectoryScanner; | |||
| /** | |||
| * Task to assemble .net 'Intermediate Language' files. The task will only work | |||
| * on win2K until other platforms support csc.exe or an equivalent. ilasm.exe | |||
| * must be on the execute path too. <p> | |||
| * | |||
| * <p> | |||
| * | |||
| * All parameters are optional: <il/> should suffice to produce a debug | |||
| * build of all *.il files. The option set is roughly compatible with the CSharp | |||
| * class; even though the command line options are only vaguely equivalent. [The | |||
| * low level commands take things like /OUT=file, csc wants /out:file ... | |||
| * /verbose is used some places; /quiet here in ildasm... etc.] It would be nice | |||
| * if someone made all the command line tools consistent (and not as brittle as | |||
| * the java cmdline tools) <p> | |||
| * | |||
| * The task is a directory based task, so attributes like <b>includes="*.il"</b> | |||
| * and <b>excludes="broken.il"</b> can be used to control the files pulled in. | |||
| * Each file is built on its own, producing an appropriately named output file | |||
| * unless manually specified with <b>outfile</b> | |||
| * | |||
| * @author Steve Loughran steve_l@iseran.com | |||
| * @version 0.2 | |||
| */ | |||
| public class Ilasm | |||
| extends MatchingTask | |||
| { | |||
| /** | |||
| * name of the executable. the .exe suffix is deliberately not included in | |||
| * anticipation of the unix version | |||
| */ | |||
| private static final String EXE_NAME = "ilasm"; | |||
| /** | |||
| * what is the file extension we search on? | |||
| */ | |||
| private static final String FILE_EXT = "il"; | |||
| /** | |||
| * and now derive the search pattern from the extension | |||
| */ | |||
| private static final String FILE_PATTERN = "**/*." + FILE_EXT; | |||
| /** | |||
| * debug flag. Controls generation of debug information. | |||
| */ | |||
| private boolean m_debug; | |||
| /** | |||
| * any extra command options? | |||
| */ | |||
| private String m_extraOptions; | |||
| /** | |||
| * listing flag | |||
| */ | |||
| private boolean m_listing; | |||
| /** | |||
| * output file. If not supplied this is derived from the source file | |||
| */ | |||
| private File m_outputFile; | |||
| /** | |||
| * resource file (.res format) to include in the app. | |||
| */ | |||
| private File m_resourceFile; | |||
| /** | |||
| * type of target. Should be one of exe|library|module|winexe|(null) default | |||
| * is exe; the actual value (if not null) is fed to the command line. <br> | |||
| * See /target | |||
| */ | |||
| private String m_targetType; | |||
| /** | |||
| * verbose flag | |||
| */ | |||
| private boolean m_verbose; | |||
| /** | |||
| * file containing private key | |||
| */ | |||
| private File m_keyfile; | |||
| /** | |||
| * source directory upon which the search pattern is applied | |||
| */ | |||
| private File m_srcDir; | |||
| /** | |||
| * constructor inits everything and set up the search pattern | |||
| */ | |||
| public Ilasm() | |||
| throws TaskException | |||
| { | |||
| setIncludes( FILE_PATTERN ); | |||
| m_debug = true; | |||
| } | |||
| /** | |||
| * set the debug flag on or off | |||
| * | |||
| * @param debug on/off flag | |||
| */ | |||
| public void setDebug( final boolean debug ) | |||
| { | |||
| m_debug = debug; | |||
| } | |||
| /** | |||
| * Sets the ExtraOptions attribute | |||
| * | |||
| * @param extraOptions The new ExtraOptions value | |||
| */ | |||
| public void setExtraOptions( final String extraOptions ) | |||
| { | |||
| m_extraOptions = extraOptions; | |||
| } | |||
| public void setKeyfile( final File keyfile ) | |||
| { | |||
| m_keyfile = keyfile; | |||
| } | |||
| /** | |||
| * enable/disable listing | |||
| * | |||
| * @param listing flag set to true for listing on | |||
| */ | |||
| public void setListing( final boolean listing ) | |||
| { | |||
| m_listing = listing; | |||
| } | |||
| /** | |||
| * Set the definitions | |||
| */ | |||
| public void setOutputFile( final File outputFile ) | |||
| { | |||
| m_outputFile = outputFile; | |||
| } | |||
| /** | |||
| * Set the resource file | |||
| * | |||
| * @param resourceFile path to the file. Can be relative, absolute, whatever. | |||
| */ | |||
| public void setResourceFile( final File resourceFile ) | |||
| { | |||
| m_resourceFile = resourceFile; | |||
| } | |||
| /** | |||
| * Set the source dir to find the files to be compiled | |||
| */ | |||
| public void setSrcDir( final File srcDir ) | |||
| { | |||
| m_srcDir = srcDir; | |||
| } | |||
| /** | |||
| * define the target | |||
| * | |||
| * @param targetType one of exe|library| | |||
| * @exception TaskException if target is not one of | |||
| * exe|library|module|winexe | |||
| */ | |||
| public void setTargetType( final String targetType ) | |||
| throws TaskException | |||
| { | |||
| final String type = targetType.toLowerCase(); | |||
| if( type.equals( "exe" ) || type.equals( "library" ) ) | |||
| { | |||
| m_targetType = type; | |||
| } | |||
| else | |||
| { | |||
| final String message = "targetType " + targetType + " is not a valid type"; | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| /** | |||
| * enable/disable verbose ILASM output | |||
| * | |||
| * @param verbose flag set to true for verbose on | |||
| */ | |||
| public void setVerbose( final boolean verbose ) | |||
| { | |||
| m_verbose = verbose; | |||
| } | |||
| /** | |||
| * This is the execution entry point. Build a list of files and call ilasm | |||
| * on each of them. | |||
| * | |||
| * @throws TaskException if the assembly failed | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| if( null == m_srcDir ) | |||
| { | |||
| m_srcDir = getBaseDirectory(); | |||
| } | |||
| //get dependencies list. | |||
| final DirectoryScanner scanner = super.getDirectoryScanner( m_srcDir ); | |||
| final String[] dependencies = scanner.getIncludedFiles(); | |||
| final String baseDir = scanner.getBasedir().toString(); | |||
| final String message = "assembling " + dependencies.length + " file" + | |||
| ( ( dependencies.length == 1 ) ? "" : "s" ); | |||
| getContext().info( message ); | |||
| //add to the command | |||
| for( int i = 0; i < dependencies.length; i++ ) | |||
| { | |||
| final String targetFile = baseDir + File.separator + dependencies[ i ]; | |||
| executeOneFile( targetFile ); | |||
| } | |||
| } | |||
| /** | |||
| * do the work for one file by building the command line then calling it | |||
| * | |||
| * @param targetFile name of the the file to assemble | |||
| * @throws TaskException if the assembly failed and FailOnError is true | |||
| */ | |||
| public void executeOneFile( final String targetFile ) | |||
| throws TaskException | |||
| { | |||
| final Execute exe = new Execute(); | |||
| exe.setExecutable( EXE_NAME ); | |||
| addArgument( exe, getDebugParameter() ); | |||
| addArgument( exe, getTargetTypeParameter() ); | |||
| addArgument( exe, getListingParameter() ); | |||
| addArgument( exe, getOutputFileParameter() ); | |||
| addArgument( exe, getResourceFileParameter() ); | |||
| addArgument( exe, getVerboseParameter() ); | |||
| addArgument( exe, getKeyfileParameter() ); | |||
| addArgument( exe, getExtraOptionsParameter() ); | |||
| addArgument( exe, targetFile ); | |||
| exe.execute( getContext() ); | |||
| } | |||
| private void addArgument( final ArgumentList cmd, final String argument ) | |||
| { | |||
| if( null != argument && 0 != argument.length() ) | |||
| { | |||
| cmd.addArgument( argument ); | |||
| } | |||
| } | |||
| /** | |||
| * get the argument or null for no argument needed | |||
| * | |||
| * @return The DebugParameter value | |||
| */ | |||
| private String getDebugParameter() | |||
| { | |||
| return m_debug ? "/debug" : null; | |||
| } | |||
| /** | |||
| * get any extra options or null for no argument needed | |||
| * | |||
| * @return The ExtraOptions Parameter to CSC | |||
| */ | |||
| private String getExtraOptionsParameter() | |||
| { | |||
| if( m_extraOptions != null && m_extraOptions.length() != 0 ) | |||
| { | |||
| return m_extraOptions; | |||
| } | |||
| else | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * get the argument or null for no argument needed | |||
| */ | |||
| private String getKeyfileParameter() | |||
| { | |||
| if( m_keyfile != null ) | |||
| { | |||
| return "/keyfile:" + m_keyfile.toString(); | |||
| } | |||
| else | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * turn the listing flag into a parameter for ILASM | |||
| * | |||
| * @return the appropriate string from the state of the listing flag | |||
| */ | |||
| private String getListingParameter() | |||
| { | |||
| return m_listing ? "/listing" : "/nolisting"; | |||
| } | |||
| /** | |||
| * get the output file | |||
| * | |||
| * @return the argument string or null for no argument | |||
| */ | |||
| private String getOutputFileParameter() | |||
| { | |||
| if( null == m_outputFile || 0 == m_outputFile.length() ) | |||
| { | |||
| return null; | |||
| } | |||
| return "/output=" + m_outputFile.toString(); | |||
| } | |||
| private String getResourceFileParameter() | |||
| { | |||
| if( null != m_resourceFile ) | |||
| { | |||
| return "/resource=" + m_resourceFile.toString(); | |||
| } | |||
| else | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * g get the target type or null for no argument needed | |||
| * | |||
| * @return The TargetTypeParameter value | |||
| */ | |||
| private String getTargetTypeParameter() | |||
| { | |||
| if( !notEmpty( m_targetType ) ) | |||
| { | |||
| return null; | |||
| } | |||
| if( m_targetType.equals( "exe" ) ) | |||
| { | |||
| return "/exe"; | |||
| } | |||
| else if( m_targetType.equals( "library" ) ) | |||
| { | |||
| return "/dll"; | |||
| } | |||
| else | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * turn the verbose flag into a parameter for ILASM | |||
| * | |||
| * @return null or the appropriate command line string | |||
| */ | |||
| private String getVerboseParameter() | |||
| { | |||
| return m_verbose ? null : "/quiet"; | |||
| } | |||
| /** | |||
| * test for a string containing something useful | |||
| * | |||
| * @returns true if the argument is not null or empty | |||
| */ | |||
| private boolean notEmpty( final String string ) | |||
| { | |||
| return string != null && string.length() != 0; | |||
| } | |||
| } | |||
| @@ -1,450 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.file; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| import java.util.ArrayList; | |||
| import java.util.HashMap; | |||
| import java.util.Iterator; | |||
| import java.util.Map; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.avalon.excalibur.io.FileUtil; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.FileNameMapper; | |||
| import org.apache.myrmidon.framework.FileSet; | |||
| import org.apache.tools.todo.types.DirectoryScanner; | |||
| import org.apache.tools.todo.types.ScannerUtil; | |||
| import org.apache.tools.todo.types.SourceFileScanner; | |||
| import org.apache.tools.todo.util.mappers.IdentityMapper; | |||
| /** | |||
| * This is a task used to copy files. | |||
| * | |||
| * @ant.task name="copy" | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @author <a href="mailto:glennm@ca.ibm.com">Glenn McAllister</a> | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @author <A href="gholam@xtra.co.nz">Michael McCallum</A> | |||
| * @author <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public class CopyTask | |||
| extends AbstractTask | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( CopyTask.class ); | |||
| private File m_file; | |||
| private ArrayList m_filesets = new ArrayList(); | |||
| private File m_destFile; | |||
| private File m_destDir; | |||
| private boolean m_preserveLastModified; | |||
| private boolean m_overwrite; | |||
| private boolean m_includeEmpty = true; | |||
| private FileNameMapper m_mapper; | |||
| private HashMap m_fileMap = new HashMap(); | |||
| private HashMap m_dirMap = new HashMap(); | |||
| /** | |||
| * Sets a single source file to copy. | |||
| */ | |||
| public void setFile( final File file ) | |||
| { | |||
| m_file = file; | |||
| } | |||
| public void addFileset( final FileSet set ) | |||
| { | |||
| m_filesets.add( set ); | |||
| } | |||
| public void setDestFile( final File destFile ) | |||
| { | |||
| m_destFile = destFile; | |||
| } | |||
| public void setDestDir( final File destDir ) | |||
| { | |||
| m_destDir = destDir; | |||
| } | |||
| public void setPreserveLastModified( boolean preserveLastModified ) | |||
| { | |||
| m_preserveLastModified = preserveLastModified; | |||
| } | |||
| /** | |||
| * Overwrite any existing destination file(s). | |||
| */ | |||
| public void setOverwrite( boolean overwrite ) | |||
| { | |||
| m_overwrite = overwrite; | |||
| } | |||
| /** | |||
| * Defines the FileNameMapper to use (nested mapper element). | |||
| */ | |||
| public void addMapper( final FileNameMapper mapper ) | |||
| throws TaskException | |||
| { | |||
| if( null != m_mapper ) | |||
| { | |||
| final String message = "Cannot define more than one mapper"; | |||
| throw new TaskException( message ); | |||
| } | |||
| m_mapper = mapper; | |||
| } | |||
| protected final boolean isPreserveLastModified() | |||
| { | |||
| return m_preserveLastModified; | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| validate(); | |||
| // deal with the single file | |||
| if( m_file != null ) | |||
| { | |||
| if( null == m_destFile ) | |||
| { | |||
| m_destFile = new File( m_destDir, m_file.getName() ); | |||
| } | |||
| if( m_overwrite || | |||
| ( m_file.lastModified() > m_destFile.lastModified() ) ) | |||
| { | |||
| m_fileMap.put( m_file.getAbsolutePath(), m_destFile.getAbsolutePath() ); | |||
| } | |||
| else | |||
| { | |||
| final String message = | |||
| REZ.getString( "copy.omit-uptodate.notice", m_file, m_destFile ); | |||
| getContext().debug( message ); | |||
| } | |||
| } | |||
| // deal with the filesets | |||
| final int size = m_filesets.size(); | |||
| for( int i = 0; i < size; i++ ) | |||
| { | |||
| final FileSet fileSet = (FileSet)m_filesets.get( i ); | |||
| final DirectoryScanner scanner = ScannerUtil.getDirectoryScanner( fileSet ); | |||
| final File fromDir = fileSet.getDir(); | |||
| final String[] srcFiles = scanner.getIncludedFiles(); | |||
| final String[] srcDirs = scanner.getIncludedDirectories(); | |||
| scan( fromDir, m_destDir, srcFiles, srcDirs ); | |||
| } | |||
| // do all the copy operations now... | |||
| doFileOperations( m_fileMap, m_dirMap ); | |||
| } | |||
| protected void validate() | |||
| throws TaskException | |||
| { | |||
| final int fileSetSize = m_filesets.size(); | |||
| if( null == m_file && 0 == fileSetSize ) | |||
| { | |||
| final String message = REZ.getString( "copy.missing-src.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| if( null != m_destFile && null != m_destDir ) | |||
| { | |||
| final String message = REZ.getString( "copy.one-dest-only.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| if( null != m_file && m_file.exists() && m_file.isDirectory() ) | |||
| { | |||
| final String message = REZ.getString( "copy.fileset-for-dirs.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| if( null != m_destFile && fileSetSize > 0 ) | |||
| { | |||
| if( fileSetSize > 1 ) | |||
| { | |||
| final String message = REZ.getString( "copy.need-destdir.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| else | |||
| { | |||
| final FileSet fileSet = (FileSet)m_filesets.get( 0 ); | |||
| final DirectoryScanner scanner = ScannerUtil.getDirectoryScanner( fileSet ); | |||
| final String[] srcFiles = scanner.getIncludedFiles(); | |||
| if( srcFiles.length > 0 ) | |||
| { | |||
| if( m_file == null ) | |||
| { | |||
| m_file = new File( srcFiles[ 0 ] ); | |||
| m_filesets.remove( 0 ); | |||
| } | |||
| else | |||
| { | |||
| final String message = REZ.getString( "copy.bad-mapping.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| else | |||
| { | |||
| final String message = REZ.getString( "copy.bad-operation.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| } | |||
| if( null != m_file && !m_file.exists() ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "copy.missing-file.error", m_file.getAbsolutePath() ); | |||
| throw new TaskException( message ); | |||
| } | |||
| if( null != m_destFile ) | |||
| { | |||
| m_destDir = m_destFile.getParentFile(); | |||
| } | |||
| } | |||
| /** | |||
| * Compares source files to destination files to see if they should be | |||
| * copied. | |||
| */ | |||
| private void scan( final File sourceDir, | |||
| final File destDir, | |||
| final String[] files, | |||
| final String[] dirs ) | |||
| throws TaskException | |||
| { | |||
| final FileNameMapper mapper = getFilenameMapper(); | |||
| buildMap( sourceDir, destDir, files, mapper, m_fileMap ); | |||
| if( m_includeEmpty ) | |||
| { | |||
| buildMap( sourceDir, destDir, dirs, mapper, m_dirMap ); | |||
| } | |||
| } | |||
| private void buildMap( final File sourceDir, | |||
| final File destDir, | |||
| final String[] files, | |||
| final FileNameMapper mapper, | |||
| final Map map ) | |||
| throws TaskException | |||
| { | |||
| final String[] toCopy = buildFilenameList( files, mapper, sourceDir, destDir ); | |||
| for( int i = 0; i < toCopy.length; i++ ) | |||
| { | |||
| final String destFilename = mapper.mapFileName( toCopy[ i ], getContext() )[ 0 ]; | |||
| final File source = new File( sourceDir, toCopy[ i ] ); | |||
| final File destination = new File( destDir, destFilename ); | |||
| map.put( source.getAbsolutePath(), destination.getAbsolutePath() ); | |||
| } | |||
| } | |||
| /** | |||
| * Utility method to build up a list of files needed between both | |||
| * but only getting the files that need updating (unless overwrite is true). | |||
| */ | |||
| private String[] buildFilenameList( final String[] names, | |||
| final FileNameMapper mapper, | |||
| final File fromDir, | |||
| final File toDir ) | |||
| throws TaskException | |||
| { | |||
| if( m_overwrite ) | |||
| { | |||
| final ArrayList list = new ArrayList( names.length ); | |||
| for( int i = 0; i < names.length; i++ ) | |||
| { | |||
| final String name = names[ i ]; | |||
| if( null != mapper.mapFileName( name, getContext() ) ) | |||
| { | |||
| list.add( name ); | |||
| } | |||
| } | |||
| return (String[])list.toArray( new String[ list.size() ] ); | |||
| } | |||
| else | |||
| { | |||
| final SourceFileScanner scanner = new SourceFileScanner(); | |||
| return scanner.restrict( names, fromDir, toDir, mapper, getContext() ); | |||
| } | |||
| } | |||
| /** | |||
| * Perform the oepration on all the files (and possibly empty directorys). | |||
| */ | |||
| private void doFileOperations( final Map fileCopyMap, final Map dirCopyMap ) | |||
| throws TaskException | |||
| { | |||
| final int fileCount = fileCopyMap.size(); | |||
| if( fileCount > 0 ) | |||
| { | |||
| doOperationOnFiles( fileCopyMap ); | |||
| } | |||
| if( m_includeEmpty ) | |||
| { | |||
| doOperationOnDirs( dirCopyMap ); | |||
| } | |||
| } | |||
| /** | |||
| * perform operation on files. | |||
| */ | |||
| private void doOperationOnFiles( final Map fileMap ) | |||
| throws TaskException | |||
| { | |||
| final int fileCount = fileMap.size(); | |||
| displayFilecountNotice( fileCount ); | |||
| final Iterator names = fileMap.keySet().iterator(); | |||
| while( names.hasNext() ) | |||
| { | |||
| final String source = (String)names.next(); | |||
| final String destination = (String)fileMap.get( source ); | |||
| if( source.equals( destination ) ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "copy.selfcopy-ignored.notice", source ); | |||
| getContext().verbose( message ); | |||
| continue; | |||
| } | |||
| try | |||
| { | |||
| final String message = | |||
| REZ.getString( "copy.filecopy.notice", source, destination ); | |||
| getContext().verbose( message ); | |||
| doOperation( source, destination ); | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "copy.filecopy.error", source, destination, ioe ); | |||
| throw new TaskException( message, ioe ); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * perform operation on directories. | |||
| */ | |||
| private void doOperationOnDirs( final Map dirMap ) | |||
| { | |||
| final Iterator dirs = dirMap.values().iterator(); | |||
| int count = 0; | |||
| while( dirs.hasNext() ) | |||
| { | |||
| final String pathname = (String)dirs.next(); | |||
| final File dir = new File( pathname ); | |||
| if( !dir.exists() ) | |||
| { | |||
| if( !dir.mkdirs() ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "copy.dircopy.error", dir.getAbsolutePath() ); | |||
| getContext().error( message ); | |||
| } | |||
| else | |||
| { | |||
| count++; | |||
| } | |||
| } | |||
| } | |||
| if( count > 0 ) | |||
| { | |||
| displayDirCopyNotice( count ); | |||
| } | |||
| } | |||
| /** | |||
| * Utility method to determine and retrieve FilenameMapper. | |||
| */ | |||
| private FileNameMapper getFilenameMapper() | |||
| throws TaskException | |||
| { | |||
| if( null != m_mapper ) | |||
| { | |||
| return m_mapper; | |||
| } | |||
| else | |||
| { | |||
| return new IdentityMapper(); | |||
| } | |||
| } | |||
| /** | |||
| * Utility method to perform operation to transform a single source file | |||
| * to a destination. | |||
| */ | |||
| protected void doOperation( final String sourceFilename, | |||
| final String destinationFilename ) | |||
| throws IOException | |||
| { | |||
| final File source = new File( sourceFilename ); | |||
| final File destination = new File( destinationFilename ); | |||
| if( m_overwrite ) | |||
| { | |||
| FileUtil.forceDelete( destination ); | |||
| } | |||
| FileUtil.copyFile( source, destination ); | |||
| if( m_preserveLastModified ) | |||
| { | |||
| destination.setLastModified( source.lastModified() ); | |||
| } | |||
| } | |||
| /** | |||
| * Utility method to display notice about how many dirs copied. | |||
| */ | |||
| private void displayDirCopyNotice( final int count ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "copy.dir-count.notice", | |||
| new Integer( count ), | |||
| m_destDir.getAbsolutePath() ); | |||
| getContext().info( message ); | |||
| } | |||
| /** | |||
| * Utility method to display notice about how many files copied. | |||
| */ | |||
| private void displayFilecountNotice( final int count ) | |||
| { | |||
| if( getContext().isInfoEnabled() ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "copy.file-count.notice", | |||
| new Integer( count ), | |||
| m_destDir.getAbsolutePath() ); | |||
| getContext().info( message ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,240 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.file; | |||
| import java.io.File; | |||
| import java.util.ArrayList; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.FileSet; | |||
| import org.apache.tools.todo.types.DirectoryScanner; | |||
| import org.apache.tools.todo.types.ScannerUtil; | |||
| /** | |||
| * Deletes a file or directory, or set of files defined by a fileset. | |||
| * | |||
| * @ant.task name="delete" | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @author <a href="mailto:stefano@apache.org">Stefano Mazzocchi</a> | |||
| * @author <a href="mailto:tad1@cornell.edu">Tom Dimock</a> | |||
| * @author <a href="mailto:glennm@ca.ibm.com">Glenn McAllister</a> | |||
| * @author <a href="mailto:jon@latchkey.com">Jon S. Stevens</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public class Delete | |||
| extends AbstractTask | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( Delete.class ); | |||
| private final ArrayList filesets = new ArrayList(); | |||
| private File m_dir; | |||
| private File m_file; | |||
| private boolean m_includeEmpty;// by default, remove matching empty dirs | |||
| /** | |||
| * Set the directory from which files are to be deleted | |||
| * | |||
| * @param dir the directory path. | |||
| */ | |||
| public void setDir( final File dir ) | |||
| { | |||
| m_dir = dir; | |||
| } | |||
| /** | |||
| * Set the name of a single file to be removed. | |||
| * | |||
| * @param file the file to be deleted | |||
| */ | |||
| public void setFile( final File file ) | |||
| { | |||
| m_file = file; | |||
| } | |||
| /** | |||
| * Adds a set of files (nested fileset attribute). | |||
| */ | |||
| public void addFileset( FileSet set ) | |||
| { | |||
| filesets.add( set ); | |||
| } | |||
| /** | |||
| * Delete the file(s). | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| validate(); | |||
| // delete the single file | |||
| if( null != m_file && m_file.exists() ) | |||
| { | |||
| deleteFile( m_file ); | |||
| } | |||
| // delete the directory | |||
| if( m_dir != null && m_dir.exists() && m_dir.isDirectory() ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "delete.delete-dir.notice", m_dir.getAbsolutePath() ); | |||
| getContext().info( message ); | |||
| deleteDir( m_dir ); | |||
| } | |||
| // delete the files in the filesets | |||
| final int size = filesets.size(); | |||
| for( int i = 0; i < size; i++ ) | |||
| { | |||
| final FileSet fileSet = (FileSet)filesets.get( i ); | |||
| final DirectoryScanner scanner = | |||
| ScannerUtil.getDirectoryScanner( fileSet ); | |||
| final String[] files = scanner.getIncludedFiles(); | |||
| final String[] dirs = scanner.getIncludedDirectories(); | |||
| removeFiles( fileSet.getDir(), files, dirs ); | |||
| } | |||
| } | |||
| private void validate() | |||
| throws TaskException | |||
| { | |||
| if( null == m_file && null == m_dir && 0 == filesets.size() ) | |||
| { | |||
| final String message = REZ.getString( "delete.nofiles.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| if( null != m_file && m_file.exists() && m_file.isDirectory() ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "delete.bad-file.error", m_file.getAbsolutePath() ); | |||
| throw new TaskException( message ); | |||
| } | |||
| if( null != m_file && !m_file.exists() ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "delete.missing-file.error", m_file.getAbsolutePath() ); | |||
| getContext().debug( message ); | |||
| } | |||
| } | |||
| private void deleteDir( final File baseDir ) | |||
| throws TaskException | |||
| { | |||
| final File[] list = baseDir.listFiles(); | |||
| if( list != null ) | |||
| { | |||
| deleteFiles( list ); | |||
| } | |||
| if( getContext().isDebugEnabled() ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "delete.delete-dir.notice", m_dir.getAbsolutePath() ); | |||
| getContext().debug( message ); | |||
| } | |||
| if( !baseDir.delete() ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "delete.delete-dir.error", m_dir.getAbsolutePath() ); | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| private void deleteFiles( final File[] list ) | |||
| throws TaskException | |||
| { | |||
| for( int i = 0; i < list.length; i++ ) | |||
| { | |||
| final File file = list[ i ]; | |||
| if( file.isDirectory() ) | |||
| { | |||
| deleteDir( file ); | |||
| } | |||
| else | |||
| { | |||
| deleteFile( file ); | |||
| } | |||
| } | |||
| } | |||
| private void deleteFile( final File file ) | |||
| throws TaskException | |||
| { | |||
| if( getContext().isDebugEnabled() ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "delete.delete-file.notice", file.getAbsolutePath() ); | |||
| getContext().debug( message ); | |||
| } | |||
| if( !file.delete() ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "delete.delete-file.error", file.getAbsolutePath() ); | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| /** | |||
| * remove an array of files in a directory, and a list of subdirectories | |||
| * which will only be deleted if 'includeEmpty' is true | |||
| * | |||
| * @param d directory to work from | |||
| * @param files array of files to delete; can be of zero length | |||
| * @param dirs array of directories to delete; can of zero length | |||
| */ | |||
| protected void removeFiles( final File baseDir, | |||
| final String[] files, | |||
| final String[] dirs ) | |||
| throws TaskException | |||
| { | |||
| if( files.length > 0 ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "delete.delete-file.error", | |||
| new Integer( files.length ), | |||
| baseDir.getAbsolutePath() ); | |||
| getContext().info( message ); | |||
| for( int i = 0; i < files.length; i++ ) | |||
| { | |||
| final File file = new File( baseDir, files[ i ] ); | |||
| deleteFile( file ); | |||
| } | |||
| } | |||
| if( dirs.length > 0 && m_includeEmpty ) | |||
| { | |||
| int dirCount = 0; | |||
| for( int j = dirs.length - 1; j >= 0; j-- ) | |||
| { | |||
| final File dir = new File( baseDir, dirs[ j ] ); | |||
| final String[] dirFiles = dir.list(); | |||
| if( null == dirFiles || 0 == dirFiles.length ) | |||
| { | |||
| deleteDir( dir ); | |||
| dirCount++; | |||
| } | |||
| } | |||
| if( dirCount > 0 ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "delete.summary.notice", | |||
| new Integer( dirCount ), | |||
| baseDir.getAbsolutePath() ); | |||
| getContext().info( message ); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -1,132 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.file; | |||
| import java.io.BufferedReader; | |||
| import java.io.BufferedWriter; | |||
| import java.io.File; | |||
| import java.io.FileInputStream; | |||
| import java.io.FileOutputStream; | |||
| import java.io.IOException; | |||
| import java.io.InputStream; | |||
| import java.io.InputStreamReader; | |||
| import java.io.OutputStream; | |||
| import java.io.OutputStreamWriter; | |||
| import java.io.Reader; | |||
| import java.io.UnsupportedEncodingException; | |||
| import java.io.Writer; | |||
| import org.apache.avalon.excalibur.io.IOUtil; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.filters.LineFilterSet; | |||
| /** | |||
| * A task used to copy files and simultaneously apply a | |||
| * filter on said files. | |||
| * | |||
| * @ant.task name="filtered-copy" | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public class FilteredCopyTask | |||
| extends CopyTask | |||
| { | |||
| private LineFilterSet m_filterSetCollection = new LineFilterSet(); | |||
| private String m_encoding = "US-ASCII"; | |||
| public void addFilterset( final LineFilterSet filter ) | |||
| { | |||
| m_filterSetCollection.add( filter ); | |||
| } | |||
| public void setEncoding( final String encoding ) | |||
| { | |||
| m_encoding = encoding; | |||
| } | |||
| /** | |||
| * Utility method to perform operation to transform a single source file | |||
| * to a destination. | |||
| */ | |||
| protected void doOperation( final String sourceFilename, | |||
| final String destinationFilename ) | |||
| throws IOException | |||
| { | |||
| final File source = new File( sourceFilename ); | |||
| final File destination = new File( destinationFilename ); | |||
| InputStream inputStream = null; | |||
| OutputStream outputStream = null; | |||
| BufferedReader input = null; | |||
| BufferedWriter output = null; | |||
| try | |||
| { | |||
| inputStream = new FileInputStream( source ); | |||
| outputStream = new FileOutputStream( destination ); | |||
| final Reader fileReader = new InputStreamReader( inputStream, m_encoding ); | |||
| final Writer fileWriter = new OutputStreamWriter( outputStream, m_encoding ); | |||
| input = new BufferedReader( fileReader ); | |||
| output = new BufferedWriter( fileWriter ); | |||
| process( input, output ); | |||
| } | |||
| catch( final UnsupportedEncodingException uee ) | |||
| { | |||
| throw new IOException( uee.toString() ); | |||
| } | |||
| finally | |||
| { | |||
| IOUtil.shutdownReader( input ); | |||
| IOUtil.shutdownStream( inputStream ); | |||
| IOUtil.shutdownWriter( output ); | |||
| IOUtil.shutdownStream( outputStream ); | |||
| } | |||
| if( isPreserveLastModified() ) | |||
| { | |||
| destination.setLastModified( source.lastModified() ); | |||
| } | |||
| } | |||
| private void process( final BufferedReader input, | |||
| final BufferedWriter output ) | |||
| throws IOException | |||
| { | |||
| String newline = null; | |||
| String line = input.readLine(); | |||
| while( null != line ) | |||
| { | |||
| if( line.length() == 0 ) | |||
| { | |||
| output.newLine(); | |||
| } | |||
| else | |||
| { | |||
| newline = replaceTokens( line ); | |||
| output.write( newline ); | |||
| output.newLine(); | |||
| } | |||
| line = input.readLine(); | |||
| } | |||
| } | |||
| private String replaceTokens( final String line ) | |||
| throws IOException | |||
| { | |||
| try | |||
| { | |||
| final StringBuffer buffer = new StringBuffer( line ); | |||
| m_filterSetCollection.filterLine( buffer, getContext() ); | |||
| return buffer.toString(); | |||
| } | |||
| catch( final TaskException te ) | |||
| { | |||
| throw new IOException( te.getMessage() ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,49 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.file; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.file.FileList; | |||
| import org.apache.myrmidon.framework.file.Path; | |||
| /** | |||
| * A diagnostic task that lists the contents of a path. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.task name="list-path" | |||
| */ | |||
| public class ListPathTask | |||
| extends AbstractTask | |||
| { | |||
| private final Path m_path = new Path(); | |||
| /** | |||
| * Adds a nested path. | |||
| */ | |||
| public void add( final FileList list ) | |||
| { | |||
| m_path.add( list ); | |||
| } | |||
| /** | |||
| * Executes the task. | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| final String[] files = m_path.listFiles( getContext() ); | |||
| for( int i = 0; i < files.length; i++ ) | |||
| { | |||
| final String file = files[ i ]; | |||
| getContext().info( file ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,67 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.file; | |||
| import java.io.File; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * Creates specified directory. | |||
| * | |||
| * @ant.task name="mkdir" | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @author duncan@x180.com | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public class Mkdir | |||
| extends AbstractTask | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( Mkdir.class ); | |||
| private File m_dir; | |||
| public void setDir( final File dir ) | |||
| { | |||
| m_dir = dir; | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| if( null == m_dir ) | |||
| { | |||
| final String message = REZ.getString( "mkdir.missing-dir.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| if( m_dir.isFile() ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "mkdir.file-exists.error", m_dir.getAbsolutePath() ); | |||
| throw new TaskException( message ); | |||
| } | |||
| if( !m_dir.exists() ) | |||
| { | |||
| final boolean result = m_dir.mkdirs(); | |||
| if( !result ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "mkdir.nocreate.error", m_dir.getAbsolutePath() ); | |||
| throw new TaskException( message ); | |||
| } | |||
| final String message = | |||
| REZ.getString( "mkdir.create.notice", m_dir.getAbsolutePath() ); | |||
| getContext().info( message ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,48 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.file; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| import org.apache.avalon.excalibur.io.FileUtil; | |||
| /** | |||
| * A task used to move files. | |||
| * | |||
| * @ant.task name="move" | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public class MoveTask | |||
| extends CopyTask | |||
| { | |||
| /** | |||
| * Utility method to perform operation to transform a single source file | |||
| * to a destination. | |||
| */ | |||
| protected void doOperation( final String sourceFilename, | |||
| final String destinationFilename ) | |||
| throws IOException | |||
| { | |||
| final File source = new File( sourceFilename ); | |||
| final File destination = new File( destinationFilename ); | |||
| if( destination.exists() ) | |||
| { | |||
| FileUtil.forceDelete( destination ); | |||
| } | |||
| FileUtil.copyFile( source, destination ); | |||
| if( isPreserveLastModified() ) | |||
| { | |||
| destination.setLastModified( source.lastModified() ); | |||
| } | |||
| FileUtil.forceDelete( source ); | |||
| } | |||
| } | |||
| @@ -1,36 +0,0 @@ | |||
| mkdir.missing-dir.error=dir attribute is required. | |||
| mkdir.file-exists.error=Unable to create directory as a file already exists with that name: "{0}". | |||
| mkdir.nocreate.error=Failed to create directory {0} due to an unknown reason. | |||
| mkdir.create.notice=Created dir: {0} | |||
| touch.neg-time.error=Date of {0} results in negative milliseconds value relative to epoch (January 1, 1970, 00:00:00 GMT). | |||
| touch.no-files.error=Specify at least one source - a file or a fileset. | |||
| touch.use-fileset.error=Use a fileset to touch directories. | |||
| touch.readonly-file.error=Can not change modification date of read-only file {0}. | |||
| touch.no-touch.error=Could not create file {0} due to {1}. | |||
| touch.create.notice=Creating {0}. | |||
| delete.nofiles.error=At least one of the file or dir attributes, or a fileset element, must be set. | |||
| delete.bad-file.error=Directory {0} cannot be removed using the file attribute. Use dir instead. | |||
| delete.missing-file.error=Could not find file {0} to delete. | |||
| delete.delete-dir.notice=Deleting directory {0}. | |||
| delete.delete-dir.error=Unable to delete directory {0}. | |||
| delete.delete-file.notice=Deleting {0}. | |||
| delete.delete-file.error=Unable to delete file {0}. | |||
| delete.delete-file.error=Deleting {0} files from {1}. | |||
| delete.summary.notice=Deleted {0,choice,0#zero directories|1#1 directory|2<{0} directories} from {1}. | |||
| copy.omit-uptodate.notice={0} omitted as {1} is up to date. | |||
| copy.missing-src.error=No source file or fileset specified. | |||
| copy.one-dest-only.error=Only one of destFile or destDir may be set. | |||
| copy.fileset-for-dirs.error=Use a fileset to copy directories. | |||
| copy.need-destdir.error=Cannot copy multiple files into a single file. | |||
| copy.bad-mapping.error=Cannot concatenate multiple files into a single file. | |||
| copy.bad-operation.error=Cannot perform operation from directory to file. | |||
| copy.missing-file.error=Could not find file {0} to copy. | |||
| copy.dir-count.notice=Copied {0} empty director{0,choice,1#y|2<ies} to {1}. | |||
| copy.file-count.notice=Copying {0} file{0,choice,1#|2<s} to {1}. | |||
| copy.dircopy.error=Unable to create directory {0}. | |||
| copy.filecopy.error=Failed to copy {0} to {1} due to {3}. | |||
| copy.filecopy.notice=Copying {0} to {1}. | |||
| copy.selfcopy-ignored.notice=Skipping self-copy of {0}. | |||
| @@ -1,203 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.file; | |||
| import java.io.File; | |||
| import java.io.FileOutputStream; | |||
| import java.io.IOException; | |||
| import java.text.DateFormat; | |||
| import java.text.ParseException; | |||
| import java.util.ArrayList; | |||
| import java.util.Locale; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.FileSet; | |||
| import org.apache.tools.todo.types.DirectoryScanner; | |||
| import org.apache.tools.todo.types.ScannerUtil; | |||
| /** | |||
| * Touch a file and/or fileset(s) -- corresponds to the Unix touch command. | |||
| * | |||
| * If the file to touch doesn't exist, an empty one is created. </p> | |||
| * | |||
| * @ant.task name="touch" | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @author <a href="mailto:mj@servidium.com">Michael J. Sikorsky</a> | |||
| * @author <a href="mailto:shaw@servidium.com">Robert Shaw</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public class Touch | |||
| extends AbstractTask | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( Touch.class ); | |||
| private long m_millis = -1; | |||
| private String m_datetime; | |||
| private ArrayList m_filesets = new ArrayList(); | |||
| private File m_file; | |||
| /** | |||
| * Date in the format MM/DD/YYYY HH:MM AM_PM. | |||
| */ | |||
| public void setDatetime( final String datetime ) | |||
| { | |||
| m_datetime = datetime; | |||
| } | |||
| /** | |||
| * Sets a single source file to touch. If the file does not exist an empty | |||
| * file will be created. | |||
| */ | |||
| public void setFile( final File file ) | |||
| { | |||
| m_file = file; | |||
| } | |||
| /** | |||
| * Milliseconds since 01/01/1970 00:00 am. | |||
| */ | |||
| public void setMillis( final long millis ) | |||
| { | |||
| m_millis = millis; | |||
| } | |||
| /** | |||
| * Adds a set of files (nested fileset attribute). | |||
| */ | |||
| public void addFileset( final FileSet set ) | |||
| { | |||
| m_filesets.add( set ); | |||
| } | |||
| /** | |||
| * Execute the touch operation. | |||
| * | |||
| * @exception TaskException Description of Exception | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| validate(); | |||
| if( m_datetime != null ) | |||
| { | |||
| final DateFormat format = | |||
| DateFormat.getDateTimeInstance( DateFormat.SHORT, | |||
| DateFormat.SHORT, | |||
| Locale.US ); | |||
| try | |||
| { | |||
| final long millis = format.parse( m_datetime ).getTime(); | |||
| if( 0 > millis ) | |||
| { | |||
| final String message = REZ.getString( "touch.neg-time.error", m_datetime ); | |||
| throw new TaskException( message ); | |||
| } | |||
| setMillis( millis ); | |||
| } | |||
| catch( final ParseException pe ) | |||
| { | |||
| throw new TaskException( pe.getMessage(), pe ); | |||
| } | |||
| } | |||
| touch(); | |||
| } | |||
| private void validate() | |||
| throws TaskException | |||
| { | |||
| if( null == m_file && 0 == m_filesets.size() ) | |||
| { | |||
| final String message = REZ.getString( "touch.no-files.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| if( null != m_file && m_file.exists() && m_file.isDirectory() ) | |||
| { | |||
| final String message = REZ.getString( "touch.use-fileset.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| private void touch() | |||
| throws TaskException | |||
| { | |||
| if( m_millis < 0 ) | |||
| { | |||
| m_millis = System.currentTimeMillis(); | |||
| } | |||
| if( null != m_file ) | |||
| { | |||
| if( !m_file.exists() ) | |||
| { | |||
| if( getContext().isInfoEnabled() ) | |||
| { | |||
| final String message = REZ.getString( "touch.create.notice", m_file ); | |||
| getContext().info( message ); | |||
| } | |||
| try | |||
| { | |||
| FileOutputStream fos = new FileOutputStream( m_file ); | |||
| fos.write( new byte[ 0 ] ); | |||
| fos.close(); | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| final String message = REZ.getString( "touch.no-touch.error", m_file, ioe ); | |||
| throw new TaskException( message, ioe ); | |||
| } | |||
| } | |||
| touch( m_file ); | |||
| } | |||
| // deal with the filesets | |||
| final int size = m_filesets.size(); | |||
| for( int i = 0; i < size; i++ ) | |||
| { | |||
| final FileSet fileSet = (FileSet)m_filesets.get( i ); | |||
| final DirectoryScanner scanner = ScannerUtil.getDirectoryScanner( fileSet ); | |||
| final File fromDir = fileSet.getDir(); | |||
| final String[] srcFiles = scanner.getIncludedFiles(); | |||
| final String[] srcDirs = scanner.getIncludedDirectories(); | |||
| for( int j = 0; j < srcFiles.length; j++ ) | |||
| { | |||
| final File file = new File( fromDir, srcFiles[ j ] ); | |||
| touch( file ); | |||
| } | |||
| for( int j = 0; j < srcDirs.length; j++ ) | |||
| { | |||
| final File file = new File( fromDir, srcDirs[ j ] ); | |||
| touch( file ); | |||
| } | |||
| } | |||
| } | |||
| private void touch( final File file ) | |||
| throws TaskException | |||
| { | |||
| if( !file.canWrite() ) | |||
| { | |||
| final String message = REZ.getString( "touch.readonly-file.error", file ); | |||
| throw new TaskException( message ); | |||
| } | |||
| final long time = ( m_millis < 0 ) ? System.currentTimeMillis() : m_millis; | |||
| file.setLastModified( time ); | |||
| } | |||
| } | |||
| @@ -1,92 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.java; | |||
| import java.io.File; | |||
| import java.io.FileWriter; | |||
| import java.io.PrintWriter; | |||
| import java.io.IOException; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.nativelib.Execute; | |||
| /** | |||
| * An abstract compiler adaptor, that forks an external compiler. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public abstract class ExternalCompilerAdaptor | |||
| extends JavaCompilerAdaptor | |||
| { | |||
| /** | |||
| * Compiles a set of files. | |||
| */ | |||
| protected void compile( final File[] files ) | |||
| throws TaskException | |||
| { | |||
| // Write the file names to a temp file | |||
| final File tempFile = createTempFile( files ); | |||
| try | |||
| { | |||
| final Execute exe = new Execute(); | |||
| // Build the command line | |||
| buildCommandLine( exe, tempFile ); | |||
| // Execute | |||
| exe.execute( getContext() ); | |||
| } | |||
| finally | |||
| { | |||
| tempFile.delete(); | |||
| } | |||
| } | |||
| /** | |||
| * Builds the command-line to execute the compiler. | |||
| */ | |||
| protected abstract void buildCommandLine( final Execute exe, final File tempFile ) | |||
| throws TaskException; | |||
| /** | |||
| * Writes the temporary file containing the names of the files to compile. | |||
| */ | |||
| private File createTempFile( final File[] files ) | |||
| throws TaskException | |||
| { | |||
| try | |||
| { | |||
| // Build the temp file name | |||
| final File tmpFile = File.createTempFile( "javac", "", getContext().getBaseDirectory() ); | |||
| // Write file names to the temp file | |||
| final FileWriter writer = new FileWriter( tmpFile ); | |||
| try | |||
| { | |||
| final PrintWriter pwriter = new PrintWriter( writer, false ); | |||
| for( int i = 0; i < files.length; i++ ) | |||
| { | |||
| File file = files[ i ]; | |||
| pwriter.println( file.getAbsolutePath() ); | |||
| } | |||
| pwriter.close(); | |||
| } | |||
| finally | |||
| { | |||
| writer.close(); | |||
| } | |||
| return tmpFile; | |||
| } | |||
| catch( final IOException e ) | |||
| { | |||
| throw new TaskException( "Cannot write file list", e ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,247 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.java; | |||
| import java.io.File; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.FileSet; | |||
| import org.apache.myrmidon.framework.file.FileList; | |||
| import org.apache.myrmidon.framework.file.Path; | |||
| import org.apache.tools.todo.types.DirectoryScanner; | |||
| import org.apache.tools.todo.types.ScannerUtil; | |||
| import org.apache.tools.todo.types.SourceFileScanner; | |||
| import org.apache.tools.todo.util.mappers.GlobPatternMapper; | |||
| /** | |||
| * An abstract Java compiler. | |||
| * | |||
| * @author James Davidson <a href="mailto:duncan@x180.com">duncan@x180.com</a> | |||
| * @author Robin Green <a href="mailto:greenrd@hotmail.com">greenrd@hotmail.com | |||
| * </a> | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @author <a href="mailto:jayglanville@home.com">J D Glanville</a> | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.role shorthand="java-compiler" | |||
| */ | |||
| public abstract class JavaCompilerAdaptor | |||
| { | |||
| private TaskContext m_context; | |||
| private Path m_classPath = new Path(); | |||
| private ArrayList m_sourceFilesets = new ArrayList(); | |||
| private boolean m_debug; | |||
| private boolean m_deprecation; | |||
| private File m_destDir; | |||
| /** | |||
| * Sets the context for this adaptor. | |||
| */ | |||
| public void setContext( final TaskContext context ) | |||
| { | |||
| m_context = context; | |||
| } | |||
| /** | |||
| * Returns the context for this adaptor. | |||
| */ | |||
| protected TaskContext getContext() | |||
| { | |||
| return m_context; | |||
| } | |||
| /** | |||
| * Enables debug in the compiled classes. | |||
| */ | |||
| public void setDebug( final boolean debug ) | |||
| { | |||
| m_debug = debug; | |||
| } | |||
| /** | |||
| * Returns the 'debug' flag. | |||
| */ | |||
| protected boolean isDebug() | |||
| { | |||
| return m_debug; | |||
| } | |||
| /** | |||
| * Sets the destination directory. | |||
| */ | |||
| public void setDestDir( final File destDir ) | |||
| { | |||
| m_destDir = destDir; | |||
| } | |||
| /** | |||
| * Returns the destination directory. | |||
| */ | |||
| protected File getDestDir() | |||
| { | |||
| return m_destDir; | |||
| } | |||
| /** | |||
| * Enables deprecation info. | |||
| */ | |||
| public void setDeprecation( final boolean deprecation ) | |||
| { | |||
| m_deprecation = deprecation; | |||
| } | |||
| /** | |||
| * Returns the 'deprecation' flag. | |||
| */ | |||
| protected boolean isDeprecation() | |||
| { | |||
| return m_deprecation; | |||
| } | |||
| /** | |||
| * Adds a source fileset. | |||
| */ | |||
| public void addSrc( final FileSet fileset ) | |||
| { | |||
| m_sourceFilesets.add( fileset ); | |||
| } | |||
| /** | |||
| * Adds a class-path element. | |||
| */ | |||
| public void addClasspath( final Path path ) | |||
| { | |||
| m_classPath.add( path ); | |||
| } | |||
| /** | |||
| * Returns the classpath | |||
| */ | |||
| protected FileList getClassPath() | |||
| { | |||
| return m_classPath; | |||
| } | |||
| /** | |||
| * Invokes the compiler. | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| validate(); | |||
| // Build the list of files to compile | |||
| final File[] compileList = getCompileList(); | |||
| logFiles( compileList ); | |||
| if( compileList.length == 0 ) | |||
| { | |||
| return; | |||
| } | |||
| // Compile | |||
| compile( compileList ); | |||
| } | |||
| /** | |||
| * Compiles a set of files. | |||
| */ | |||
| protected abstract void compile( final File[] files ) | |||
| throws TaskException; | |||
| /** | |||
| * Logs the details of what is going to be compiled. | |||
| */ | |||
| private void logFiles( final File[] compileList ) | |||
| { | |||
| // Log | |||
| final String message = "Compiling " + compileList.length + " source files to " + m_destDir; | |||
| getContext().info( message ); | |||
| if( getContext().isVerboseEnabled() ) | |||
| { | |||
| getContext().verbose( "Compiling the following files:" ); | |||
| for( int i = 0; i < compileList.length; i++ ) | |||
| { | |||
| final File file = compileList[ i ]; | |||
| getContext().verbose( file.getAbsolutePath() ); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Builds the set of file to compile. | |||
| */ | |||
| private File[] getCompileList() | |||
| throws TaskException | |||
| { | |||
| final ArrayList allFiles = new ArrayList(); | |||
| for( int i = 0; i < m_sourceFilesets.size(); i++ ) | |||
| { | |||
| final FileSet fileSet = (FileSet)m_sourceFilesets.get( i ); | |||
| final DirectoryScanner scanner = ScannerUtil.getDirectoryScanner( fileSet ); | |||
| final String[] files = scanner.getIncludedFiles(); | |||
| restrictFiles( fileSet.getDir(), files, allFiles ); | |||
| } | |||
| return (File[])allFiles.toArray( new File[ allFiles.size() ] ); | |||
| } | |||
| /** | |||
| * Restricts a set of source files to those that are out-of-date WRT | |||
| * their class file. | |||
| */ | |||
| private void restrictFiles( final File srcDir, | |||
| final String files[], | |||
| final List acceptedFiles ) | |||
| throws TaskException | |||
| { | |||
| final GlobPatternMapper mapper = new GlobPatternMapper(); | |||
| mapper.setFrom( "*.java" ); | |||
| mapper.setTo( "*.class" ); | |||
| final SourceFileScanner sfs = new SourceFileScanner(); | |||
| final File[] newFiles = sfs.restrictAsFiles( files, | |||
| srcDir, | |||
| m_destDir, | |||
| mapper, | |||
| getContext() ); | |||
| for( int i = 0; i < newFiles.length; i++ ) | |||
| { | |||
| final File file = newFiles[i ]; | |||
| acceptedFiles.add( file ); | |||
| } | |||
| } | |||
| /** | |||
| * Validates the compiler settings. | |||
| */ | |||
| private void validate() throws TaskException | |||
| { | |||
| // Validate the destination directory | |||
| if( m_destDir == null ) | |||
| { | |||
| throw new TaskException( "No destination directory specified." ); | |||
| } | |||
| if( m_destDir.exists() ) | |||
| { | |||
| if( !m_destDir.isDirectory() ) | |||
| { | |||
| throw new TaskException( "Destination " + m_destDir + " is not a directory." ); | |||
| } | |||
| } | |||
| else | |||
| { | |||
| if( !m_destDir.mkdirs() ) | |||
| { | |||
| throw new TaskException( "Cannot create destination directory " + m_destDir ); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -1,121 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.java; | |||
| import java.io.File; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.java.ExecuteJava; | |||
| import org.apache.myrmidon.framework.nativelib.Argument; | |||
| import org.apache.myrmidon.framework.nativelib.EnvironmentVariable; | |||
| import org.apache.myrmidon.framework.file.Path; | |||
| /** | |||
| * 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@apache.org"> | |||
| * stefano@apache.org</a> | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * | |||
| * @ant.task name="java" | |||
| */ | |||
| public class JavaTask | |||
| extends AbstractTask | |||
| { | |||
| private final ExecuteJava m_exec = new ExecuteJava(); | |||
| /** | |||
| * Set the class name. | |||
| */ | |||
| public void setClassname( final String className ) | |||
| { | |||
| m_exec.setClassName( className ); | |||
| } | |||
| /** | |||
| * Add a classpath element. | |||
| */ | |||
| public void addClasspath( final Path classpath ) | |||
| throws TaskException | |||
| { | |||
| m_exec.getClassPath().add( classpath ); | |||
| } | |||
| /** | |||
| * The working directory of the process | |||
| * | |||
| * @param dir The new Dir value | |||
| */ | |||
| public void setDir( final File dir ) | |||
| { | |||
| m_exec.setWorkingDirectory( dir ); | |||
| } | |||
| /** | |||
| * Set the forking flag. | |||
| */ | |||
| public void setFork( final boolean fork ) | |||
| { | |||
| m_exec.setFork( fork ); | |||
| } | |||
| /** | |||
| * Set the jar name. | |||
| */ | |||
| public void setJar( final File jar ) | |||
| { | |||
| m_exec.setJar( jar ); | |||
| } | |||
| /** | |||
| * Set the command used to start the VM (only if fork==true). | |||
| */ | |||
| public void setJvm( final String jvm ) | |||
| { | |||
| m_exec.setJvm( jvm ); | |||
| } | |||
| /** | |||
| * -mx or -Xmx depending on VM version | |||
| */ | |||
| public void setMaxmemory( final String max ) | |||
| { | |||
| m_exec.setMaxMemory( max ); | |||
| } | |||
| /** | |||
| * Add a nested sysproperty element. | |||
| */ | |||
| public void addSysproperty( final EnvironmentVariable sysp ) | |||
| { | |||
| m_exec.getSysProperties().addVariable( sysp ); | |||
| } | |||
| /** | |||
| * Creates a nested arg element. | |||
| */ | |||
| public void addArg( final Argument argument ) | |||
| { | |||
| m_exec.getArguments().addArgument( argument ); | |||
| } | |||
| /** | |||
| * Creates a nested jvmarg element. | |||
| */ | |||
| public void addJvmarg( final Argument argument ) | |||
| { | |||
| m_exec.getVmArguments().addArgument( argument ); | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| m_exec.execute( getContext() ); | |||
| } | |||
| } | |||
| @@ -1,114 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.java; | |||
| import java.io.File; | |||
| import java.lang.reflect.Method; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.file.FileListUtil; | |||
| import org.apache.myrmidon.framework.file.Path; | |||
| import org.apache.myrmidon.framework.nativelib.ArgumentList; | |||
| /** | |||
| * An adaptor for the in-process Javac compiler. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.type type="java-compiler" name="javac" | |||
| */ | |||
| public class JavacAdaptor | |||
| extends JavaCompilerAdaptor | |||
| { | |||
| /** | |||
| * Compiles as set of files. | |||
| */ | |||
| protected void compile( final File[] compileList ) | |||
| throws TaskException | |||
| { | |||
| final ArgumentList cmd = new ArgumentList(); | |||
| setupModernJavacCommand( cmd, compileList ); | |||
| final String[] args = cmd.getArguments(); | |||
| // Use reflection to be able to build on all JDKs >= 1.2: | |||
| final Class compilerClass; | |||
| try | |||
| { | |||
| compilerClass = Class.forName( "com.sun.tools.javac.Main" ); | |||
| } | |||
| catch( ClassNotFoundException exc ) | |||
| { | |||
| throw new TaskException( "Could not find the javac compiler.", exc ); | |||
| } | |||
| try | |||
| { | |||
| final Object compiler = compilerClass.newInstance(); | |||
| final Class[] paramTypes = new Class[] { args.getClass() }; | |||
| final Method compile = compilerClass.getMethod( "compile", paramTypes ); | |||
| final Object[] params = new Object[]{ args }; | |||
| final Integer result = (Integer)compile.invoke( compiler, params ); | |||
| if( result.intValue() != 0 ) | |||
| { | |||
| throw new TaskException( "Javac finished with non-zero return code." ); | |||
| } | |||
| } | |||
| catch( final TaskException exc ) | |||
| { | |||
| throw exc; | |||
| } | |||
| catch( final Exception exc ) | |||
| { | |||
| throw new TaskException( "Could not start javac compiler", exc ); | |||
| } | |||
| } | |||
| /** | |||
| * Builds the command-line to invoke the compiler with. | |||
| */ | |||
| private void setupModernJavacCommand( final ArgumentList cmd, | |||
| final File[] files ) | |||
| throws TaskException | |||
| { | |||
| // Build the classpath | |||
| Path classpath = new Path(); | |||
| classpath.addLocation( getDestDir() ); | |||
| classpath.add( getClassPath() ); | |||
| cmd.addArgument( "-classpath" ); | |||
| cmd.addArgument( FileListUtil.formatPath( classpath, getContext() ) ); | |||
| if( isDeprecation() ) | |||
| { | |||
| cmd.addArgument( "-deprecation" ); | |||
| } | |||
| cmd.addArgument( "-d" ); | |||
| cmd.addArgument( getDestDir() ); | |||
| if( isDebug() ) | |||
| { | |||
| cmd.addArgument( "-g" ); | |||
| } | |||
| else | |||
| { | |||
| cmd.addArgument( "-g:none" ); | |||
| } | |||
| // Add the files to compile | |||
| for( int i = 0; i < files.length; i++ ) | |||
| { | |||
| final File file = files[i ]; | |||
| cmd.addArgument( file ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,54 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.java; | |||
| import org.apache.myrmidon.framework.AbstractFacadeTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * A task that compiles Java source files. | |||
| * | |||
| * @author James Davidson <a href="mailto:duncan@x180.com">duncan@x180.com</a> | |||
| * @author Robin Green <a href="mailto:greenrd@hotmail.com">greenrd@hotmail.com</a> | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @author <a href="mailto:jayglanville@home.com">J D Glanville</a> | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.task name="javac" | |||
| */ | |||
| public class JavacTask | |||
| extends AbstractFacadeTask | |||
| { | |||
| public JavacTask() | |||
| { | |||
| super( "compiler", JavaCompilerAdaptor.class, "javac" ); | |||
| } | |||
| /** | |||
| * Execute this task. | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| getContext().verbose( "Using " + getImplementation() + " compiler." ); | |||
| final JavaCompilerAdaptor adaptor = (JavaCompilerAdaptor)prepareFacade(); | |||
| adaptor.execute(); | |||
| } | |||
| /** | |||
| * Create the instance of the facade. | |||
| */ | |||
| protected Object createFacade() | |||
| throws TaskException | |||
| { | |||
| JavaCompilerAdaptor adaptor = (JavaCompilerAdaptor)super.createFacade(); | |||
| adaptor.setContext( getContext() ); | |||
| return adaptor; | |||
| } | |||
| } | |||
| @@ -1,82 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.java; | |||
| import java.io.File; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.nativelib.Execute; | |||
| import org.apache.myrmidon.framework.java.JavaRuntimeClassPath; | |||
| import org.apache.myrmidon.framework.file.Path; | |||
| import org.apache.myrmidon.framework.file.FileListUtil; | |||
| /** | |||
| * An adaptor for the jikes compiler. | |||
| * | |||
| * @author James Davidson <a href="mailto:duncan@x180.com">duncan@x180.com</a> | |||
| * @author Robin Green <a href="mailto:greenrd@hotmail.com">greenrd@hotmail.com | |||
| * </a> | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @author <a href="mailto:jayglanville@home.com">J D Glanville</a> | |||
| * @author skanthak@muehlheim.de | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.type type="java-compiler" name="jikes" | |||
| */ | |||
| public class JikesAdaptor | |||
| extends ExternalCompilerAdaptor | |||
| { | |||
| /** | |||
| * Builds the command-line to execute the compiler. | |||
| */ | |||
| protected void buildCommandLine( final Execute exe, final File tempFile ) | |||
| throws TaskException | |||
| { | |||
| final Path classpath = new Path(); | |||
| // Add the destination directory | |||
| classpath.addLocation( getDestDir() ); | |||
| // Add the compile classpath | |||
| classpath.add( getClassPath() ); | |||
| // If the user has set JIKESPATH we should add the contents as well | |||
| String jikesPath = System.getProperty( "jikes.class.path" ); | |||
| if( jikesPath != null ) | |||
| { | |||
| classpath.add( jikesPath ); | |||
| } | |||
| // Add the runtime | |||
| classpath.add( new JavaRuntimeClassPath() ); | |||
| // Build the command line | |||
| exe.setExecutable( "jikes" ); | |||
| if( isDeprecation() ) | |||
| { | |||
| exe.addArgument( "-deprecation" ); | |||
| } | |||
| if( isDebug() ) | |||
| { | |||
| exe.addArgument( "-g" ); | |||
| } | |||
| exe.addArgument( "-d" ); | |||
| exe.addArgument( getDestDir() ); | |||
| exe.addArgument( "-classpath" ); | |||
| exe.addArgument( FileListUtil.formatPath( classpath, getContext() ) ); | |||
| // TODO - make this configurable | |||
| exe.addArgument( "+E" ); | |||
| exe.addArgument( "@" + tempFile.getAbsolutePath() ); | |||
| } | |||
| } | |||
| @@ -1,112 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.nativelib; | |||
| import java.io.File; | |||
| import java.util.Properties; | |||
| import org.apache.aut.nativelib.Os; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.nativelib.Execute; | |||
| import org.apache.myrmidon.framework.nativelib.Argument; | |||
| import org.apache.myrmidon.framework.nativelib.EnvironmentData; | |||
| import org.apache.myrmidon.framework.nativelib.EnvironmentVariable; | |||
| /** | |||
| * Executes a native command. | |||
| * | |||
| * @author <a href="mailto:duncan@x180.com">JDD</a> | |||
| * @author <a href="mailto:rubys@us.ibm.com">Sam Ruby</a> | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @author <a href="mailto:mariusz@rakiura.org">Mariusz Nowostawski</a> | |||
| * @author <a href="mailto:thomas.haas@softwired-inc.com">Thomas Haas</a> | |||
| * @ant.task name="exec" | |||
| */ | |||
| public class Exec | |||
| extends AbstractTask | |||
| { | |||
| private final Execute m_exe = new Execute(); | |||
| private final EnvironmentData m_env = new EnvironmentData(); | |||
| private String m_os; | |||
| /** | |||
| * The working directory of the process | |||
| */ | |||
| public void setDir( final File dir ) | |||
| throws TaskException | |||
| { | |||
| m_exe.setWorkingDirectory( dir ); | |||
| } | |||
| /** | |||
| * The command to execute. | |||
| */ | |||
| public void setExecutable( final String value ) | |||
| throws TaskException | |||
| { | |||
| m_exe.setExecutable( value ); | |||
| } | |||
| /** | |||
| * Use a completely new environment | |||
| */ | |||
| public void setNewenvironment( final boolean newEnvironment ) | |||
| { | |||
| m_exe.setNewenvironment( newEnvironment ); | |||
| } | |||
| /** | |||
| * Only execute the process if running on the specified OS family. | |||
| */ | |||
| public void setOs( final String os ) | |||
| { | |||
| m_os = os; | |||
| } | |||
| /** | |||
| * Timeout in milliseconds after which the process will be killed. | |||
| */ | |||
| public void setTimeout( final long timeout ) | |||
| { | |||
| m_exe.setTimeout( timeout ); | |||
| } | |||
| /** | |||
| * Add a nested env element - an environment variable. | |||
| */ | |||
| public void addEnv( final EnvironmentVariable var ) | |||
| { | |||
| m_env.addVariable( var ); | |||
| } | |||
| /** | |||
| * Add a nested arg element - a command line argument. | |||
| */ | |||
| public void addArg( final Argument argument ) | |||
| { | |||
| m_exe.addArgument( argument ); | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| if( null != m_os && Os.isFamily( m_os ) ) | |||
| { | |||
| return; | |||
| } | |||
| // Setup environment vars | |||
| final Properties environment = m_env.getVariables(); | |||
| m_exe.setEnvironment( environment ); | |||
| // execute the command | |||
| m_exe.execute( getContext() ); | |||
| } | |||
| } | |||
| @@ -1,99 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.nativelib; | |||
| import java.util.Iterator; | |||
| import java.util.Properties; | |||
| import org.apache.aut.nativelib.ExecException; | |||
| import org.apache.aut.nativelib.ExecManager; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * This task is responsible for loading that OS-specific environment | |||
| * variables and adding them as propertys to the context with a specified | |||
| * prefix. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @ant.task name="load-environment" | |||
| */ | |||
| public class LoadEnvironment | |||
| extends AbstractTask | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( LoadEnvironment.class ); | |||
| private String m_prefix; | |||
| public void setPrefix( final String prefix ) | |||
| { | |||
| m_prefix = prefix; | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| if( null == m_prefix ) | |||
| { | |||
| final String message = REZ.getString( "loadenv.no-prefix.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| //Make sure prefix ends with a '.' | |||
| if( !m_prefix.endsWith( "." ) ) | |||
| { | |||
| m_prefix += "."; | |||
| } | |||
| if( getContext().isDebugEnabled() ) | |||
| { | |||
| final String displayPrefix = | |||
| m_prefix.substring( 0, m_prefix.length() - 1 ); | |||
| final String message = | |||
| REZ.getString( "loadenv.prefix.notice", displayPrefix ); | |||
| getContext().debug( message ); | |||
| } | |||
| final Properties environment = loadNativeEnvironment(); | |||
| final Iterator keys = environment.keySet().iterator(); | |||
| while( keys.hasNext() ) | |||
| { | |||
| final String key = (String)keys.next(); | |||
| final String value = environment.getProperty( key ); | |||
| if( value.equals( "" ) ) | |||
| { | |||
| final String message = REZ.getString( "loadenv.ignoring-empty.warn", key ); | |||
| getContext().warn( message ); | |||
| } | |||
| else | |||
| { | |||
| getContext().setProperty( m_prefix + key, value ); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Utility method to load the native environment variables. | |||
| */ | |||
| private Properties loadNativeEnvironment() | |||
| throws TaskException | |||
| { | |||
| try | |||
| { | |||
| final ExecManager manager = (ExecManager)getService( ExecManager.class ); | |||
| return manager.getNativeEnvironment(); | |||
| } | |||
| catch( final ExecException ee ) | |||
| { | |||
| throw new TaskException( ee.getMessage(), ee ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,79 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.nativelib; | |||
| import org.apache.aut.nativelib.Os; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.conditions.Condition; | |||
| /** | |||
| * Condition to check the current OS.</p> | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| * @version $Revision$ | |||
| * | |||
| * @ant.type type="condition" name="os" | |||
| */ | |||
| public class OsCondition | |||
| implements Condition | |||
| { | |||
| private String m_family; | |||
| private String m_name; | |||
| private String m_version; | |||
| private String m_arch; | |||
| /** | |||
| * Sets the desired OS family type | |||
| * | |||
| * @param family The OS family type desired. | |||
| */ | |||
| public void setFamily( final String family ) | |||
| { | |||
| m_family = family; | |||
| } | |||
| /** | |||
| * Sets the desired OS name | |||
| * | |||
| * @param name The OS name | |||
| */ | |||
| public void setName( final String name ) | |||
| { | |||
| m_name = name; | |||
| } | |||
| /** | |||
| * Sets the desired OS architecture | |||
| * | |||
| * @param arch The OS architecture | |||
| */ | |||
| public void setArch( final String arch ) | |||
| { | |||
| m_arch = arch; | |||
| } | |||
| /** | |||
| * Sets the desired OS version | |||
| * | |||
| * @param version The OS version | |||
| */ | |||
| public void setVersion( final String version ) | |||
| { | |||
| m_version = version; | |||
| } | |||
| /** | |||
| * Evaluates this condition. | |||
| */ | |||
| public boolean evaluate( final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| return Os.isOs( m_family, m_name, m_arch, m_version ); | |||
| } | |||
| } | |||
| @@ -1,3 +0,0 @@ | |||
| loadenv.no-prefix.error=No prefix specified for environment data. | |||
| loadenv.prefix.notice=Loading Environment with prefix {0}. | |||
| loadenv.ignoring-empty.warn=Key {0} in native OS environment is empty - ignoring key. | |||
| @@ -1,46 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.runtime; | |||
| import org.apache.myrmidon.framework.AbstractTypeDef; | |||
| import org.apache.myrmidon.interfaces.deployer.ConverterDefinition; | |||
| import org.apache.myrmidon.interfaces.deployer.TypeDefinition; | |||
| /** | |||
| * Task to define a converter. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @ant.task name="converter-def" | |||
| */ | |||
| public class ConverterDef | |||
| extends AbstractTypeDef | |||
| { | |||
| private String m_sourceType; | |||
| private String m_destinationType; | |||
| /** | |||
| * Sets the converter's source type. | |||
| */ | |||
| public void setSourceType( final String sourceType ) | |||
| { | |||
| m_sourceType = sourceType; | |||
| } | |||
| /** | |||
| * Sets the converter's destination type. | |||
| */ | |||
| public void setDestinationType( final String destinationType ) | |||
| { | |||
| m_destinationType = destinationType; | |||
| } | |||
| protected TypeDefinition createTypeDefinition() | |||
| { | |||
| return new ConverterDefinition( getClassname(), m_sourceType, m_destinationType ); | |||
| } | |||
| } | |||
| @@ -1,89 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.runtime; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.avalon.framework.configuration.Configurable; | |||
| import org.apache.avalon.framework.configuration.Configuration; | |||
| import org.apache.avalon.framework.configuration.ConfigurationException; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.aspects.AspectHandler; | |||
| import org.apache.myrmidon.framework.AbstractContainerTask; | |||
| import org.apache.myrmidon.interfaces.aspect.AspectManager; | |||
| /** | |||
| * Task that definesMethod to register a single converter. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @ant.task name="facility" | |||
| */ | |||
| public class Facility | |||
| extends AbstractContainerTask | |||
| implements Configurable | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( Facility.class ); | |||
| private String m_namespace; | |||
| private AspectHandler m_aspectHandler; | |||
| public void configure( final Configuration configuration ) | |||
| throws ConfigurationException | |||
| { | |||
| final String[] attributes = configuration.getAttributeNames(); | |||
| for( int i = 0; i < attributes.length; i++ ) | |||
| { | |||
| final String name = attributes[ i ]; | |||
| final String value = configuration.getAttribute( name ); | |||
| configureAttribute( this, name, value ); | |||
| } | |||
| final Configuration[] children = configuration.getChildren(); | |||
| if( 1 == children.length ) | |||
| { | |||
| final String typeName = children[ 0 ].getName(); | |||
| try | |||
| { | |||
| m_aspectHandler = (AspectHandler)newInstance( AspectHandler.ROLE, typeName ); | |||
| } | |||
| catch( final Exception e ) | |||
| { | |||
| final String message = | |||
| REZ.getString( "facility.no-create.error", typeName ); | |||
| throw new ConfigurationException( message, e ); | |||
| } | |||
| configureElement( m_aspectHandler, children[ 0 ] ); | |||
| } | |||
| else | |||
| { | |||
| final String message = REZ.getString( "facility.multi-element.error" ); | |||
| throw new ConfigurationException( message ); | |||
| } | |||
| } | |||
| public void setNamespace( final String namespace ) | |||
| { | |||
| m_namespace = namespace; | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| if( null == m_namespace ) | |||
| { | |||
| final String message = REZ.getString( "facility.no-namespace.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| final AspectManager aspectManager = (AspectManager)getService( AspectManager.class ); | |||
| aspectManager.addAspectHandler( m_namespace, m_aspectHandler ); | |||
| } | |||
| } | |||
| @@ -1,59 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.runtime; | |||
| import java.io.File; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.interfaces.deployer.Deployer; | |||
| import org.apache.myrmidon.interfaces.deployer.DeploymentException; | |||
| import org.apache.myrmidon.interfaces.deployer.TypeDeployer; | |||
| /** | |||
| * Task to import a tasklib. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @ant.task name="import" | |||
| */ | |||
| public class Import | |||
| extends AbstractTask | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( Import.class ); | |||
| private File m_lib; | |||
| public void setLib( final File lib ) | |||
| { | |||
| m_lib = lib; | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| if( null == m_lib ) | |||
| { | |||
| final String message = REZ.getString( "import.no-lib.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| try | |||
| { | |||
| final Deployer deployer = (Deployer)getService( Deployer.class ); | |||
| final TypeDeployer typeDeployer = deployer.createDeployer( m_lib ); | |||
| typeDeployer.deployAll(); | |||
| } | |||
| catch( final DeploymentException de ) | |||
| { | |||
| final String message = REZ.getString( "import.no-deploy.error" ); | |||
| throw new TaskException( message, de ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,10 +0,0 @@ | |||
| facility.no-create.error=Failed to create aspect handler of type {0}. | |||
| facility.multi-element.error=Expected one sub-element to configure facility. | |||
| facility.no-namespace.error=Must specify namespace parameter. | |||
| import.no-lib.error=Must specify lib parameter. | |||
| import.no-deploy.error=Error importing tasklib. | |||
| typeavailable.no-type-name.error=No type name was specified. | |||
| typeavailable.unknown-role.error=Unknown role "{0}". | |||
| typeavailable.evaluate.error=Could not determine if type "{0}" is available. | |||
| @@ -1,102 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.runtime; | |||
| import org.apache.myrmidon.framework.conditions.Condition; | |||
| import org.apache.myrmidon.framework.DataType; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.interfaces.role.RoleManager; | |||
| import org.apache.myrmidon.interfaces.role.RoleInfo; | |||
| import org.apache.myrmidon.interfaces.type.TypeManager; | |||
| import org.apache.myrmidon.interfaces.type.TypeFactory; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| /** | |||
| * A condition that evaluates to true if a particular type is available. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.type type="condition" name="type-available" | |||
| */ | |||
| public class TypeAvailableCondition | |||
| implements Condition | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( TypeAvailableCondition.class ); | |||
| private String m_roleShorthand; | |||
| private String m_name; | |||
| /** | |||
| * Sets the role to search for. | |||
| */ | |||
| public void setType( final String type ) | |||
| { | |||
| m_roleShorthand = type; | |||
| } | |||
| /** | |||
| * Sets the type to search for. | |||
| */ | |||
| public void setName( final String name ) | |||
| { | |||
| m_name = name; | |||
| } | |||
| /** | |||
| * Evaluates this condition. | |||
| * | |||
| * @param context | |||
| * The context to evaluate the condition in. | |||
| */ | |||
| public boolean evaluate( final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| if( m_name == null ) | |||
| { | |||
| final String message = REZ.getString( "typeavailable.no-type-name.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| try | |||
| { | |||
| // Map the shorthand name to a role | |||
| final String roleName; | |||
| if( m_roleShorthand != null ) | |||
| { | |||
| final RoleManager roleManager = (RoleManager)context.getService( RoleManager.class ); | |||
| final RoleInfo roleInfo = roleManager.getRoleByShorthandName( m_roleShorthand ); | |||
| if( roleInfo == null ) | |||
| { | |||
| final String message = REZ.getString( "typeavailable.unknown-role.error", m_roleShorthand ); | |||
| throw new TaskException( message ); | |||
| } | |||
| roleName = roleInfo.getName(); | |||
| } | |||
| else | |||
| { | |||
| roleName = DataType.ROLE; | |||
| } | |||
| // Lookup the type | |||
| final TypeManager typeManager = (TypeManager)context.getService( TypeManager.class ); | |||
| final TypeFactory typeFactory = typeManager.getFactory( roleName ); | |||
| // Check if the type is available | |||
| return typeFactory.canCreate( m_name ); | |||
| } | |||
| catch( final Exception e ) | |||
| { | |||
| final String message = REZ.getString( "typeavailable.evaluate.error", m_name ); | |||
| throw new TaskException( message, e ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,41 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.runtime; | |||
| import org.apache.myrmidon.framework.AbstractTypeDef; | |||
| import org.apache.myrmidon.interfaces.deployer.TypeDefinition; | |||
| /** | |||
| * Task to define a type. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @ant.task name="type-def" | |||
| */ | |||
| public class TypeDef | |||
| extends AbstractTypeDef | |||
| { | |||
| private String m_role; | |||
| public void setName( final String name ) | |||
| { | |||
| super.setName( name ); | |||
| } | |||
| /** | |||
| * Sets the type's role. | |||
| */ | |||
| public void setRole( final String role ) | |||
| { | |||
| m_role = role; | |||
| } | |||
| protected TypeDefinition createTypeDefinition() | |||
| { | |||
| return new TypeDefinition( getName(), m_role, getClassname() ); | |||
| } | |||
| } | |||
| @@ -1,75 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.security; | |||
| import java.util.ArrayList; | |||
| import java.util.Iterator; | |||
| public class DistinguishedName | |||
| { | |||
| private ArrayList m_params = new ArrayList(); | |||
| public Iterator getParams() | |||
| { | |||
| return m_params.iterator(); | |||
| } | |||
| public Object createParam() | |||
| { | |||
| final DnameParam param = new DnameParam(); | |||
| m_params.add( param ); | |||
| return param; | |||
| } | |||
| private String encode( final String string ) | |||
| { | |||
| int end = string.indexOf( ',' ); | |||
| if( -1 == end ) | |||
| { | |||
| return string; | |||
| } | |||
| final StringBuffer sb = new StringBuffer(); | |||
| int start = 0; | |||
| while( -1 != end ) | |||
| { | |||
| sb.append( string.substring( start, end ) ); | |||
| sb.append( "\\," ); | |||
| start = end + 1; | |||
| end = string.indexOf( ',', start ); | |||
| } | |||
| sb.append( string.substring( start ) ); | |||
| return sb.toString(); | |||
| } | |||
| public String toString() | |||
| { | |||
| final int size = m_params.size(); | |||
| final StringBuffer sb = new StringBuffer(); | |||
| boolean firstPass = true; | |||
| for( int i = 0; i < size; i++ ) | |||
| { | |||
| if( !firstPass ) | |||
| { | |||
| sb.append( " ," ); | |||
| } | |||
| firstPass = false; | |||
| final DnameParam param = (DnameParam)m_params.get( i ); | |||
| sb.append( encode( param.getName() ) ); | |||
| sb.append( '=' ); | |||
| sb.append( encode( param.getValue() ) ); | |||
| } | |||
| return sb.toString(); | |||
| } | |||
| } | |||
| @@ -1,34 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.security; | |||
| public final class DnameParam | |||
| { | |||
| private String m_name; | |||
| private String m_value; | |||
| public void setName( final String name ) | |||
| { | |||
| m_name = name; | |||
| } | |||
| public void setValue( final String value ) | |||
| { | |||
| m_value = value; | |||
| } | |||
| protected String getName() | |||
| { | |||
| return m_name; | |||
| } | |||
| protected String getValue() | |||
| { | |||
| return m_value; | |||
| } | |||
| } | |||
| @@ -1,236 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.security; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.nativelib.Execute; | |||
| import org.apache.myrmidon.framework.nativelib.Commandline; | |||
| /** | |||
| * Generates a key. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @ant.task name="generate-key" | |||
| */ | |||
| public class GenerateKey | |||
| extends AbstractTask | |||
| { | |||
| /** | |||
| * The alias of signer. | |||
| */ | |||
| private String m_alias; | |||
| private String m_dname; | |||
| private DistinguishedName m_expandedDname; | |||
| private String m_keyalg; | |||
| private String m_keypass; | |||
| private int m_keysize; | |||
| /** | |||
| * The name of keystore file. | |||
| */ | |||
| private String m_keystore; | |||
| private String m_sigalg; | |||
| private String m_storepass; | |||
| private String m_storetype; | |||
| private int m_validity; | |||
| private boolean m_verbose; | |||
| public void setAlias( final String alias ) | |||
| { | |||
| m_alias = alias; | |||
| } | |||
| public void setDname( final String dname ) | |||
| throws TaskException | |||
| { | |||
| m_dname = dname; | |||
| } | |||
| public void setKeyalg( final String keyalg ) | |||
| { | |||
| m_keyalg = keyalg; | |||
| } | |||
| public void setKeypass( final String keypass ) | |||
| { | |||
| m_keypass = keypass; | |||
| } | |||
| public void setKeysize( final int keysize ) | |||
| { | |||
| m_keysize = keysize; | |||
| } | |||
| public void setKeystore( final String keystore ) | |||
| { | |||
| m_keystore = keystore; | |||
| } | |||
| public void setSigalg( final String sigalg ) | |||
| { | |||
| m_sigalg = sigalg; | |||
| } | |||
| public void setStorepass( final String storepass ) | |||
| { | |||
| m_storepass = storepass; | |||
| } | |||
| public void setStoretype( final String storetype ) | |||
| { | |||
| m_storetype = storetype; | |||
| } | |||
| public void setValidity( final int validity ) | |||
| throws TaskException | |||
| { | |||
| m_validity = validity; | |||
| } | |||
| public void setVerbose( final boolean verbose ) | |||
| { | |||
| m_verbose = verbose; | |||
| } | |||
| public void addDname( final DistinguishedName distinguishedName ) | |||
| throws TaskException | |||
| { | |||
| if( null != m_expandedDname ) | |||
| { | |||
| final String message = "DName sub-element can only be specified once."; | |||
| throw new TaskException( message ); | |||
| } | |||
| m_expandedDname = distinguishedName; | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| validate(); | |||
| final String message = "Generating Key for " + m_alias; | |||
| getContext().info( message ); | |||
| final Execute exe = createCommand(); | |||
| exe.execute( getContext() ); | |||
| } | |||
| private Execute createCommand() | |||
| { | |||
| final Execute cmd = new Execute(); | |||
| cmd.setExecutable( "keytool" ); | |||
| cmd.addArgument( "-genkey " ); | |||
| if( m_verbose ) | |||
| { | |||
| cmd.addArgument( "-v " ); | |||
| } | |||
| cmd.addArgument( "-alias" ); | |||
| cmd.addArgument( m_alias ); | |||
| if( null != m_dname ) | |||
| { | |||
| cmd.addArgument( "-dname" ); | |||
| cmd.addArgument( m_dname ); | |||
| } | |||
| if( null != m_expandedDname ) | |||
| { | |||
| cmd.addArgument( "-dname" ); | |||
| cmd.addArgument( m_expandedDname.toString() ); | |||
| } | |||
| if( null != m_keystore ) | |||
| { | |||
| cmd.addArgument( "-keystore" ); | |||
| cmd.addArgument( m_keystore ); | |||
| } | |||
| if( null != m_storepass ) | |||
| { | |||
| cmd.addArgument( "-storepass" ); | |||
| cmd.addArgument( m_storepass ); | |||
| } | |||
| if( null != m_storetype ) | |||
| { | |||
| cmd.addArgument( "-storetype" ); | |||
| cmd.addArgument( m_storetype ); | |||
| } | |||
| cmd.addArgument( "-keypass" ); | |||
| if( null != m_keypass ) | |||
| { | |||
| cmd.addArgument( m_keypass ); | |||
| } | |||
| else | |||
| { | |||
| cmd.addArgument( m_storepass ); | |||
| } | |||
| if( null != m_sigalg ) | |||
| { | |||
| cmd.addArgument( "-sigalg" ); | |||
| cmd.addArgument( m_sigalg ); | |||
| } | |||
| if( null != m_keyalg ) | |||
| { | |||
| cmd.addArgument( "-keyalg" ); | |||
| cmd.addArgument( m_keyalg ); | |||
| } | |||
| if( 0 < m_keysize ) | |||
| { | |||
| cmd.addArgument( "-keysize" ); | |||
| cmd.addArgument( "" + m_keysize ); | |||
| } | |||
| if( 0 < m_validity ) | |||
| { | |||
| cmd.addArgument( "-validity" ); | |||
| cmd.addArgument( "" + m_validity ); | |||
| } | |||
| return cmd; | |||
| } | |||
| private void validate() | |||
| throws TaskException | |||
| { | |||
| if( null == m_alias ) | |||
| { | |||
| final String message = "alias attribute must be set"; | |||
| throw new TaskException( message ); | |||
| } | |||
| if( null == m_storepass ) | |||
| { | |||
| final String message = "storepass attribute must be set"; | |||
| throw new TaskException( message ); | |||
| } | |||
| if( null == m_dname && null == m_expandedDname ) | |||
| { | |||
| final String message = "dname must be set"; | |||
| throw new TaskException( message ); | |||
| } | |||
| else if( null != m_expandedDname && null != m_dname ) | |||
| { | |||
| final String message = "It is not possible to specify dname both " + | |||
| "as attribute and element."; | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,363 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.security; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| import java.util.ArrayList; | |||
| import java.util.Enumeration; | |||
| import java.util.zip.ZipEntry; | |||
| import java.util.zip.ZipFile; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.nativelib.Execute; | |||
| import org.apache.myrmidon.framework.FileSet; | |||
| import org.apache.tools.todo.types.DirectoryScanner; | |||
| import org.apache.tools.todo.types.ScannerUtil; | |||
| /** | |||
| * Sign a archive. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @author <a href="mailto:nick@ox.compsoc.net">Nick Fortescue</a> | |||
| * @ant.task name="sign-jar" | |||
| */ | |||
| public class SignJar | |||
| extends AbstractTask | |||
| { | |||
| /** | |||
| * the filesets of the jars to sign | |||
| */ | |||
| private ArrayList m_filesets = new ArrayList(); | |||
| /** | |||
| * The alias of signer. | |||
| */ | |||
| private String m_alias; | |||
| private boolean m_internalsf; | |||
| /** | |||
| * The name of the jar file. | |||
| */ | |||
| private File m_jar; | |||
| private String m_keypass; | |||
| /** | |||
| * The name of keystore file. | |||
| */ | |||
| private File m_keystore; | |||
| /** | |||
| * Whether to assume a jar which has an appropriate .SF file in is already | |||
| * signed. | |||
| */ | |||
| private boolean m_lazy; | |||
| private boolean m_sectionsonly; | |||
| private File m_sigfile; | |||
| private File m_signedjar; | |||
| private String m_storepass; | |||
| private String m_storetype; | |||
| private boolean m_verbose; | |||
| public void setAlias( final String alias ) | |||
| { | |||
| m_alias = alias; | |||
| } | |||
| public void setInternalsf( final boolean internalsf ) | |||
| { | |||
| m_internalsf = internalsf; | |||
| } | |||
| public void setJar( final File jar ) | |||
| { | |||
| m_jar = jar; | |||
| } | |||
| public void setKeypass( final String keypass ) | |||
| { | |||
| m_keypass = keypass; | |||
| } | |||
| public void setKeystore( final File keystore ) | |||
| { | |||
| m_keystore = keystore; | |||
| } | |||
| public void setLazy( final boolean lazy ) | |||
| { | |||
| m_lazy = lazy; | |||
| } | |||
| public void setSectionsonly( final boolean sectionsonly ) | |||
| { | |||
| m_sectionsonly = sectionsonly; | |||
| } | |||
| public void setSigfile( final File sigfile ) | |||
| { | |||
| m_sigfile = sigfile; | |||
| } | |||
| public void setSignedjar( final File signedjar ) | |||
| { | |||
| m_signedjar = signedjar; | |||
| } | |||
| public void setStorepass( final String storepass ) | |||
| { | |||
| m_storepass = storepass; | |||
| } | |||
| public void setStoretype( final String storetype ) | |||
| { | |||
| m_storetype = storetype; | |||
| } | |||
| public void setVerbose( final boolean verbose ) | |||
| { | |||
| m_verbose = verbose; | |||
| } | |||
| /** | |||
| * Adds a set of files (nested fileset attribute). | |||
| * | |||
| * @param set The feature to be added to the Fileset attribute | |||
| */ | |||
| public void addFileset( final FileSet set ) | |||
| { | |||
| m_filesets.add( set ); | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| validate(); | |||
| if( null != m_jar ) | |||
| { | |||
| doOneJar( m_jar, m_signedjar ); | |||
| } | |||
| else | |||
| { | |||
| //Assume null != filesets | |||
| // deal with the filesets | |||
| final int size = m_filesets.size(); | |||
| for( int i = 0; i < size; i++ ) | |||
| { | |||
| final FileSet fileSet = (FileSet)m_filesets.get( i ); | |||
| final DirectoryScanner scanner = ScannerUtil.getDirectoryScanner( fileSet ); | |||
| final String[] jarFiles = scanner.getIncludedFiles(); | |||
| for( int j = 0; j < jarFiles.length; j++ ) | |||
| { | |||
| final File file = | |||
| new File( fileSet.getDir(), jarFiles[ j ] ); | |||
| doOneJar( file, null ); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| private void validate() throws TaskException | |||
| { | |||
| if( null == m_jar && null == m_filesets ) | |||
| { | |||
| final String message = "jar must be set through jar attribute or nested filesets"; | |||
| throw new TaskException( message ); | |||
| } | |||
| else if( null != m_jar ) | |||
| { | |||
| if( null == m_alias ) | |||
| { | |||
| final String message = "alias attribute must be set"; | |||
| throw new TaskException( message ); | |||
| } | |||
| if( null == m_storepass ) | |||
| { | |||
| final String message = "storepass attribute must be set"; | |||
| throw new TaskException( message ); | |||
| } | |||
| } | |||
| } | |||
| private boolean isSigned( final File file ) | |||
| { | |||
| final String SIG_START = "META-INF/"; | |||
| final String SIG_END = ".SF"; | |||
| if( !file.exists() ) | |||
| { | |||
| return false; | |||
| } | |||
| ZipFile jarFile = null; | |||
| try | |||
| { | |||
| jarFile = new ZipFile( file ); | |||
| if( null == m_alias ) | |||
| { | |||
| final Enumeration entries = jarFile.entries(); | |||
| while( entries.hasMoreElements() ) | |||
| { | |||
| final ZipEntry entry = (ZipEntry)entries.nextElement(); | |||
| final String name = entry.getName(); | |||
| if( name.startsWith( SIG_START ) && name.endsWith( SIG_END ) ) | |||
| { | |||
| return true; | |||
| } | |||
| } | |||
| return false; | |||
| } | |||
| else | |||
| { | |||
| final String name = SIG_START + m_alias.toUpperCase() + SIG_END; | |||
| final ZipEntry entry = jarFile.getEntry( name ); | |||
| return ( entry != null ); | |||
| } | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| return false; | |||
| } | |||
| finally | |||
| { | |||
| if( null != jarFile ) | |||
| { | |||
| try | |||
| { | |||
| jarFile.close(); | |||
| } | |||
| catch( final IOException ioe ) | |||
| { | |||
| } | |||
| } | |||
| } | |||
| } | |||
| private boolean isUpToDate( final File jarFile, final File signedjarFile ) | |||
| { | |||
| if( null == jarFile ) | |||
| { | |||
| return false; | |||
| } | |||
| else if( null != signedjarFile ) | |||
| { | |||
| if( !jarFile.exists() ) | |||
| { | |||
| return false; | |||
| } | |||
| else if( !signedjarFile.exists() ) | |||
| { | |||
| return false; | |||
| } | |||
| else if( jarFile.equals( signedjarFile ) ) | |||
| { | |||
| return false; | |||
| } | |||
| else if( signedjarFile.lastModified() > jarFile.lastModified() ) | |||
| { | |||
| return true; | |||
| } | |||
| else | |||
| { | |||
| return false; | |||
| } | |||
| } | |||
| else if( m_lazy ) | |||
| { | |||
| return isSigned( jarFile ); | |||
| } | |||
| else | |||
| { | |||
| return false; | |||
| } | |||
| } | |||
| private void doOneJar( final File jarSource, final File jarTarget ) | |||
| throws TaskException | |||
| { | |||
| if( isUpToDate( jarSource, jarTarget ) ) | |||
| { | |||
| return; | |||
| } | |||
| final String message = "Signing Jar : " + jarSource.getAbsolutePath(); | |||
| getContext().info( message ); | |||
| final Execute exe = buildCommand( jarTarget, jarSource ); | |||
| exe.execute( getContext() ); | |||
| } | |||
| private Execute buildCommand( final File jarTarget, | |||
| final File jarSource ) | |||
| { | |||
| final Execute cmd = new Execute(); | |||
| cmd.setExecutable( "jarsigner" ); | |||
| if( null != m_keystore ) | |||
| { | |||
| cmd.addArgument( "-keystore" ); | |||
| cmd.addArgument( m_keystore ); | |||
| } | |||
| if( null != m_storepass ) | |||
| { | |||
| cmd.addArgument( "-storepass" ); | |||
| cmd.addArgument( m_storepass ); | |||
| } | |||
| if( null != m_storetype ) | |||
| { | |||
| cmd.addArgument( "-storetype" ); | |||
| cmd.addArgument( m_storetype ); | |||
| } | |||
| if( null != m_keypass ) | |||
| { | |||
| cmd.addArgument( "-keypass" ); | |||
| cmd.addArgument( m_keypass ); | |||
| } | |||
| if( null != m_sigfile ) | |||
| { | |||
| cmd.addArgument( "-sigfile" ); | |||
| cmd.addArgument( m_sigfile ); | |||
| } | |||
| if( null != jarTarget ) | |||
| { | |||
| cmd.addArgument( "-signedjar" ); | |||
| cmd.addArgument( jarTarget ); | |||
| } | |||
| if( m_verbose ) | |||
| { | |||
| cmd.addArgument( "-verbose" ); | |||
| } | |||
| if( m_internalsf ) | |||
| { | |||
| cmd.addArgument( "-internalsf" ); | |||
| } | |||
| if( m_sectionsonly ) | |||
| { | |||
| cmd.addArgument( "-sectionsonly" ); | |||
| } | |||
| cmd.addArgument( jarSource ); | |||
| cmd.addArgument( m_alias ); | |||
| return cmd; | |||
| } | |||
| } | |||
| @@ -1,47 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.selftest; | |||
| import org.apache.antlib.selftest.extension1.ExtensionsLoadedClass; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * This is to test whether extension is loaded. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @ant.task name="extensions-test" | |||
| */ | |||
| public class ExtensionsTest | |||
| extends AbstractTask | |||
| { | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| ExtensionsLoadedClass.doSomething(); | |||
| Class clazz = null; | |||
| try | |||
| { | |||
| clazz = Class.forName( "sun.tools.javac.Main" ); | |||
| } | |||
| catch( ClassNotFoundException e ) | |||
| { | |||
| try | |||
| { | |||
| clazz = Class.forName( "com.sun.tools.javac.Main" ); | |||
| } | |||
| catch( ClassNotFoundException e1 ) | |||
| { | |||
| throw new TaskException( "Unable to locate compilers from tools.jar" ); | |||
| } | |||
| } | |||
| System.out.println( "Compiler loaded from tools.jar = " + clazz ); | |||
| } | |||
| } | |||
| @@ -1,91 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.selftest; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * Test conversion of all the primitive types. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @ant.task name="prim-test" | |||
| */ | |||
| public class PrimitiveTypesTest | |||
| extends AbstractTask | |||
| { | |||
| public void setInteger( final Integer value ) | |||
| { | |||
| getContext().info( "setInteger( " + value + " );" ); | |||
| } | |||
| public void setInteger2( final int value ) | |||
| { | |||
| getContext().info( "setInteger2( " + value + " );" ); | |||
| } | |||
| public void setShort( final Short value ) | |||
| { | |||
| getContext().info( "setShort( " + value + " );" ); | |||
| } | |||
| public void setShort2( final short value ) | |||
| { | |||
| getContext().info( "setShort2( " + value + " );" ); | |||
| } | |||
| public void setByte( final Byte value ) | |||
| { | |||
| getContext().info( "setByte( " + value + " );" ); | |||
| } | |||
| public void setByte2( final byte value ) | |||
| { | |||
| getContext().info( "setByte2( " + value + " );" ); | |||
| } | |||
| public void setLong( final Long value ) | |||
| { | |||
| getContext().info( "setLong( " + value + " );" ); | |||
| } | |||
| public void setLong2( final long value ) | |||
| { | |||
| getContext().info( "setLong2( " + value + " );" ); | |||
| } | |||
| public void setFloat( final Float value ) | |||
| { | |||
| getContext().info( "setFloat( " + value + " );" ); | |||
| } | |||
| public void setFloat2( final float value ) | |||
| { | |||
| getContext().info( "setFloat2( " + value + " );" ); | |||
| } | |||
| public void setDouble( final Double value ) | |||
| { | |||
| getContext().info( "setDouble( " + value + " );" ); | |||
| } | |||
| public void setDouble2( final double value ) | |||
| { | |||
| getContext().info( "setDouble2( " + value + " );" ); | |||
| } | |||
| public void setString( final String value ) | |||
| { | |||
| getContext().info( "setString( " + value + " );" ); | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| } | |||
| } | |||
| @@ -1,21 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.selftest.extension1; | |||
| /** | |||
| * This is to test whether extension is loaded. | |||
| * | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| */ | |||
| public class ExtensionsLoadedClass | |||
| { | |||
| public static void doSomething() | |||
| { | |||
| System.out.println( "This was loaded via an extension - yea!" ); | |||
| } | |||
| } | |||
| @@ -1,237 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.sound; | |||
| import java.io.File; | |||
| import java.io.IOException; | |||
| import javax.sound.sampled.AudioFormat; | |||
| import javax.sound.sampled.AudioInputStream; | |||
| import javax.sound.sampled.AudioSystem; | |||
| import javax.sound.sampled.Clip; | |||
| import javax.sound.sampled.DataLine; | |||
| import javax.sound.sampled.Line; | |||
| import javax.sound.sampled.LineEvent; | |||
| import javax.sound.sampled.LineListener; | |||
| import javax.sound.sampled.LineUnavailableException; | |||
| import javax.sound.sampled.UnsupportedAudioFileException; | |||
| import org.apache.avalon.framework.logger.LogEnabled; | |||
| import org.apache.avalon.framework.logger.Logger; | |||
| import org.apache.myrmidon.listeners.AbstractProjectListener; | |||
| import org.apache.myrmidon.listeners.LogEvent; | |||
| import org.apache.myrmidon.listeners.ProjectEvent; | |||
| /** | |||
| * This class is designed to be used by any AntTask that requires audio output. | |||
| * It implements the BuildListener interface to listen for BuildEvents and could | |||
| * be easily extended to provide audio output upon any specific build events | |||
| * occuring. I have only tested this with .WAV and .AIFF sound file formats. | |||
| * Both seem to work fine. | |||
| * | |||
| * @author Nick Pellow | |||
| * @version $Revision$, $Date$ | |||
| */ | |||
| public class AntSoundPlayer | |||
| extends AbstractProjectListener | |||
| implements LineListener, LogEnabled | |||
| { | |||
| private File m_fileSuccess; | |||
| private int m_loopsSuccess; | |||
| private Long m_durationSuccess; | |||
| private File m_fileFail; | |||
| private int m_loopsFail; | |||
| private Long m_durationFail; | |||
| private Logger m_logger; | |||
| /** | |||
| * Provide component with a logger. | |||
| * | |||
| * @param logger the logger | |||
| */ | |||
| public void enableLogging( final Logger logger ) | |||
| { | |||
| m_logger = logger; | |||
| } | |||
| protected final Logger getLogger() | |||
| { | |||
| return m_logger; | |||
| } | |||
| /** | |||
| * Notify listener of projectFinished event. | |||
| */ | |||
| public void projectFinished( final ProjectEvent event ) | |||
| { | |||
| success(); | |||
| } | |||
| /** | |||
| * Notify listener of log message event. | |||
| */ | |||
| public void log( final LogEvent event ) | |||
| { | |||
| if( event.getThrowable() != null ) | |||
| { | |||
| failure(); | |||
| } | |||
| } | |||
| /** | |||
| * @param fileFail The feature to be added to the BuildFailedSound attribute | |||
| * @param loopsFail The feature to be added to the BuildFailedSound | |||
| * attribute | |||
| * @param durationFail The feature to be added to the BuildFailedSound | |||
| * attribute | |||
| */ | |||
| public void addBuildFailedSound( File fileFail, int loopsFail, Long durationFail ) | |||
| { | |||
| m_fileFail = fileFail; | |||
| m_loopsFail = loopsFail; | |||
| m_durationFail = durationFail; | |||
| } | |||
| /** | |||
| * @param loops the number of times the file should be played when the build | |||
| * is successful | |||
| * @param duration the number of milliseconds the file should be played when | |||
| * the build is successful | |||
| * @param file The feature to be added to the BuildSuccessfulSound attribute | |||
| */ | |||
| public void addBuildSuccessfulSound( File file, int loops, Long duration ) | |||
| { | |||
| m_fileSuccess = file; | |||
| m_loopsSuccess = loops; | |||
| m_durationSuccess = duration; | |||
| } | |||
| /** | |||
| * This is implemented to listen for any line events and closes the clip if | |||
| * required. | |||
| */ | |||
| public void update( LineEvent event ) | |||
| { | |||
| if( event.getType().equals( LineEvent.Type.STOP ) ) | |||
| { | |||
| Line line = event.getLine(); | |||
| line.close(); | |||
| } | |||
| else if( event.getType().equals( LineEvent.Type.CLOSE ) ) | |||
| { | |||
| /* | |||
| * There is a bug in JavaSound 0.90 (jdk1.3beta). | |||
| * It prevents correct termination of the VM. | |||
| * So we have to exit ourselves. | |||
| */ | |||
| //System.exit(0); | |||
| } | |||
| } | |||
| protected void success() | |||
| { | |||
| if( null != m_fileSuccess ) | |||
| { | |||
| // build successfull! | |||
| play( m_fileSuccess, m_loopsSuccess, m_durationSuccess ); | |||
| } | |||
| } | |||
| protected void failure() | |||
| { | |||
| if( null != m_fileFail ) | |||
| { | |||
| play( m_fileFail, m_loopsFail, m_durationFail ); | |||
| } | |||
| } | |||
| /** | |||
| * Plays the file for duration milliseconds or loops. | |||
| */ | |||
| private void play( File file, int loops, Long duration ) | |||
| { | |||
| Clip audioClip = null; | |||
| AudioInputStream audioInputStream = null; | |||
| try | |||
| { | |||
| audioInputStream = AudioSystem.getAudioInputStream( file ); | |||
| } | |||
| catch( UnsupportedAudioFileException uafe ) | |||
| { | |||
| final String message = "Audio format is not yet supported: " + uafe.getMessage(); | |||
| getLogger().info( message ); | |||
| } | |||
| catch( IOException ioe ) | |||
| { | |||
| ioe.printStackTrace(); | |||
| } | |||
| if( audioInputStream != null ) | |||
| { | |||
| AudioFormat format = audioInputStream.getFormat(); | |||
| DataLine.Info info = new DataLine.Info( Clip.class, format, | |||
| AudioSystem.NOT_SPECIFIED ); | |||
| try | |||
| { | |||
| audioClip = (Clip)AudioSystem.getLine( info ); | |||
| audioClip.addLineListener( this ); | |||
| audioClip.open( audioInputStream ); | |||
| } | |||
| catch( LineUnavailableException e ) | |||
| { | |||
| final String message = "The sound device is currently unavailable"; | |||
| getLogger().info( message ); | |||
| return; | |||
| } | |||
| catch( IOException e ) | |||
| { | |||
| e.printStackTrace(); | |||
| } | |||
| if( duration != null ) | |||
| { | |||
| playClip( audioClip, duration.longValue() ); | |||
| } | |||
| else | |||
| { | |||
| playClip( audioClip, loops ); | |||
| } | |||
| audioClip.drain(); | |||
| audioClip.close(); | |||
| } | |||
| else | |||
| { | |||
| final String message = "Can't get data from file " + file.getName(); | |||
| getLogger().info( message ); | |||
| } | |||
| } | |||
| private void playClip( Clip clip, int loops ) | |||
| { | |||
| clip.loop( loops ); | |||
| while( clip.isRunning() ) | |||
| { | |||
| } | |||
| } | |||
| private void playClip( Clip clip, long duration ) | |||
| { | |||
| clip.loop( Clip.LOOP_CONTINUOUSLY ); | |||
| try | |||
| { | |||
| Thread.sleep( duration ); | |||
| } | |||
| catch( InterruptedException e ) | |||
| { | |||
| } | |||
| } | |||
| } | |||
| @@ -1,81 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.sound; | |||
| import java.io.File; | |||
| /** | |||
| * A class to be extended by any BuildAlert's that require the output of | |||
| * sound. | |||
| */ | |||
| public class BuildAlert | |||
| { | |||
| private File m_source; | |||
| private int m_loops; | |||
| private Long m_duration; | |||
| /** | |||
| * Sets the duration in milliseconds the file should be played. | |||
| * | |||
| * @param duration The new Duration value | |||
| */ | |||
| public void setDuration( Long duration ) | |||
| { | |||
| m_duration = duration; | |||
| } | |||
| /** | |||
| * Sets the number of times the source file should be played. | |||
| * | |||
| * @param loops the number of loops to play the source file | |||
| */ | |||
| public void setLoops( int loops ) | |||
| { | |||
| m_loops = loops; | |||
| } | |||
| /** | |||
| * Sets the location of the file to get the audio. | |||
| * | |||
| * @param source the name of a sound-file directory or of the audio file | |||
| */ | |||
| public void setSource( final File source ) | |||
| { | |||
| m_source = source; | |||
| } | |||
| /** | |||
| * Gets the duration in milliseconds the file should be played. | |||
| * | |||
| * @return The Duration value | |||
| */ | |||
| public Long getDuration() | |||
| { | |||
| return m_duration; | |||
| } | |||
| /** | |||
| * Sets the number of times the source file should be played. | |||
| * | |||
| * @return the number of loops to play the source file | |||
| */ | |||
| public int getLoops() | |||
| { | |||
| return m_loops; | |||
| } | |||
| /** | |||
| * Gets the location of the file to get the audio. | |||
| * | |||
| * @return The Source value | |||
| */ | |||
| public File getSource() | |||
| { | |||
| return m_source; | |||
| } | |||
| } | |||
| @@ -1,4 +0,0 @@ | |||
| sound.missing-success.error=No nested success element found. | |||
| sound.missing-failure.error=No nested failure element found. | |||
| sound.empty.dir.error=No files found in directory {0}. | |||
| sound.invalid-path.error={0}: invalid path. | |||
| @@ -1,134 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.sound; | |||
| import java.io.File; | |||
| import java.util.ArrayList; | |||
| import java.util.Random; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.interfaces.workspace.Workspace; | |||
| /** | |||
| * This is an example of an AntTask that makes of use of the AntSoundPlayer. | |||
| * There are three attributes to be set: <code>source</code>: the location of | |||
| * the audio file to be played <code>duration</code>: play the sound file | |||
| * continuously until "duration" milliseconds has expired <code>loops</code>: | |||
| * the number of times the sound file should be played until stopped I have only | |||
| * tested this with .WAV and .AIFF sound file formats. Both seem to work fine. | |||
| * plans for the future: - use the midi api to define sounds (or drum beat etc) | |||
| * in xml and have Ant play them back | |||
| * | |||
| * @ant.task name="sound-listener" | |||
| * @author Nick Pellow | |||
| * @author <a href="mailto:peter@apache.org">Peter Donald</a> | |||
| * @version $Revision$, $Date$ | |||
| */ | |||
| public class SoundTask | |||
| extends AbstractTask | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( SoundTask.class ); | |||
| private BuildAlert m_success; | |||
| private BuildAlert m_fail; | |||
| public void addFail( final BuildAlert fail ) | |||
| { | |||
| m_fail = fail; | |||
| } | |||
| public void addSuccess( final BuildAlert success ) | |||
| { | |||
| m_success = success; | |||
| } | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| final AntSoundPlayer soundPlayer = new AntSoundPlayer(); | |||
| if( null == m_success ) | |||
| { | |||
| final String message = REZ.getString( "sound.missing-success.error" ); | |||
| getContext().warn( message ); | |||
| } | |||
| else | |||
| { | |||
| final File source = getRandomSource( m_success ); | |||
| soundPlayer.addBuildSuccessfulSound( source, | |||
| m_success.getLoops(), | |||
| m_success.getDuration() ); | |||
| } | |||
| if( null == m_fail ) | |||
| { | |||
| final String message = REZ.getString( "sound.missing-failure.error" ); | |||
| getContext().warn( message ); | |||
| } | |||
| else | |||
| { | |||
| final File source = getRandomSource( m_fail ); | |||
| soundPlayer.addBuildFailedSound( source, | |||
| m_fail.getLoops(), | |||
| m_fail.getDuration() ); | |||
| } | |||
| final Workspace workspace = (Workspace)getContext().getService( Workspace.class ); | |||
| workspace.addProjectListener( soundPlayer ); | |||
| } | |||
| /** | |||
| * Gets the location of the file to get the audio. | |||
| */ | |||
| private File getRandomSource( final BuildAlert alert ) | |||
| throws TaskException | |||
| { | |||
| final File source = alert.getSource(); | |||
| // Check if source is a directory | |||
| if( source.exists() ) | |||
| { | |||
| if( source.isDirectory() ) | |||
| { | |||
| // get the list of files in the dir | |||
| final String[] entries = source.list(); | |||
| final ArrayList files = new ArrayList(); | |||
| for( int i = 0; i < entries.length; i++ ) | |||
| { | |||
| final File file = new File( source, entries[ i ] ); | |||
| if( file.isFile() ) | |||
| { | |||
| files.add( file ); | |||
| } | |||
| } | |||
| if( files.size() < 1 ) | |||
| { | |||
| final String message = REZ.getString( "sound.empty.dir.error", source ); | |||
| throw new TaskException( message ); | |||
| } | |||
| final int numfiles = files.size(); | |||
| // get a random number between 0 and the number of files | |||
| final Random random = new Random(); | |||
| final int x = random.nextInt( numfiles ); | |||
| // set the source to the file at that location | |||
| return (File)files.get( x ); | |||
| } | |||
| else | |||
| { | |||
| return null; | |||
| } | |||
| } | |||
| else | |||
| { | |||
| final String message = REZ.getString( "sound.invalid-path.error", source ); | |||
| getContext().warn( message ); | |||
| return null; | |||
| } | |||
| } | |||
| } | |||
| @@ -1,156 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile; | |||
| import java.util.ArrayList; | |||
| import java.util.Iterator; | |||
| import org.apache.aut.vfs.FileObject; | |||
| import org.apache.aut.vfs.FileSystemException; | |||
| import org.apache.aut.vfs.FileType; | |||
| import org.apache.aut.vfs.NameScope; | |||
| import org.apache.aut.vfs.FileConstants; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * A task that copies files. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * | |||
| * @ant.task name="v-copy" | |||
| */ | |||
| public class CopyFilesTask | |||
| extends AbstractTask | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( CopyFilesTask.class ); | |||
| private FileObject m_srcFile; | |||
| private FileObject m_destFile; | |||
| private FileObject m_destDir; | |||
| private ArrayList m_fileSets = new ArrayList(); | |||
| /** | |||
| * Sets the source file. | |||
| */ | |||
| public void setSrcfile( final FileObject file ) | |||
| { | |||
| m_srcFile = file; | |||
| } | |||
| /** | |||
| * Sets the destination file. | |||
| */ | |||
| public void setDestfile( final FileObject file ) | |||
| { | |||
| m_destFile = file; | |||
| } | |||
| /** | |||
| * Sets the destination directory. | |||
| */ | |||
| public void setDestdir( final FileObject file ) | |||
| { | |||
| m_destDir = file; | |||
| } | |||
| /** | |||
| * Sets the source directory. | |||
| */ | |||
| public void setSrcdir( final FileObject dir ) | |||
| { | |||
| add( new DefaultFileSet( dir ) ); | |||
| } | |||
| /** | |||
| * Adds a source file set. | |||
| */ | |||
| public void add( final FileSet fileset ) | |||
| { | |||
| m_fileSets.add( fileset ); | |||
| } | |||
| /** | |||
| * Execute task. | |||
| * This method is called to perform actual work associated with task. | |||
| * It is called after Task has been Configured and Initialized and before | |||
| * beig Disposed (If task implements appropriate interfaces). | |||
| * | |||
| * @exception TaskException if an error occurs | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| if( m_srcFile == null && m_fileSets.size() == 0 ) | |||
| { | |||
| final String message = REZ.getString( "copyfilestask.no-source.error", getContext().getName() ); | |||
| throw new TaskException( message ); | |||
| } | |||
| if( m_destFile == null && m_destDir == null ) | |||
| { | |||
| final String message = REZ.getString( "copyfilestask.no-destination.error", getContext().getName() ); | |||
| throw new TaskException( message ); | |||
| } | |||
| if( m_fileSets.size() > 0 && m_destDir == null ) | |||
| { | |||
| final String message = REZ.getString( "copyfilestask.no-destination-dir.error", getContext().getName() ); | |||
| throw new TaskException( message ); | |||
| } | |||
| try | |||
| { | |||
| // Copy the source file across | |||
| if( m_srcFile != null ) | |||
| { | |||
| if( m_destFile == null ) | |||
| { | |||
| m_destFile = m_destDir.resolveFile( m_srcFile.getName().getBaseName() ); | |||
| } | |||
| getContext().verbose( "copy " + m_srcFile + " to " + m_destFile ); | |||
| m_destFile.copyFrom( m_srcFile, FileConstants.SELECT_SELF ); | |||
| } | |||
| // Copy the contents of the filesets across | |||
| for( Iterator iterator = m_fileSets.iterator(); iterator.hasNext(); ) | |||
| { | |||
| FileSet fileset = (FileSet)iterator.next(); | |||
| FileSetResult result = fileset.getResult( getContext() ); | |||
| final FileObject[] files = result.getFiles(); | |||
| final String[] paths = result.getPaths(); | |||
| for( int i = 0; i < files.length; i++ ) | |||
| { | |||
| final FileObject srcFile = files[ i ]; | |||
| final String path = paths[ i ]; | |||
| // TODO - map destination name | |||
| // TODO - maybe include empty dirs | |||
| if( srcFile.getType() != FileType.FILE ) | |||
| { | |||
| continue; | |||
| } | |||
| // Locate the destination file | |||
| final FileObject destFile = m_destDir.resolveFile( path, NameScope.DESCENDENT ); | |||
| // Copy the file across | |||
| getContext().verbose( "copy " + srcFile + " to " + destFile ); | |||
| destFile.copyFrom( srcFile, FileConstants.SELECT_SELF ); | |||
| } | |||
| } | |||
| } | |||
| catch( FileSystemException e ) | |||
| { | |||
| throw new TaskException( e.getMessage(), e ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,78 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile; | |||
| import java.util.ArrayList; | |||
| import java.util.Iterator; | |||
| import java.util.List; | |||
| import org.apache.aut.vfs.FileObject; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * A compound file list, which is made up of several other file lists. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * | |||
| * @ant.data-type name="v-path" | |||
| * @ant.type type="v-path" name="v-path" | |||
| */ | |||
| public class DefaultFileList implements FileList | |||
| { | |||
| private final List m_elements = new ArrayList(); | |||
| /** | |||
| * Adds a single file to this list. | |||
| */ | |||
| public void addLocation( final FileObject file ) | |||
| { | |||
| final SingletonFileList element = new SingletonFileList(); | |||
| element.setFile( file ); | |||
| m_elements.add( element ); | |||
| } | |||
| /** | |||
| * Adds a path to this list. | |||
| */ | |||
| public void addPath( final String pathStr ) | |||
| { | |||
| final PathFileList path = new PathFileList(); | |||
| path.setPath( pathStr ); | |||
| m_elements.add( path ); | |||
| } | |||
| /** | |||
| * Adds a file list to this list. | |||
| */ | |||
| public void add( final FileList list ) | |||
| { | |||
| m_elements.add( list ); | |||
| } | |||
| /** | |||
| * Returns the list of files. | |||
| */ | |||
| public FileObject[] listFiles( TaskContext context ) throws TaskException | |||
| { | |||
| // Collect the files from all elements | |||
| final ArrayList allFiles = new ArrayList(); | |||
| for( Iterator iterator = m_elements.iterator(); iterator.hasNext(); ) | |||
| { | |||
| FileList fileList = (FileList)iterator.next(); | |||
| FileObject[] files = fileList.listFiles( context ); | |||
| for( int i = 0; i < files.length; i++ ) | |||
| { | |||
| FileObject file = files[ i ]; | |||
| allFiles.add( file ); | |||
| } | |||
| } | |||
| // Convert to array | |||
| return (FileObject[])allFiles.toArray( new FileObject[ allFiles.size() ] ); | |||
| } | |||
| } | |||
| @@ -1,120 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile; | |||
| import java.util.ArrayList; | |||
| import org.apache.antlib.vfile.selectors.AndFileSelector; | |||
| import org.apache.antlib.vfile.selectors.FileSelector; | |||
| import org.apache.aut.vfs.FileObject; | |||
| import org.apache.aut.vfs.FileSystemException; | |||
| import org.apache.aut.vfs.FileType; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * A file set, that contains those files under a directory that match | |||
| * a set of selectors. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * | |||
| * @ant.data-type name="v-fileset" | |||
| * @ant.type type="v-fileset" name="v-fileset" | |||
| */ | |||
| public class DefaultFileSet | |||
| implements FileSet | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( DefaultFileSet.class ); | |||
| private FileObject m_dir; | |||
| private final AndFileSelector m_selector = new AndFileSelector(); | |||
| public DefaultFileSet() | |||
| { | |||
| } | |||
| public DefaultFileSet( final FileObject dir ) | |||
| { | |||
| m_dir = dir; | |||
| } | |||
| /** | |||
| * Sets the root directory. | |||
| */ | |||
| public void setDir( final FileObject dir ) | |||
| { | |||
| m_dir = dir; | |||
| } | |||
| /** | |||
| * Adds a selector. | |||
| */ | |||
| public void add( final FileSelector selector ) | |||
| { | |||
| m_selector.add( selector ); | |||
| } | |||
| /** | |||
| * Returns the contents of the set. | |||
| */ | |||
| public FileSetResult getResult( final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| if( m_dir == null ) | |||
| { | |||
| final String message = REZ.getString( "fileset.dir-not-set.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| try | |||
| { | |||
| final DefaultFileSetResult result = new DefaultFileSetResult(); | |||
| final ArrayList stack = new ArrayList(); | |||
| final ArrayList pathStack = new ArrayList(); | |||
| stack.add( m_dir ); | |||
| pathStack.add( "" ); | |||
| while( stack.size() > 0 ) | |||
| { | |||
| // Pop next folder off the stack | |||
| FileObject folder = (FileObject)stack.remove( 0 ); | |||
| String path = (String)pathStack.remove( 0 ); | |||
| // Queue the children of the folder | |||
| FileObject[] children = folder.getChildren(); | |||
| for( int i = 0; i < children.length; i++ ) | |||
| { | |||
| FileObject child = children[ i ]; | |||
| String childPath = path + child.getName().getBaseName(); | |||
| // Check whether to include the file in the result | |||
| if( m_selector.accept( child, childPath, context ) ) | |||
| { | |||
| result.addElement( child, childPath ); | |||
| } | |||
| if( child.getType() == FileType.FOLDER ) | |||
| { | |||
| // A folder - push it on to the stack | |||
| stack.add( 0, child ); | |||
| pathStack.add( 0, childPath + '/' ); | |||
| } | |||
| } | |||
| } | |||
| return result; | |||
| } | |||
| catch( FileSystemException e ) | |||
| { | |||
| final String message = REZ.getString( "fileset.list-files.error", m_dir ); | |||
| throw new TaskException( message, e ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,50 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile; | |||
| import java.util.ArrayList; | |||
| import java.util.List; | |||
| import org.apache.aut.vfs.FileObject; | |||
| /** | |||
| * An implementation of a file set result. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| */ | |||
| public class DefaultFileSetResult | |||
| implements FileSetResult | |||
| { | |||
| private List m_files = new ArrayList(); | |||
| private List m_paths = new ArrayList(); | |||
| /** | |||
| * Adds an element to the result. | |||
| */ | |||
| public void addElement( final FileObject file, | |||
| final String path ) | |||
| { | |||
| m_files.add( file ); | |||
| m_paths.add( path ); | |||
| } | |||
| /** | |||
| * Returns the files in the result. | |||
| */ | |||
| public FileObject[] getFiles() | |||
| { | |||
| return (FileObject[])m_files.toArray( new FileObject[ m_files.size() ] ); | |||
| } | |||
| /** | |||
| * Returns the virtual paths of the files. | |||
| */ | |||
| public String[] getPaths() | |||
| { | |||
| return (String[])m_paths.toArray( new String[ m_paths.size() ] ); | |||
| } | |||
| } | |||
| @@ -1,35 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile; | |||
| import org.apache.aut.vfs.FileObject; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.DataType; | |||
| /** | |||
| * An ordered list of files. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * | |||
| * @ant:role shorthand="v-path" | |||
| */ | |||
| public interface FileList | |||
| extends DataType | |||
| { | |||
| /** | |||
| * Returns the files in the list. | |||
| * | |||
| * @param context | |||
| * The context to use to build the list of files. | |||
| * | |||
| * @throws TaskException | |||
| * On error building the list of files. | |||
| */ | |||
| FileObject[] listFiles( TaskContext context ) throws TaskException; | |||
| } | |||
| @@ -1,36 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.DataType; | |||
| /** | |||
| * A set of files, where each file in the list has a virtual path associated | |||
| * with it. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * | |||
| * @ant:role shorthand="v-fileset" | |||
| */ | |||
| public interface FileSet | |||
| extends DataType | |||
| { | |||
| /** | |||
| * Returns the contents of the set. | |||
| * | |||
| * @param context | |||
| * The context to use to build the set. | |||
| * | |||
| * @throws TaskException | |||
| * On error building the set. | |||
| */ | |||
| FileSetResult getResult( TaskContext context ) | |||
| throws TaskException; | |||
| } | |||
| @@ -1,39 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile; | |||
| import org.apache.aut.vfs.FileObject; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * An adaptor from a {@link FileSet} to a {@link FileList}. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public class FileSetAdaptor | |||
| implements FileList | |||
| { | |||
| private final FileSet m_fileset; | |||
| public FileSetAdaptor( final FileSet fileset ) | |||
| { | |||
| m_fileset = fileset; | |||
| } | |||
| /** | |||
| * Returns the files in the list. | |||
| */ | |||
| public FileObject[] listFiles( TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| final FileSetResult result = m_fileset.getResult( context ); | |||
| return result.getFiles(); | |||
| } | |||
| } | |||
| @@ -1,28 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile; | |||
| import org.apache.aut.vfs.FileObject; | |||
| /** | |||
| * The contents of a {@link FileSet}. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| */ | |||
| public interface FileSetResult | |||
| { | |||
| /** | |||
| * Returns the files in the result. | |||
| */ | |||
| FileObject[] getFiles(); | |||
| /** | |||
| * Returns the virtual paths of the files. | |||
| */ | |||
| String[] getPaths(); | |||
| } | |||
| @@ -1,39 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile; | |||
| import org.apache.aut.converter.AbstractConverter; | |||
| import org.apache.aut.converter.ConverterException; | |||
| /** | |||
| * A converter from {@link FileSet} to {@link FileList}. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.converter source="org.apache.antlib.vfile.FileSet" | |||
| * destination="org.apache.antlib.vfile.FileList" | |||
| */ | |||
| public class FileSetToFileListConverter | |||
| extends AbstractConverter | |||
| { | |||
| public FileSetToFileListConverter() | |||
| { | |||
| super( FileSet.class, FileList.class ); | |||
| } | |||
| /** | |||
| * Do the conversion. | |||
| */ | |||
| protected Object convert( final Object original, final Object context ) | |||
| throws ConverterException | |||
| { | |||
| final FileSet src = (FileSet)original; | |||
| return new FileSetAdaptor( src ); | |||
| } | |||
| } | |||
| @@ -1,73 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile; | |||
| import java.util.ArrayList; | |||
| import org.apache.antlib.vfile.selectors.AndFileSelector; | |||
| import org.apache.antlib.vfile.selectors.FileSelector; | |||
| import org.apache.aut.vfs.FileObject; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * A file-list which filters another. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.data-type name="filtered-path" | |||
| * @ant.type type="v-path" name="filtered-path" | |||
| */ | |||
| public class FilteredFileList | |||
| implements FileList | |||
| { | |||
| private DefaultFileList m_fileList = new DefaultFileList(); | |||
| private FileSelector m_selector; | |||
| /** | |||
| * Sets the selector to use to filter with. | |||
| */ | |||
| public void setFilter( final AndFileSelector selector ) | |||
| { | |||
| m_selector = selector; | |||
| } | |||
| /** | |||
| * Sets the filelist to filter. | |||
| */ | |||
| public void add( final FileList fileList ) | |||
| { | |||
| m_fileList.add( fileList ); | |||
| } | |||
| /** | |||
| * Returns the files in the list. | |||
| */ | |||
| public FileObject[] listFiles( final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| if( m_selector == null ) | |||
| { | |||
| throw new TaskException( "filteredfilelist.no-selector.error" ); | |||
| } | |||
| // Build the set of files | |||
| final ArrayList acceptedFiles = new ArrayList(); | |||
| final FileObject[] files = m_fileList.listFiles( context ); | |||
| for( int i = 0; i < files.length; i++ ) | |||
| { | |||
| final FileObject file = files[ i ]; | |||
| if( m_selector.accept( file, null, context ) ) | |||
| { | |||
| acceptedFiles.add( file ); | |||
| } | |||
| } | |||
| return (FileObject[])acceptedFiles.toArray( new FileObject[ acceptedFiles.size() ] ); | |||
| } | |||
| } | |||
| @@ -1,54 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile; | |||
| import org.apache.aut.vfs.FileObject; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * A file set that flattens its contents into a single directory. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.data-type name="flat-fileset" | |||
| * @ant.type type="v-fileset" name="flat-fileset" | |||
| */ | |||
| public class FlatFileSet | |||
| implements FileSet | |||
| { | |||
| private DefaultFileList m_files = new DefaultFileList(); | |||
| /** | |||
| * Adds a file list to this set. | |||
| */ | |||
| public void add( final FileList files ) | |||
| { | |||
| m_files.add( files ); | |||
| } | |||
| /** | |||
| * Returns the contents of the set. | |||
| */ | |||
| public FileSetResult getResult( final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| DefaultFileSetResult result = new DefaultFileSetResult(); | |||
| FileObject[] files = m_files.listFiles( context ); | |||
| for( int i = 0; i < files.length; i++ ) | |||
| { | |||
| final FileObject file = files[ i ]; | |||
| // TODO - detect collisions | |||
| result.addElement( file, file.getName().getBaseName() ); | |||
| } | |||
| return result; | |||
| } | |||
| } | |||
| @@ -1,54 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile; | |||
| import java.util.ArrayList; | |||
| import org.apache.aut.vfs.FileObject; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * A debug task, that lists the contents of a {@link FileSet}. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.task name="v-list-fileset" | |||
| */ | |||
| public class ListFileSetTask | |||
| extends AbstractTask | |||
| { | |||
| private final ArrayList m_fileSets = new ArrayList(); | |||
| public void add( final FileSet fileSet ) | |||
| { | |||
| m_fileSets.add( fileSet ); | |||
| } | |||
| /** | |||
| * Execute task. | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| final int count = m_fileSets.size(); | |||
| for( int i = 0; i < count; i++ ) | |||
| { | |||
| final FileSet fileSet = (FileSet)m_fileSets.get(i ); | |||
| FileSetResult result = fileSet.getResult( getContext() ); | |||
| final FileObject[] files = result.getFiles(); | |||
| final String[] paths = result.getPaths(); | |||
| for( int j = 0; j < files.length; j++ ) | |||
| { | |||
| final FileObject file = files[ j ]; | |||
| final String path = paths[ j ]; | |||
| getContext().info( path + " = " + file ); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -1,47 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile; | |||
| import org.apache.aut.vfs.FileObject; | |||
| import org.apache.myrmidon.api.AbstractTask; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * A debug task, which prints out the files in a file list. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.task name="v-list-path" | |||
| */ | |||
| public class ListFilesTask | |||
| extends AbstractTask | |||
| { | |||
| private final DefaultFileList m_files = new DefaultFileList(); | |||
| public void add( final FileList files ) | |||
| { | |||
| m_files.add( files ); | |||
| } | |||
| /** | |||
| * Execute task. | |||
| * | |||
| * @exception TaskException if an error occurs | |||
| */ | |||
| public void execute() | |||
| throws TaskException | |||
| { | |||
| final FileObject[] files = m_files.listFiles( getContext() ); | |||
| for( int i = 0; i < files.length; i++ ) | |||
| { | |||
| FileObject file = files[ i ]; | |||
| getContext().info( file.toString() ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,95 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile; | |||
| import java.util.ArrayList; | |||
| import org.apache.aut.vfs.FileObject; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.ChainFileNameMapper; | |||
| /** | |||
| * A fileset that maps another fileset. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.data-type name="mapped-fileset" | |||
| */ | |||
| public class MappedFileSet | |||
| implements FileSet | |||
| { | |||
| private final ArrayList m_filesets = new ArrayList(); | |||
| private ChainFileNameMapper m_mapper = new ChainFileNameMapper(); | |||
| /** | |||
| * Sets the mapper to use. | |||
| */ | |||
| public void setMapper( final ChainFileNameMapper mapper ) | |||
| { | |||
| m_mapper.add( mapper ); | |||
| } | |||
| /** | |||
| * Sets the fileset to map. | |||
| */ | |||
| public void add( final FileSet fileset ) | |||
| { | |||
| m_filesets.add( fileset ); | |||
| } | |||
| /** | |||
| * Returns the contents of the set. | |||
| */ | |||
| public FileSetResult getResult( final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| final DefaultFileSetResult result = new DefaultFileSetResult(); | |||
| // Map each source fileset. | |||
| final int count = m_filesets.size(); | |||
| for( int i = 0; i < count; i++ ) | |||
| { | |||
| final FileSet fileSet = (FileSet)m_filesets.get(i ); | |||
| mapFileSet( fileSet, result, context ); | |||
| } | |||
| return result; | |||
| } | |||
| /** | |||
| * Maps the contents of a fileset. | |||
| */ | |||
| private void mapFileSet( final FileSet fileset, | |||
| final DefaultFileSetResult result, | |||
| final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| // Build the result from the nested fileset | |||
| FileSetResult origResult = fileset.getResult( context ); | |||
| final FileObject[] files = origResult.getFiles(); | |||
| final String[] paths = origResult.getPaths(); | |||
| // Map each element of the result | |||
| for( int i = 0; i < files.length; i++ ) | |||
| { | |||
| final FileObject file = files[ i ]; | |||
| final String path = paths[ i ]; | |||
| String[] newPaths = m_mapper.mapFileName( path, context ); | |||
| if( newPaths == null ) | |||
| { | |||
| continue; | |||
| } | |||
| for( int j = 0; j < newPaths.length; j++ ) | |||
| { | |||
| String newPath = newPaths[j ]; | |||
| result.addElement( file, newPath ); | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -1,61 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile; | |||
| import org.apache.aut.vfs.FileObject; | |||
| import org.apache.aut.vfs.FileSystemException; | |||
| import org.apache.aut.vfs.FileSystemManager; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.tools.todo.util.FileUtils; | |||
| /** | |||
| * A path made up of file names separated by ; and : characters. Similar to | |||
| * a CLASSPATH or PATH environment variable. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| */ | |||
| public class PathFileList implements FileList | |||
| { | |||
| private String m_path; | |||
| /** | |||
| * Sets the path to use for this file list. | |||
| */ | |||
| public void setPath( final String path ) | |||
| { | |||
| m_path = path; | |||
| } | |||
| /** | |||
| * Returns the list of files. | |||
| */ | |||
| public FileObject[] listFiles( final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| FileSystemManager fileSystemManager = (FileSystemManager)context.getService( FileSystemManager.class ); | |||
| // TODO - move parsing to the VFS | |||
| final String[] elements = FileUtils.parsePath( m_path ); | |||
| final FileObject[] result = new FileObject[ elements.length ]; | |||
| for( int i = 0; i < elements.length; i++ ) | |||
| { | |||
| String element = elements[ i ]; | |||
| try | |||
| { | |||
| result[ i ] = fileSystemManager.resolveFile( context.getBaseDirectory(), element ); | |||
| } | |||
| catch( FileSystemException e ) | |||
| { | |||
| throw new TaskException( e.getMessage(), e ); | |||
| } | |||
| } | |||
| return result; | |||
| } | |||
| } | |||
| @@ -1,10 +0,0 @@ | |||
| bad-convert-string-to-file.error=Could not convert URI "{0}" into a file object. | |||
| fileset.dir-not-set.error=Fileset root directory is not set. | |||
| fileset.list-files.error=Could not list the files in folder "{0}". | |||
| copyfilestask.no-source.error=No source files specified for {0} task. | |||
| copyfilestask.no-destination.error=No destination file or directory specified for {0} task. | |||
| copyfilestask.no-destination.error=No destination directory specified for {0} task. | |||
| filteredfilelist.no-selector.error=No filter criteria specified. | |||
| @@ -1,40 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile; | |||
| import org.apache.aut.vfs.FileObject; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * A file list that contains a single file. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * | |||
| */ | |||
| public class SingletonFileList | |||
| implements FileList | |||
| { | |||
| private FileObject m_file; | |||
| /** | |||
| * Sets the file to use for tils file list. | |||
| */ | |||
| public void setFile( final FileObject file ) | |||
| { | |||
| m_file = file; | |||
| } | |||
| /** | |||
| * Returns the list of files. | |||
| */ | |||
| public FileObject[] listFiles( TaskContext context ) throws TaskException | |||
| { | |||
| return new FileObject[]{m_file}; | |||
| } | |||
| } | |||
| @@ -1,58 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile; | |||
| import org.apache.aut.converter.AbstractConverter; | |||
| import org.apache.aut.converter.ConverterException; | |||
| import org.apache.aut.vfs.FileObject; | |||
| import org.apache.aut.vfs.FileSystemManager; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| /** | |||
| * Converts a String to a {@link FileObject} | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @ant.converter source="java.lang.String" destination="org.apache.aut.vfs.FileObject" | |||
| */ | |||
| public class StringToFileObjectConverter | |||
| extends AbstractConverter | |||
| { | |||
| private static final Resources REZ = | |||
| ResourceManager.getPackageResources( StringToFileObjectConverter.class ); | |||
| public StringToFileObjectConverter() | |||
| { | |||
| super( String.class, FileObject.class ); | |||
| } | |||
| /** | |||
| * Converts a String into a FileObject. | |||
| */ | |||
| protected Object convert( final Object original, final Object context ) | |||
| throws ConverterException | |||
| { | |||
| final String uri = (String)original; | |||
| final TaskContext taskContext = (TaskContext)context; | |||
| try | |||
| { | |||
| final FileSystemManager manager = | |||
| (FileSystemManager)taskContext.getService( FileSystemManager.class ); | |||
| // TODO - change TaskContext.getBaseDirectory() to return a FileObject | |||
| return manager.resolveFile( taskContext.getBaseDirectory(), uri ); | |||
| } | |||
| catch( Exception e ) | |||
| { | |||
| final String message = REZ.getString( "bad-convert-string-to-file.error", uri ); | |||
| throw new ConverterException( message, e ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,137 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile.selectors; | |||
| import org.apache.aut.vfs.FileObject; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.oro.text.GlobCompiler; | |||
| import org.apache.oro.text.regex.MalformedPatternException; | |||
| import org.apache.oro.text.regex.Pattern; | |||
| import org.apache.oro.text.regex.Perl5Compiler; | |||
| import org.apache.oro.text.regex.Perl5Matcher; | |||
| /** | |||
| * An abstract file selector that selects files based on name. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| */ | |||
| public abstract class AbstractNameFileSelector | |||
| implements FileSelector | |||
| { | |||
| private static final Resources REZ | |||
| = ResourceManager.getPackageResources( AbstractNameFileSelector.class ); | |||
| private Object m_type; | |||
| private String m_pattern; | |||
| private static final Object TYPE_GLOB = "glob"; | |||
| private static final Object TYPE_REGEXP = "regexp"; | |||
| /** | |||
| * Sets the GLOB pattern to match the name against. | |||
| */ | |||
| public void setPattern( final String pattern ) | |||
| throws TaskException | |||
| { | |||
| setPattern( TYPE_GLOB, pattern ); | |||
| } | |||
| /** | |||
| * Sets the Regexp pattern to match the file basename against. | |||
| */ | |||
| public void setRegexp( final String pattern ) | |||
| throws TaskException | |||
| { | |||
| setPattern( TYPE_REGEXP, pattern ); | |||
| } | |||
| /** | |||
| * Sets the pattern and type to match | |||
| */ | |||
| private void setPattern( final Object type, final String pattern ) | |||
| throws TaskException | |||
| { | |||
| if( m_type != null ) | |||
| { | |||
| final String message = REZ.getString( "nameselector.too-many-patterns.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| m_type = type; | |||
| m_pattern = pattern; | |||
| } | |||
| /** | |||
| * Accepts the file. | |||
| */ | |||
| public boolean accept( final FileObject file, | |||
| final String path, | |||
| final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| if( m_type == null ) | |||
| { | |||
| final String message = REZ.getString( "nameselector.no-pattern.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| // Create the pattern to match against | |||
| final Pattern pattern; | |||
| try | |||
| { | |||
| if( m_type == TYPE_GLOB ) | |||
| { | |||
| pattern = createGlobPattern( m_pattern ); | |||
| } | |||
| else | |||
| { | |||
| pattern = createRegexpPattern( m_pattern ); | |||
| } | |||
| } | |||
| catch( MalformedPatternException e ) | |||
| { | |||
| final String message = REZ.getString( "nameselector.bad-pattern.error", m_pattern ); | |||
| throw new TaskException( message ); | |||
| } | |||
| // Get the name to match against | |||
| final String name = getNameForMatch( path, file ); | |||
| // Compare the name against the pattern | |||
| return new Perl5Matcher().matches( name, pattern ); | |||
| } | |||
| /** | |||
| * Creates a GLOB pattern for matching the name against. | |||
| */ | |||
| protected Pattern createGlobPattern( final String pattern ) | |||
| throws MalformedPatternException | |||
| { | |||
| // TODO - need to implement Ant-style patterns | |||
| return new GlobCompiler().compile( pattern ); | |||
| } | |||
| /** | |||
| * Creates a Regexp pattern for matching the name against. | |||
| */ | |||
| protected Pattern createRegexpPattern( final String pattern ) | |||
| throws MalformedPatternException | |||
| { | |||
| return new Perl5Compiler().compile( pattern ); | |||
| } | |||
| /** | |||
| * Returns the name to match against. | |||
| */ | |||
| protected abstract String getNameForMatch( final String path, | |||
| final FileObject file ) | |||
| throws TaskException; | |||
| } | |||
| @@ -1,56 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile.selectors; | |||
| import java.util.ArrayList; | |||
| import org.apache.aut.vfs.FileObject; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * A file selector that performs an AND of nested selectors. Performs | |||
| * lazy evaluation. Returns true when no nested elements are supplied. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.type type="v-file-selector" name="and" | |||
| */ | |||
| public class AndFileSelector | |||
| implements FileSelector | |||
| { | |||
| private final ArrayList m_selectors = new ArrayList(); | |||
| /** | |||
| * Adds a nested selector. | |||
| */ | |||
| public void add( final FileSelector selector ) | |||
| { | |||
| m_selectors.add( selector ); | |||
| } | |||
| /** | |||
| * Accepts a file. | |||
| */ | |||
| public boolean accept( final FileObject file, | |||
| final String path, | |||
| final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| for( int i = 0; i < m_selectors.size(); i++ ) | |||
| { | |||
| final FileSelector fileSelector = (FileSelector)m_selectors.get( i ); | |||
| if( !fileSelector.accept( file, path, context ) ) | |||
| { | |||
| return false; | |||
| } | |||
| } | |||
| return true; | |||
| } | |||
| } | |||
| @@ -1,31 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile.selectors; | |||
| import org.apache.aut.vfs.FileObject; | |||
| /** | |||
| * A file selector that selects files based on their base-name. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.type type="v-file-selector" name="basename" | |||
| */ | |||
| public class BaseNameFileSelector | |||
| extends AbstractNameFileSelector | |||
| { | |||
| /** | |||
| * Returns the name to match against. | |||
| */ | |||
| protected String getNameForMatch( final String path, | |||
| final FileObject file ) | |||
| { | |||
| return file.getName().getBaseName(); | |||
| } | |||
| } | |||
| @@ -1,47 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile.selectors; | |||
| import org.apache.aut.vfs.FileObject; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.conditions.AndCondition; | |||
| import org.apache.myrmidon.framework.conditions.Condition; | |||
| /** | |||
| * A file selector that evaluates a set of nested {@link Condition} elements. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.type type="v-file-selector" name="condition" | |||
| */ | |||
| public class ConditionSelector | |||
| implements FileSelector | |||
| { | |||
| private AndCondition m_condition = new AndCondition(); | |||
| /** | |||
| * Adds a condition. | |||
| */ | |||
| public void add( final Condition condition ) | |||
| { | |||
| m_condition.add( condition ); | |||
| } | |||
| /** | |||
| * Accepts a file. | |||
| */ | |||
| public boolean accept( final FileObject file, | |||
| final String path, | |||
| final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| return m_condition.evaluate( context ); | |||
| } | |||
| } | |||
| @@ -1,43 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile.selectors; | |||
| import org.apache.aut.vfs.FileObject; | |||
| import org.apache.aut.vfs.FileSystemException; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * A file selector that only selects files that exist. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.type type="v-file-selector" name="exists" | |||
| */ | |||
| public class ExistenceFileSelector | |||
| implements FileSelector | |||
| { | |||
| /** | |||
| * Accepts a file. | |||
| */ | |||
| public boolean accept( final FileObject file, | |||
| final String path, | |||
| final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| try | |||
| { | |||
| return file.exists(); | |||
| } | |||
| catch( FileSystemException e ) | |||
| { | |||
| throw new TaskException( e.getMessage(), e ); | |||
| } | |||
| } | |||
| } | |||
| @@ -1,34 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile.selectors; | |||
| import org.apache.aut.vfs.FileObject; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| /** | |||
| * Accepts files as part of a set. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant:role shorthand="v-file-selector" | |||
| */ | |||
| public interface FileSelector | |||
| { | |||
| /** | |||
| * Accepts a file. | |||
| * | |||
| * @param path The virtual path associated with the file. May be null | |||
| * if such a path is not available. | |||
| * @param file The file to select. | |||
| * @param context The context to perform the selection in. | |||
| */ | |||
| boolean accept( FileObject file, String path, TaskContext context ) | |||
| throws TaskException; | |||
| } | |||
| @@ -1,63 +0,0 @@ | |||
| /* | |||
| * Copyright (C) The Apache Software Foundation. All rights reserved. | |||
| * | |||
| * This software is published under the terms of the Apache Software License | |||
| * version 1.1, a copy of which has been included with this distribution in | |||
| * the LICENSE.txt file. | |||
| */ | |||
| package org.apache.antlib.vfile.selectors; | |||
| import org.apache.aut.vfs.FileObject; | |||
| import org.apache.avalon.excalibur.i18n.ResourceManager; | |||
| import org.apache.avalon.excalibur.i18n.Resources; | |||
| import org.apache.myrmidon.api.TaskContext; | |||
| import org.apache.myrmidon.api.TaskException; | |||
| import org.apache.myrmidon.framework.conditions.Condition; | |||
| /** | |||
| * A condition that applies a set of file selectors to a file. | |||
| * | |||
| * @author <a href="mailto:adammurdoch@apache.org">Adam Murdoch</a> | |||
| * @version $Revision$ $Date$ | |||
| * | |||
| * @ant.type type="condition" name="file-test" | |||
| */ | |||
| public class FileTestCondition | |||
| implements Condition | |||
| { | |||
| private static final Resources REZ | |||
| = ResourceManager.getPackageResources( FileTestCondition.class ); | |||
| private FileObject m_file; | |||
| private AndFileSelector m_selector = new AndFileSelector(); | |||
| /** | |||
| * Sets the file to test. | |||
| */ | |||
| public void setFile( final FileObject file ) | |||
| { | |||
| m_file = file; | |||
| } | |||
| /** | |||
| * Adds a selector. | |||
| */ | |||
| public void add( final FileSelector selector ) | |||
| { | |||
| m_selector.add( selector ); | |||
| } | |||
| /** | |||
| * Evaluates this condition. | |||
| */ | |||
| public boolean evaluate( final TaskContext context ) | |||
| throws TaskException | |||
| { | |||
| if( m_file == null ) | |||
| { | |||
| final String message = REZ.getString( "filetestcondition.no-file.error" ); | |||
| throw new TaskException( message ); | |||
| } | |||
| return m_selector.accept( m_file, null, context ); | |||
| } | |||
| } | |||