donaldp 02/04/14 03:55:09
Added: antlib/src/java/org/apache/antlib/extensions
ExtensionAdapter.java ExtensionSet.java
ExtensionUtil.java ExtraAttribute.java
JarLibDisplayTask.java JarLibManifestTask.java
LibFileSet.java LibraryDisplayer.java
Resources.properties
antlib/src/java/org/apache/antlib/runtime ConverterDef.java
Facility.java Import.java Resources.properties
TypeAvailableCondition.java TypeDef.java
antlib/src/java/org/apache/antlib/build BuildNumber.java
Checksum.java Patch.java Resources.properties
SleepTask.java UpToDateCondition.java
antlib/src/java/org/apache/antlib/core AbstractAntTask.java
AbstractAvailableCondition.java AntCallTask.java
AntParam.java AntTask.java
ClassAvailableCondition.java ConditionTask.java
Equals.java ExtFileNameMapper.java Fail.java
FileTokenSet.java FlatFileNameMapper.java
IfTask.java LoadProperties.java Log.java
PrefixFileNameMapper.java Property.java
PropertyDump.java PropertyLoader.java
PropertyTokenSet.java
ResourceAvailableCondition.java
Resources.properties SingletonTokenSet.java
StringToEnumConverter.java
StringToFileConverter.java TryCatchTask.java
Log:
Some more antlibs.
Revision Changes Path
1.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/extensions/ExtensionAdapter.java
Index: ExtensionAdapter.java
===================================================================
/*
* 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.extensions;
import org.apache.avalon.excalibur.extension.DeweyDecimal;
import org.apache.avalon.excalibur.extension.Extension;
import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources;
import org.apache.myrmidon.api.TaskException;
import org.apache.myrmidon.framework.DataType;
/**
* Simple class that represents an Extension and conforms to Ants
* patterns.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Peter Donald</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:07 $
* @ant.data-type name="extension"
*/
public class ExtensionAdapter
implements DataType
{
private static final Resources REZ =
ResourceManager.getPackageResources( ExtensionAdapter.class );
/**
* The name of the optional package being made available, or required.
*/
private String m_extensionName;
/**
* The version number (dotted decimal notation) of the specification
* to which this optional package conforms.
*/
private DeweyDecimal m_specificationVersion;
/**
* The name of the company or organization that originated the
* specification to which this optional package conforms.
*/
private String m_specificationVendor;
/**
* The unique identifier of the company that produced the optional
* package contained in this JAR file.
*/
private String m_implementationVendorID;
/**
* The name of the company or organization that produced this
* implementation of this optional package.
*/
private String m_implementationVendor;
/**
* The version number (dotted decimal notation) for this implementation
* of the optional package.
*/
private DeweyDecimal m_implementationVersion;
/**
* The URL from which the most recent version of this optional package
* can be obtained if it is not already installed.
*/
private String m_implementationURL;
/**
* Set the name of extension.
*
* @param extensionName the name of extension
*/
public void setExtensionName( final String extensionName )
{
m_extensionName = extensionName;
}
/**
* Set the specificationVersion of extension.
*
* @param specificationVersion the specificationVersion of extension
*/
public void setSpecificationVersion( final String specificationVersion )
{
m_specificationVersion = new DeweyDecimal( specificationVersion );
}
/**
* Set the specificationVendor of extension.
*
* @param specificationVendor the specificationVendor of extension
*/
public void setSpecificationVendor( final String specificationVendor )
{
m_specificationVendor = specificationVendor;
}
/**
* Set the implementationVendorID of extension.
*
* @param implementationVendorID the implementationVendorID of extension
*/
public void setImplementationVendorID( final String
implementationVendorID )
{
m_implementationVendorID = implementationVendorID;
}
/**
* Set the implementationVendor of extension.
*
* @param implementationVendor the implementationVendor of extension
*/
public void setImplementationVendor( final String implementationVendor )
{
m_implementationVendor = implementationVendor;
}
/**
* Set the implementationVersion of extension.
*
* @param implementationVersion the implementationVersion of extension
*/
public void setImplementationVersion( final String implementationVersion )
{
m_implementationVersion = new DeweyDecimal( implementationVersion );
}
/**
* Set the implementationURL of extension.
*
* @param implementationURL the implementationURL of extension
*/
public void setImplementationURL( final String implementationURL )
{
m_implementationURL = implementationURL;
}
/**
* Convert this adpater object into an extension object.
*
* @return the extension object
*/
Extension toExtension()
throws TaskException
{
if( null == m_extensionName )
{
final String message = REZ.getString( "extension.noname.error" );
throw new TaskException( message );
}
String specificationVersion = null;
if( null != m_specificationVersion )
{
specificationVersion = m_specificationVersion.toString();
}
String implementationVersion = null;
if( null != m_implementationVersion )
{
implementationVersion = m_implementationVersion.toString();
}
return new Extension( m_extensionName,
specificationVersion,
m_specificationVendor,
implementationVersion,
m_implementationVendorID,
m_implementationVendor,
m_implementationURL );
}
}
1.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/extensions/ExtensionSet.java
Index: ExtensionSet.java
===================================================================
/*
* 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.extensions;
import java.util.ArrayList;
import org.apache.avalon.excalibur.extension.Extension;
import org.apache.myrmidon.api.TaskException;
import org.apache.myrmidon.framework.DataType;
/**
* The Extension set lists a set of "Optional Packages" /
* "Extensions".
*
* @author <a href="mailto:[EMAIL PROTECTED]">Peter Donald</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:07 $
* @ant.data-type name="extension-set"
*/
public class ExtensionSet
implements DataType
{
/**
* ExtensionAdapter objects representing extensions.
*/
private final ArrayList m_extensions = new ArrayList();
/**
* Filesets specifying all the extensions wanted.
*/
private final ArrayList m_extensionsFilesets = new ArrayList();
/**
* Adds an extension that this library requires.
*
* @param extensionAdapter an extension that this library requires.
*/
public void addExtension( final ExtensionAdapter extensionAdapter )
{
m_extensions.add( extensionAdapter );
}
/**
* Adds a set of files about which extensions data will be extracted.
*
* @param fileSet a set of files about which extensions data will be
extracted.
*/
public void addLibfileset( final LibFileSet fileSet )
{
m_extensionsFilesets.add( fileSet );
}
/**
* Extract a set of Extension objects from the ExtensionSet.
*
* @throws TaskException if an error occurs
*/
public Extension[] toExtensions()
throws TaskException
{
final ArrayList extensions = ExtensionUtil.toExtensions( m_extensions
);
ExtensionUtil.extractExtensions( extensions, m_extensionsFilesets );
return (Extension[])extensions.toArray( new Extension[
extensions.size() ] );
}
}
1.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/extensions/ExtensionUtil.java
Index: ExtensionUtil.java
===================================================================
/*
* 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.extensions;
import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.jar.JarFile;
import org.apache.avalon.excalibur.extension.Extension;
import org.apache.myrmidon.api.TaskException;
import org.apache.tools.todo.types.DirectoryScanner;
import org.apache.tools.todo.types.ScannerUtil;
/**
* A set of useful methods relating to extensions.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Peter Donald</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:07 $
*/
public class ExtensionUtil
{
/**
* Convert a list of extensionAdapter objects to extensions.
*
* @param adapters the list of ExtensionAdapterss to add to convert
* @throws TaskException if an error occurs
*/
static ArrayList toExtensions( final ArrayList adapters )
throws TaskException
{
final ArrayList results = new ArrayList();
final int size = adapters.size();
for( int i = 0; i < size; i++ )
{
final ExtensionAdapter adapter =
(ExtensionAdapter)adapters.get( i );
final Extension extension = adapter.toExtension();
results.add( extension );
}
return results;
}
/**
* Generate a list of extensions from a specified fileset.
*
* @param librarys the list to add extensions to
* @param fileset the filesets containing librarys
* @throws TaskException if an error occurs
*/
static void extractExtensions( final ArrayList librarys,
final ArrayList fileset )
throws TaskException
{
if( !fileset.isEmpty() )
{
final Extension[] extensions = getExtensions( fileset );
for( int i = 0; i < extensions.length; i++ )
{
librarys.add( extensions[ i ] );
}
}
}
/**
* Retrieve extensions from the specified librarys.
*
* @param librarys the filesets for librarys
* @return the extensions contained in librarys
* @throws TaskException if failing to scan librarys
*/
private static Extension[] getExtensions( final ArrayList librarys )
throws TaskException
{
final ArrayList extensions = new ArrayList();
final Iterator iterator = librarys.iterator();
while( iterator.hasNext() )
{
final LibFileSet fileSet = (LibFileSet)iterator.next();
final DirectoryScanner scanner = ScannerUtil.getDirectoryScanner(
fileSet );
final File basedir = scanner.getBasedir();
final String[] files = scanner.getIncludedFiles();
for( int i = 0; i < files.length; i++ )
{
final File file = new File( basedir, files[ i ] );
loadExtensions( file, extensions );
}
}
return (Extension[])extensions.toArray( new Extension[
extensions.size() ] );
}
/**
* Load list of available extensions from specified file.
*
* @param file the file
* @param extensions the list to add available extensions to
* @throws TaskException if there is an error
*/
private static void loadExtensions( final File file,
final ArrayList extensions )
throws TaskException
{
try
{
final JarFile jarFile = new JarFile( file );
final Extension[] extension =
Extension.getAvailable( jarFile.getManifest() );
for( int i = 0; i < extension.length; i++ )
{
extensions.add( extension[ i ] );
}
}
catch( final Exception e )
{
throw new TaskException( e.getMessage(), e );
}
}
}
1.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/extensions/ExtraAttribute.java
Index: ExtraAttribute.java
===================================================================
/*
* 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.extensions;
import org.apache.avalon.excalibur.i18n.ResourceManager;
import org.apache.avalon.excalibur.i18n.Resources;
import org.apache.myrmidon.api.TaskException;
/**
* Simple holder for extra attributes in main section of manifest.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Peter Donald</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:07 $
* @todo Refactor this and all the other parameter, sysproperty,
* property etc into a single class in framework
*/
public class ExtraAttribute
{
private static final Resources REZ =
ResourceManager.getPackageResources( ExtraAttribute.class );
private String m_name;
private String 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 String value )
{
m_value = value;
}
/**
* Retrieve name of parameter.
*
* @return the name of parameter.
*/
String getName()
{
return m_name;
}
/**
* Retrieve the value of parameter.
*
* @return the value of parameter.
*/
String 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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/extensions/JarLibDisplayTask.java
Index: JarLibDisplayTask.java
===================================================================
/*
* 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.extensions;
import java.io.File;
import java.util.Iterator;
import java.util.Vector;
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;
/**
* Display the "Optional Package" and "Package Specification" information
* contained within the specified jars.
*
* <p>Prior to JDK1.3, an "Optional Package" was known as an Extension.
* The specification for this mechanism is available in the JDK1.3
* documentation in the directory
* $JDK_HOME/docs/guide/extensions/versioning.html. Alternatively it is
* available online at <a
href="http://java.sun.com/j2se/1.3/docs/guide/extensions/versioning.html">
* http://java.sun.com/j2se/1.3/docs/guide/extensions/versioning.html</a>.</p>
*
* @author <a href="mailto:[EMAIL PROTECTED]">Peter Donald</a>
* @ant.task name="jarlib-display"
*/
public class JarLibDisplayTask
extends AbstractTask
{
private final static Resources REZ =
ResourceManager.getPackageResources( JarLibDisplayTask.class );
/**
* The library to display information about.
*/
private File m_file;
/**
* Filesets specifying all the librarys
* to display information about.
*/
private final Vector m_filesets = new Vector();
/**
* The jar library to display information for.
*
* @param file The jar library to display information for.
*/
public void setFile( final File file )
{
m_file = file;
}
/**
* Adds a set of files about which library data will be displayed.
*
* @param fileSet a set of files about which library data will be
displayed.
*/
public void addFileset( final FileSet fileSet )
{
m_filesets.addElement( fileSet );
}
public void execute()
throws TaskException
{
validate();
final LibraryDisplayer displayer = new LibraryDisplayer();
// Check if list of files to check has been specified
if( !m_filesets.isEmpty() )
{
final Iterator iterator = m_filesets.iterator();
while( iterator.hasNext() )
{
final FileSet fileSet = (FileSet)iterator.next();
final DirectoryScanner scanner =
ScannerUtil.getDirectoryScanner( fileSet );
final File basedir = scanner.getBasedir();
final String[] files = scanner.getIncludedFiles();
for( int i = 0; i < files.length; i++ )
{
final File file = new File( basedir, files[ i ] );
displayer.displayLibrary( file );
}
}
}
else
{
displayer.displayLibrary( m_file );
}
}
/**
* Validate the tasks parameters.
*
* @throws TaskException if invalid parameters found
*/
private void validate()
throws TaskException
{
if( null == m_file && m_filesets.isEmpty() )
{
final String message = REZ.getString(
"extension.missing-file.error" );
throw new TaskException( message );
}
if( null != m_file && !m_file.exists() )
{
final String message = REZ.getString(
"extension.file-noexist.error", m_file );
throw new TaskException( message );
}
if( null != m_file && !m_file.isFile() )
{
final String message = REZ.getString( "extension.bad-file.error",
m_file );
throw new TaskException( message );
}
}
}
1.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/extensions/JarLibManifestTask.java
Index: JarLibManifestTask.java
===================================================================
/*
* 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.extensions;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
import org.apache.avalon.excalibur.extension.Extension;
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.Constants;
import org.apache.myrmidon.api.AbstractTask;
import org.apache.myrmidon.api.TaskException;
/**
* Task to generate a manifest that declares all the dependencies
* in manifest. The dependencies are determined by looking in the
* specified path and searching for Extension / "Optional Package"
* specifications in the manifests of the jars.
*
* <p>Prior to JDK1.3, an "Optional Package" was known as an Extension.
* The specification for this mechanism is available in the JDK1.3
* documentation in the directory
* $JDK_HOME/docs/guide/extensions/versioning.html. Alternatively it is
* available online at <a
href="http://java.sun.com/j2se/1.3/docs/guide/extensions/versioning.html">
* http://java.sun.com/j2se/1.3/docs/guide/extensions/versioning.html</a>.</p>
*
* @author <a href="mailto:[EMAIL PROTECTED]">Peter Donald</a>
* @ant.task name="jarlib-manifest"
*/
public final class JarLibManifestTask
extends AbstractTask
{
private final static Resources REZ =
ResourceManager.getPackageResources( JarLibManifestTask.class );
/**
* Version of manifest spec that task generates.
*/
private static final String MANIFEST_VERSION = "1.0";
/**
* "Created-By" string used when creating manifest.
*/
private static final String CREATED_BY = "Created-By";
/**
* The library to display information about.
*/
private File m_destfile;
/**
* The extension supported by this library (if any).
*/
private Extension m_extension;
/**
* ExtensionAdapter objects representing
* dependencies required by library.
*/
private final ArrayList m_dependencies = new ArrayList();
/**
* ExtensionAdapter objects representing optional
* dependencies required by library.
*/
private final ArrayList m_optionals = new ArrayList();
/**
* Extra attributes the user specifies for main section
* in manifest.
*/
private final ArrayList m_extraAttributes = new ArrayList();
/**
* The location where generated manifest is placed.
*
* @param destfile The location where generated manifest is placed.
*/
public void setDestfile( final File destfile )
{
m_destfile = destfile;
}
/**
* Adds an extension that this library implements.
*
* @param extensionAdapter an extension that this library implements.
*/
public void addExtension( final ExtensionAdapter extensionAdapter )
throws TaskException
{
if( null != m_extension )
{
final String message = REZ.getString(
"manifest.multi-extension.error" );
throw new TaskException( message );
}
else
{
m_extension = extensionAdapter.toExtension();
}
}
/**
* Adds a set of extensions that this library requires.
*
* @param extensionSet a set of extensions that this library requires.
*/
public void addDepends( final ExtensionSet extensionSet )
{
m_dependencies.add( extensionSet );
}
/**
* Adds a set of extensions that this library optionally requires.
*
* @param extensionSet a set of extensions that this library optionally
requires.
*/
public void addOptions( final ExtensionSet extensionSet )
{
m_optionals.add( extensionSet );
}
/**
* Adds an attribute that is to be put in main section of manifest.
*
* @param attribute an attribute that is to be put in main section of
manifest.
*/
public void addAttribute( final ExtraAttribute attribute )
{
m_extraAttributes.add( attribute );
}
public void execute()
throws TaskException
{
validate();
final Manifest manifest = new Manifest();
final Attributes attributes = manifest.getMainAttributes();
attributes.put( Attributes.Name.MANIFEST_VERSION, MANIFEST_VERSION );
attributes.putValue( CREATED_BY, Constants.BUILD_DESCRIPTION );
appendExtraAttributes( attributes );
if( null != m_extension )
{
Extension.addExtension( m_extension, attributes );
}
//Add all the dependency data to manifest for dependencies
final ArrayList depends = toExtensions( m_dependencies );
appendExtensionList( attributes,
Extension.EXTENSION_LIST,
"lib",
depends.size() );
appendLibraryList( attributes, "lib", depends );
//Add all the dependency data to manifest for "optional"
//dependencies
final ArrayList option = toExtensions( m_optionals );
appendExtensionList( attributes,
Extension.OPTIONAL_EXTENSION_LIST,
"opt",
option.size() );
appendLibraryList( attributes, "opt", option );
try
{
final String message =
REZ.getString( "manifest.file.notice",
m_destfile.getAbsoluteFile() );
getContext().info( message );
writeManifest( manifest );
}
catch( final IOException ioe )
{
throw new TaskException( ioe.getMessage(), ioe );
}
}
/**
* Validate the tasks parameters.
*
* @throws TaskException if invalid parameters found
*/
private void validate()
throws TaskException
{
if( null == m_destfile )
{
final String message =
REZ.getString( "manifest.missing-file.error" );
throw new TaskException( message );
}
if( m_destfile.exists() && !m_destfile.isFile() )
{
final String message =
REZ.getString( "manifest.bad-file.error", m_destfile );
throw new TaskException( message );
}
}
/**
* Add any extra attributes to the manifest.
*
* @param attributes the manifest section to write
* attributes to
*/
private void appendExtraAttributes( final Attributes attributes )
{
final Iterator iterator = m_extraAttributes.iterator();
while( iterator.hasNext() )
{
final ExtraAttribute attribute =
(ExtraAttribute)iterator.next();
attributes.putValue( attribute.getName(),
attribute.getValue() );
}
}
/**
* Write out manifest to destfile.
*
* @param manifest the manifest
* @throws IOException if error writing file
*/
private void writeManifest( final Manifest manifest )
throws IOException
{
FileOutputStream output = null;
try
{
output = new FileOutputStream( m_destfile );
manifest.write( output );
output.flush();
}
finally
{
IOUtil.shutdownStream( output );
}
}
/**
* Append specified extensions to specified attributes.
* Use the extensionKey to list the extensions, usually "Extension-List:"
* for required dependencies and "Optional-Extension-List:" for optional
* dependencies. NOTE: "Optional" dependencies are not part of the
* specification.
*
* @param attributes the attributes to add extensions to
* @param extensions the list of extensions
* @throws TaskException if an error occurs
*/
private void appendLibraryList( final Attributes attributes,
final String listPrefix,
final ArrayList extensions )
throws TaskException
{
final int size = extensions.size();
for( int i = 0; i < size; i++ )
{
final Extension extension = (Extension)extensions.get( i );
final String prefix = listPrefix + i + "-";
Extension.addExtension( extension, prefix, attributes );
}
}
/**
* Append an attribute such as "Extension-List: lib0 lib1 lib2"
* using specified prefix and counting up to specified size.
* Also use specified extensionKey so that can generate list of
* optional dependencies aswell.
*
* @param size the number of librarys to list
* @param listPrefix the prefix for all librarys
* @param attributes the attributes to add key-value to
* @param extensionKey the key to use
*/
private void appendExtensionList( final Attributes attributes,
final Attributes.Name extensionKey,
final String listPrefix,
final int size )
{
final StringBuffer sb = new StringBuffer();
for( int i = 0; i < size; i++ )
{
sb.append( listPrefix + i );
sb.append( ' ' );
}
//add in something like
//"Extension-List: javahelp java3d"
attributes.put( extensionKey, sb.toString() );
}
/**
* Convert a list of ExtensionSet objects to extensions.
*
* @param extensionSets the list of ExtensionSets to add to list
* @throws TaskException if an error occurs
*/
private static ArrayList toExtensions( final ArrayList extensionSets )
throws TaskException
{
final ArrayList results = new ArrayList();
final int size = extensionSets.size();
for( int i = 0; i < size; i++ )
{
final ExtensionSet set = (ExtensionSet)extensionSets.get( i );
final Extension[] extensions = set.toExtensions();
for( int j = 0; j < extensions.length; j++ )
{
results.add( extensions[ j ] );
}
}
return results;
}
}
1.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/extensions/LibFileSet.java
Index: LibFileSet.java
===================================================================
/*
* 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.extensions;
import org.apache.myrmidon.framework.FileSet;
/**
* LibFileSet represents a fileset containing libraries.
* Asociated with the libraries is data pertaining to
* how they are to be handled when building manifests.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Peter Donald</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:07 $
*/
public class LibFileSet
extends FileSet
{
/**
* Flag indicating whether should include the
* "Implementation-URL" attribute in manifest.
* Defaults to false.
*/
private boolean m_includeURL;
/**
* Flag indicating whether should include the
* "Implementation-*" attributes in manifest.
* Defaults to false.
*/
private boolean m_includeImpl;
/**
* String that is the base URL for the librarys
* when constructing the "Implementation-URL"
* attribute. For instance setting the base to
* "http://jakarta.apache.org/avalon/libs/" and then
* including the library "excalibur-cli-1.0.jar" in the
* fileset will result in the "Implementation-URL" attribute
* being set to
"http://jakarta.apache.org/avalon/libs/excalibur-cli-1.0.jar"
*
* Note this is only used if the library does not define
* "Implementation-URL" itself.
*
* Note that this also implies includeURL=true
*/
private String m_urlBase;
/**
* Flag indicating whether should include the
* "Implementation-URL" attribute in manifest.
* Defaults to false.
*
* @param includeURL the flag
* @see #m_includeURL
*/
public void setIncludeURL( boolean includeURL )
{
m_includeURL = includeURL;
}
/**
* Flag indicating whether should include the
* "Implementation-*" attributes in manifest.
* Defaults to false.
*
* @param includeImpl the flag
* @see #m_includeImpl
*/
public void setIncludeImpl( boolean includeImpl )
{
m_includeImpl = includeImpl;
}
/**
* Set the url base for fileset.
*
* @param urlBase the base url
* @see #m_urlBase
*/
public void setUrlBase( String urlBase )
{
m_urlBase = urlBase;
}
/**
* Get the includeURL flag.
*
* @return the includeURL flag.
*/
boolean isIncludeURL()
{
return m_includeURL;
}
/**
* Get the includeImpl flag.
*
* @return the includeImpl flag.
*/
boolean isIncludeImpl()
{
return m_includeImpl;
}
/**
* Get the urlbase.
*
* @return the urlbase.
*/
String getUrlBase()
{
return m_urlBase;
}
}
1.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/extensions/LibraryDisplayer.java
Index: LibraryDisplayer.java
===================================================================
/*
* 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.extensions;
import java.io.File;
import java.io.IOException;
import java.text.ParseException;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
import org.apache.avalon.excalibur.extension.Extension;
import org.apache.avalon.excalibur.extension.Specification;
import org.apache.myrmidon.api.TaskException;
/**
* Utility class to output the information in a jar relating
* to "Optional Packages" (formely known as "Extensions")
* and Package Specifications.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Peter Donald</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:07 $
*/
class LibraryDisplayer
{
/**
* Display the extensions and specifications contained
* within specified file.
*
* @param file the file
* @throws TaskException if fail to read file
*/
void displayLibrary( final File file )
throws TaskException
{
final Manifest manifest = getManifest( file );
displayLibrary( file, manifest );
}
/**
* Display the extensions and specifications contained
* within specified file.
*
* @param file the file to use while reporting
* @param manifest the manifest of file
* @throws TaskException if fail to read file
*/
void displayLibrary( final File file,
final Manifest manifest )
throws TaskException
{
final Extension[] available = Extension.getAvailable( manifest );
final Extension[] required = Extension.getRequired( manifest );
final Extension[] options = Extension.getOptions( manifest );
final Specification[] specifications = getSpecifications( manifest );
if( 0 == available.length &&
0 == required.length &&
0 == options.length &&
0 == specifications.length )
{
return;
}
final String message = "File: " + file;
final int size = message.length();
printLine( size );
System.out.println( message );
printLine( size );
if( 0 != available.length )
{
System.out.println( "Extensions Supported By Library:" );
for( int i = 0; i < available.length; i++ )
{
final Extension extension = available[ i ];
System.out.println( extension.toString() );
}
}
if( 0 != required.length )
{
System.out.println( "Extensions Required By Library:" );
for( int i = 0; i < required.length; i++ )
{
final Extension extension = required[ i ];
System.out.println( extension.toString() );
}
}
if( 0 != options.length )
{
System.out.println( "Extensions that will be used by Library if
present:" );
for( int i = 0; i < options.length; i++ )
{
final Extension extension = options[ i ];
System.out.println( extension.toString() );
}
}
if( 0 != specifications.length )
{
System.out.println( "Specifications Supported By Library:" );
for( int i = 0; i < specifications.length; i++ )
{
final Specification specification = specifications[ i ];
displaySpecification( specification );
}
}
}
/**
* Print out a line of '-'s equal to specified size.
*
* @param size the number of dashes to printout
*/
private void printLine( final int size )
{
for( int i = 0; i < size; i++ )
{
System.out.print( "-" );
}
System.out.println();
}
/**
* Get specifications from manifest.
*
* @param manifest the manifest
* @return the specifications or null if none
* @throws TaskException if malformed specification sections
*/
private Specification[] getSpecifications( final Manifest manifest )
throws TaskException
{
try
{
return Specification.getSpecifications( manifest );
}
catch( final ParseException pe )
{
throw new TaskException( pe.getMessage(), pe );
}
}
/**
* Print out specification details.
*
* @param specification the specification
*/
private void displaySpecification( final Specification specification )
{
final String[] sections = specification.getSections();
if( null != sections )
{
final StringBuffer sb = new StringBuffer( "Sections: " );
for( int i = 0; i < sections.length; i++ )
{
sb.append( " " );
sb.append( sections[ i ] );
}
System.out.println( sb );
}
System.out.println( specification.toString() );
}
/**
* retrieve manifest for specified file.
*
* @param file the file
* @return the manifest
* @throws org.apache.myrmidon.api.TaskException if errror occurs (file
not exist,
* file not a jar, manifest not exist in file)
*/
private Manifest getManifest( final File file )
throws TaskException
{
try
{
final JarFile jarFile = new JarFile( file );
return jarFile.getManifest();
}
catch( final IOException ioe )
{
throw new TaskException( ioe.getMessage(), ioe );
}
}
}
1.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/extensions/Resources.properties
Index: Resources.properties
===================================================================
extension.missing-file.error=File attribute not specified.
extension.file-noexist.error=File "{0}" does not exist.
extension.bad-file.error="{0}" is not a file.
manifest.missing-file.error=Destfile attribute not specified.
manifest.bad-file.error="{0}" is not a file.
manifest.file.notice=Generating manifest {0}.
manifest.multi-extension.error=Can not have multiple extensions defined in
one library.
param.noname.error=Missing name from parameter.
param.novalue.error=Missing value from parameter "{0}".
extension.noname.error=Extension is missing name.
1.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/runtime/ConverterDef.java
Index: ConverterDef.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/runtime/Facility.java
Index: Facility.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/runtime/Import.java
Index: Import.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/runtime/Resources.properties
Index: Resources.properties
===================================================================
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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/runtime/TypeAvailableCondition.java
Index: TypeAvailableCondition.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">Adam Murdoch</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:08 $
*
* @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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/runtime/TypeDef.java
Index: TypeDef.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/build/BuildNumber.java
Index: BuildNumber.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">Peter Donald</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:08 $
* @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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/build/Checksum.java
Index: Checksum.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">Magesh Umasankar</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:08 $
*/
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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/build/Patch.java
Index: Patch.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">Stefan Bodewig</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Peter Donald</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:08 $
*/
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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/build/Resources.properties
Index: Resources.properties
===================================================================
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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/build/SleepTask.java
Index: SleepTask.java
===================================================================
/*
* 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 [EMAIL PROTECTED] steve loughran
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:08 $
*/
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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/build/UpToDateCondition.java
Index: UpToDateCondition.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">
* [EMAIL PROTECTED]</a>
* @author Hiroaki Nakamura <a href="mailto:[EMAIL PROTECTED]">
* [EMAIL PROTECTED]</a>
* @author <a href="mailto:[EMAIL PROTECTED]">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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/AbstractAntTask.java
Index: AbstractAntTask.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">Peter Donald</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Darrell DeBoer</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:08 $
*/
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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/AbstractAvailableCondition.java
Index: AbstractAvailableCondition.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">Adam Murdoch</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:08 $
*/
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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/AntCallTask.java
Index: AntCallTask.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">Darrell DeBoer</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:08 $
* @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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/AntParam.java
Index: AntParam.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">Peter Donald</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:08 $
* @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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/AntTask.java
Index: AntTask.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/ClassAvailableCondition.java
Index: ClassAvailableCondition.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">
* [EMAIL PROTECTED]</a>
* @author <a href="mailto:[EMAIL PROTECTED]">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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/ConditionTask.java
Index: ConditionTask.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">Stefan Bodewig</a>
* @version $Revision: 1.1 $
*
* @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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/Equals.java
Index: Equals.java
===================================================================
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:[EMAIL PROTECTED]">Stefan Bodewig</a>
* @version $Revision: 1.1 $
*
* @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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/ExtFileNameMapper.java
Index: ExtFileNameMapper.java
===================================================================
/*
* 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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/Fail.java
Index: Fail.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/FileTokenSet.java
Index: FileTokenSet.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">Adam Murdoch</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:08 $
*
* @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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/FlatFileNameMapper.java
Index: FlatFileNameMapper.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/IfTask.java
Index: IfTask.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">Peter Donald</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:08 $
* @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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/LoadProperties.java
Index: LoadProperties.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/Log.java
Index: Log.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/PrefixFileNameMapper.java
Index: PrefixFileNameMapper.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">Adam Murdoch</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:08 $
*
* @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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/Property.java
Index: Property.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">Peter Donald</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:08 $
* @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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/PropertyDump.java
Index: PropertyDump.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">Peter Donald</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Jim Cook</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:08 $
* @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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/PropertyLoader.java
Index: PropertyLoader.java
===================================================================
/*
* 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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/PropertyTokenSet.java
Index: PropertyTokenSet.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">Adam Murdoch</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:08 $
*
* @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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/ResourceAvailableCondition.java
Index: ResourceAvailableCondition.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">
* [EMAIL PROTECTED]</a>
* @author <a href="mailto:[EMAIL PROTECTED]">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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/Resources.properties
Index: Resources.properties
===================================================================
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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/SingletonTokenSet.java
Index: SingletonTokenSet.java
===================================================================
/*
* 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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/StringToEnumConverter.java
Index: StringToEnumConverter.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/StringToFileConverter.java
Index: StringToFileConverter.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">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.1
jakarta-ant-myrmidon/antlib/src/java/org/apache/antlib/core/TryCatchTask.java
Index: TryCatchTask.java
===================================================================
/*
* 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:[EMAIL PROTECTED]">Peter Donald</a>
* @version $Revision: 1.1 $ $Date: 2002/04/14 10:55:08 $
* @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";
}
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>