diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/types/DataType.java b/proposal/myrmidon/src/main/org/apache/tools/ant/types/DataType.java deleted file mode 100644 index 7b7163ae8..000000000 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/types/DataType.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.ant.types; - -import java.util.Stack; -import org.apache.myrmidon.api.TaskException; -import org.apache.tools.ant.Project; -import org.apache.tools.ant.ProjectComponent; - -/** - * Base class for those classes that can appear inside the build file as stand - * alone data types.

- * - * This class handles the common description attribute and provides a default - * implementation for reference handling and checking for circular references - * that is appropriate for types that can not be nested inside elements of the - * same type (i.e. <patternset> but not <path>).

- * - * @author Stefan Bodewig - */ -public abstract class DataType - extends ProjectComponent -{ - /** - * Value to the refid attribute. - */ - protected Reference ref; - - /** - * Are we sure we don't hold circular references?

- * - * Subclasses are responsible for setting this value to false if we'd need - * to investigate this condition (usually because a child element has been - * added that is a subclass of DataType).

- */ - protected boolean checked = true; - - /** - * Set the value of the refid attribute.

- * - * Subclasses may need to check whether any other attributes have been set - * as well or child elements have been created and thus override this - * method. if they do the must call super.setRefid.

- * - * @param ref The new Refid value - */ - public void setRefid( Reference ref ) - throws TaskException - { - this.ref = ref; - checked = false; - } - - /** - * Has the refid attribute of this element been set? - * - * @return The Reference value - */ - public boolean isReference() - { - return ref != null; - } - - /** - * Performs the check for circular references and returns the referenced - * object. - * - * @param requiredClass Description of Parameter - * @param dataTypeName Description of Parameter - * @return The CheckedRef value - */ - protected Object getCheckedRef( Class requiredClass, String dataTypeName ) - throws TaskException - { - if( !checked ) - { - Stack stk = new Stack(); - stk.push( this ); - dieOnCircularReference( stk, getProject() ); - } - - Object o = ref.getReferencedObject( getProject() ); - if( !( requiredClass.isAssignableFrom( o.getClass() ) ) ) - { - String msg = ref.getRefId() + " doesn\'t denote a " + dataTypeName; - throw new TaskException( msg ); - } - else - { - return o; - } - } - - /** - * Creates an exception that indicates the user has generated a loop of data - * types referencing each other. - * - * @return Description of the Returned Value - */ - protected TaskException circularReference() - { - return new TaskException( "This data type contains a circular reference." ); - } - - /** - * Check to see whether any DataType we hold references to is included in - * the Stack (which holds all DataType instances that directly or indirectly - * reference this instance, including this instance itself).

- * - * If one is included, throw a TaskException created by {@link - * #circularReference circularReference}.

- * - * This implementation is appropriate only for a DataType that cannot hold - * other DataTypes as children.

- * - * The general contract of this method is that it shouldn't do anything if - * {@link #checked checked} is true and set it to true on exit. - *

- * - * @param stk Description of Parameter - * @param p Description of Parameter - * @exception TaskException Description of Exception - */ - protected void dieOnCircularReference( Stack stk, Project p ) - throws TaskException - { - - if( checked || !isReference() ) - { - return; - } - Object o = ref.getReferencedObject( p ); - - if( o instanceof DataType ) - { - if( stk.contains( o ) ) - { - throw circularReference(); - } - else - { - stk.push( o ); - ( (DataType)o ).dieOnCircularReference( stk, p ); - stk.pop(); - } - } - checked = true; - } - - /** - * Creates an exception that indicates that this XML element must not have - * child elements if the refid attribute is set. - * - * @return Description of the Returned Value - */ - protected TaskException noChildrenAllowed() - { - return new TaskException( "You must not specify nested elements when using refid" ); - } - - /** - * Creates an exception that indicates that refid has to be the only - * attribute if it is set. - * - * @return Description of the Returned Value - */ - protected TaskException tooManyAttributes() - { - return new TaskException( "You must not specify more than one attribute" + - " when using refid" ); - } -} diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/types/FileList.java b/proposal/myrmidon/src/main/org/apache/tools/ant/types/FileList.java index 1810ae5b4..0459ea3e8 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/types/FileList.java +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/types/FileList.java @@ -9,10 +9,9 @@ package org.apache.tools.ant.types; import java.io.File; import java.util.ArrayList; -import java.util.Stack; import java.util.StringTokenizer; import org.apache.myrmidon.api.TaskException; -import org.apache.tools.ant.Project; +import org.apache.tools.ant.ProjectComponent; /** * FileList represents an explicitly named list of files. FileLists are useful @@ -23,135 +22,54 @@ import org.apache.tools.ant.Project; * @author Craeg Strong * @version $Revision$ $Date$ */ -public class FileList extends DataType +public class FileList + extends ProjectComponent { - - private ArrayList filenames = new ArrayList(); - private File dir; + private final ArrayList m_filenames = new ArrayList(); + private File m_dir; public FileList() { - super(); - } - - protected FileList( FileList filelist ) - { - this.dir = filelist.dir; - this.filenames = filelist.filenames; } public void setDir( File dir ) - throws TaskException { - if( isReference() ) - { - throw tooManyAttributes(); - } - this.dir = dir; + m_dir = dir; } public void setFiles( String filenames ) - throws TaskException { - if( isReference() ) - { - throw tooManyAttributes(); - } if( filenames != null && filenames.length() > 0 ) { StringTokenizer tok = new StringTokenizer( filenames, ", \t\n\r\f", false ); while( tok.hasMoreTokens() ) { - this.filenames.add( tok.nextToken() ); + m_filenames.add( tok.nextToken() ); } } } - /** - * Makes this instance in effect a reference to another FileList instance. - *

- * - * You must not set another attribute or nest elements inside this element - * if you make it a reference.

- * - * @param r The new Refid value - * @exception TaskException Description of Exception - */ - public void setRefid( Reference r ) - throws TaskException - { - if( ( dir != null ) || ( filenames.size() != 0 ) ) - { - throw tooManyAttributes(); - } - super.setRefid( r ); - } - - public File getDir( Project p ) - throws TaskException + public File getDir() { - if( isReference() ) - { - return getRef( p ).getDir( p ); - } - return dir; + return m_dir; } /** * Returns the list of files represented by this FileList. - * - * @param p Description of Parameter - * @return The Files value */ - public String[] getFiles( Project p ) + public String[] getFiles() throws TaskException { - if( isReference() ) - { - return getRef( p ).getFiles( p ); - } - - if( dir == null ) + if( m_dir == null ) { throw new TaskException( "No directory specified for filelist." ); } - if( filenames.size() == 0 ) + if( m_filenames.size() == 0 ) { throw new TaskException( "No files specified for filelist." ); } - final String result[] = new String[ filenames.size() ]; - return (String[])filenames.toArray( result ); + return (String[])m_filenames.toArray( new String[ m_filenames.size() ] ); } - - /** - * Performs the check for circular references and returns the referenced - * FileList. - * - * @param p Description of Parameter - * @return The Ref value - */ - protected FileList getRef( Project p ) - throws TaskException - { - if( !checked ) - { - Stack stk = new Stack(); - stk.push( this ); - dieOnCircularReference( stk, p ); - } - - Object o = ref.getReferencedObject( p ); - if( !( o instanceof FileList ) ) - { - String msg = ref.getRefId() + " doesn\'t denote a filelist"; - throw new TaskException( msg ); - } - else - { - return (FileList)o; - } - } - -}//-- FileList.java +} diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/types/FileSet.java b/proposal/myrmidon/src/main/org/apache/tools/ant/types/FileSet.java index f73ed3da4..a2714bc84 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/types/FileSet.java +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/types/FileSet.java @@ -12,6 +12,7 @@ import java.util.ArrayList; import org.apache.myrmidon.api.TaskException; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.FileScanner; +import org.apache.tools.ant.ProjectComponent; /** * Moved out of MatchingTask to make it a standalone object that could be @@ -26,7 +27,7 @@ import org.apache.tools.ant.FileScanner; * @author Magesh Umasankar */ public class FileSet - extends DataType + extends ProjectComponent implements Cloneable { private PatternSet m_defaultPatterns = new PatternSet(); diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/types/Filter.java b/proposal/myrmidon/src/main/org/apache/tools/ant/types/Filter.java new file mode 100644 index 000000000..b82949da8 --- /dev/null +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/types/Filter.java @@ -0,0 +1,78 @@ +/* + * 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.tools.ant.types; + +/** + * Individual filter component of filterset + * + * @author Michael McCallum + * @created 14 March 2001 + */ +public class Filter +{ + /** + * 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 Filter( final String token, final String value ) + { + m_token = token; + m_value = value; + } + + /** + * No argument conmstructor + */ + public Filter() + { + } + + /** + * 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; + } + + /** + * Gets the Token attribute of the Filter object + */ + public String getToken() + { + return m_token; + } + + /** + * Gets the Value attribute of the Filter object + */ + public String getValue() + { + return m_value; + } +} diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/types/FilterSet.java b/proposal/myrmidon/src/main/org/apache/tools/ant/types/FilterSet.java index 6cf25aab2..abf5c5b5b 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/types/FilterSet.java +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/types/FilterSet.java @@ -16,6 +16,7 @@ import java.util.Hashtable; import java.util.Iterator; import java.util.Properties; import org.apache.myrmidon.api.TaskException; +import org.apache.tools.ant.ProjectComponent; /** * A set of filters to be applied to something. A filter set may have begintoken @@ -25,7 +26,7 @@ import org.apache.myrmidon.api.TaskException; * @created 14 March 2001 */ public class FilterSet - extends DataType + extends ProjectComponent implements Cloneable { @@ -39,13 +40,13 @@ public class FilterSet */ public final static String DEFAULT_TOKEN_END = "@"; - private String startOfToken = DEFAULT_TOKEN_START; - private String endOfToken = DEFAULT_TOKEN_END; + private String m_startOfToken = DEFAULT_TOKEN_START; + private String m_endOfToken = DEFAULT_TOKEN_END; /** * List of ordered filters and filter files. */ - private ArrayList filters = new ArrayList(); + private ArrayList m_filters = new ArrayList(); public FilterSet() { @@ -60,7 +61,7 @@ public class FilterSet throws TaskException { super(); - this.filters = (ArrayList)filterset.getFilters().clone(); + m_filters = (ArrayList)filterset.getFilters().clone(); } /** @@ -71,15 +72,11 @@ public class FilterSet public void setBeginToken( String startOfToken ) throws TaskException { - if( isReference() ) - { - throw tooManyAttributes(); - } if( startOfToken == null || "".equals( startOfToken ) ) { throw new TaskException( "beginToken must not be empty" ); } - this.startOfToken = startOfToken; + m_startOfToken = startOfToken; } /** @@ -90,15 +87,11 @@ public class FilterSet public void setEndToken( String endOfToken ) throws TaskException { - if( isReference() ) - { - throw tooManyAttributes(); - } if( endOfToken == null || "".equals( endOfToken ) ) { throw new TaskException( "endToken must not be empty" ); } - this.endOfToken = endOfToken; + m_endOfToken = endOfToken; } /** @@ -111,31 +104,17 @@ public class FilterSet public void setFiltersfile( File filtersFile ) throws TaskException { - if( isReference() ) - { - throw tooManyAttributes(); - } readFiltersFromFile( filtersFile ); } public String getBeginToken() - throws TaskException { - if( isReference() ) - { - return getRef().getBeginToken(); - } - return startOfToken; + return m_startOfToken; } public String getEndToken() - throws TaskException { - if( isReference() ) - { - return getRef().getEndToken(); - } - return endOfToken; + return m_endOfToken; } /** @@ -162,13 +141,8 @@ public class FilterSet * @param filter The feature to be added to the Filter attribute */ public void addFilter( Filter filter ) - throws TaskException { - if( isReference() ) - { - throw noChildrenAllowed(); - } - filters.add( filter ); + m_filters.add( filter ); } /** @@ -178,13 +152,8 @@ public class FilterSet * @param value The value for the new filter. */ public void addFilter( String token, String value ) - throws TaskException { - if( isReference() ) - { - throw noChildrenAllowed(); - } - filters.add( new Filter( token, value ) ); + m_filters.add( new Filter( token, value ) ); } /** @@ -193,34 +162,10 @@ public class FilterSet * @param filterSet the filterset to be added to this filterset */ public void addFilterSet( FilterSet filterSet ) - throws TaskException { - if( isReference() ) - { - throw noChildrenAllowed(); - } for( Iterator e = filterSet.getFilters().iterator(); e.hasNext(); ) { - filters.add( (Filter)e.next() ); - } - } - - public Object clone() - { - try - { - if( isReference() ) - { - return new FilterSet( getRef() ); - } - else - { - return new FilterSet( this ); - } - } - catch( final TaskException te ) - { - throw new RuntimeException( te.toString() ); + m_filters.add( (Filter)e.next() ); } } @@ -230,12 +175,7 @@ public class FilterSet * @return The filter that was created. */ public FiltersFile createFiltersfile() - throws TaskException { - if( isReference() ) - { - throw noChildrenAllowed(); - } return new FiltersFile(); } @@ -260,11 +200,6 @@ public class FilterSet public void readFiltersFromFile( File filtersFile ) throws TaskException { - if( isReference() ) - { - throw tooManyAttributes(); - } - if( filtersFile.isFile() ) { getLogger().debug( "Reading filters from " + filtersFile ); @@ -371,97 +306,8 @@ public class FilterSet } protected ArrayList getFilters() - throws TaskException - { - if( isReference() ) - { - return getRef().getFilters(); - } - return filters; - } - - protected FilterSet getRef() - throws TaskException - { - return (FilterSet)getCheckedRef( FilterSet.class, "filterset" ); - } - - /** - * Individual filter component of filterset - * - * @author Michael McCallum - * @created 14 March 2001 - */ - public static class Filter { - /** - * Token which will be replaced in the filter operation - */ - String token; - - /** - * The value which will replace the token in the filtering operation - */ - String 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 Filter( String token, String value ) - { - this.token = token; - this.value = value; - } - - /** - * No argument conmstructor - */ - public Filter() - { - } - - /** - * Sets the Token attribute of the Filter object - * - * @param token The new Token value - */ - public void setToken( String token ) - { - this.token = token; - } - - /** - * Sets the Value attribute of the Filter object - * - * @param value The new Value value - */ - public void setValue( String value ) - { - this.value = value; - } - - /** - * Gets the Token attribute of the Filter object - * - * @return The Token value - */ - public String getToken() - { - return token; - } - - /** - * Gets the Value attribute of the Filter object - * - * @return The Value value - */ - public String getValue() - { - return value; - } + return m_filters; } /** @@ -472,7 +318,6 @@ public class FilterSet */ public class FiltersFile { - /** * Constructor for the Filter object */ diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/types/Mapper.java b/proposal/myrmidon/src/main/org/apache/tools/ant/types/Mapper.java index 4b35736b1..e72030e1c 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/types/Mapper.java +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/types/Mapper.java @@ -9,8 +9,8 @@ package org.apache.tools.ant.types; import java.net.URL; import java.net.URLClassLoader; -import java.util.Stack; import org.apache.myrmidon.api.TaskException; +import org.apache.tools.ant.ProjectComponent; import org.apache.tools.ant.util.FileNameMapper; /** @@ -19,7 +19,7 @@ import org.apache.tools.ant.util.FileNameMapper; * @author Stefan Bodewig */ public class Mapper - extends DataType + extends ProjectComponent implements Cloneable { private MapperType m_type; @@ -33,14 +33,9 @@ public class Mapper * * @param classname The new Classname value */ - public void setClassname( String classname ) - throws TaskException + public void setClassname( final String classname ) { - if( isReference() ) - { - throw tooManyAttributes(); - } - this.m_classname = classname; + m_classname = classname; } /** @@ -51,97 +46,38 @@ public class Mapper public void setClasspath( Path classpath ) throws TaskException { - if( isReference() ) - { - throw tooManyAttributes(); - } - if( this.m_classpath == null ) + if( m_classpath == null ) { - this.m_classpath = classpath; + m_classpath = classpath; } else { - this.m_classpath.append( classpath ); + m_classpath.append( classpath ); } } - /** - * Set the classpath to load the FileNameMapper through via reference - * (attribute). - * - * @param r The new ClasspathRef value - */ - public void setClasspathRef( Reference r ) - throws TaskException - { - if( isReference() ) - { - throw tooManyAttributes(); - } - createClasspath().setRefid( r ); - } - /** * Set the argument to FileNameMapper.setFrom - * - * @param from The new From value */ - public void setFrom( String from ) - throws TaskException - { - if( isReference() ) - { - throw tooManyAttributes(); - } - this.m_from = from; - } - - /** - * Make this Mapper instance a reference to another Mapper.

- * - * You must not set any other attribute if you make it a reference.

- * - * @param r The new Refid value - * @exception TaskException Description of Exception - */ - public void setRefid( Reference r ) - throws TaskException + public void setFrom( final String from ) { - if( m_type != null || m_from != null || m_to != null ) - { - throw tooManyAttributes(); - } - super.setRefid( r ); + m_from = from; } /** * Set the argument to FileNameMapper.setTo - * - * @param to The new To value */ - public void setTo( String to ) - throws TaskException + public void setTo( final String to ) { - if( isReference() ) - { - throw tooManyAttributes(); - } - this.m_to = to; + m_to = to; } /** * Set the type of FileNameMapper to use. - * - * @param type The new Type value */ public void setType( MapperType type ) - throws TaskException { - if( isReference() ) - { - throw tooManyAttributes(); - } - this.m_type = type; + m_type = type; } /** @@ -153,11 +89,6 @@ public class Mapper public FileNameMapper getImplementation() throws TaskException { - if( isReference() ) - { - return getRef().getImplementation(); - } - if( m_type == null && m_classname == null ) { throw new TaskException( "one of the attributes type or classname is required" ); @@ -217,43 +148,10 @@ public class Mapper public Path createClasspath() throws TaskException { - if( isReference() ) + if( m_classpath == null ) { - throw noChildrenAllowed(); + m_classpath = new Path(); } - if( this.m_classpath == null ) - { - this.m_classpath = new Path(); - } - return this.m_classpath.createPath(); + return m_classpath.createPath(); } - - /** - * Performs the check for circular references and returns the referenced - * Mapper. - * - * @return The Ref value - */ - protected Mapper getRef() - throws TaskException - { - if( !checked ) - { - Stack stk = new Stack(); - stk.push( this ); - dieOnCircularReference( stk, getProject() ); - } - - Object o = ref.getReferencedObject( getProject() ); - if( !( o instanceof Mapper ) ) - { - String msg = ref.getRefId() + " doesn\'t denote a mapper"; - throw new TaskException( msg ); - } - else - { - return (Mapper)o; - } - } - } diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/types/Path.java b/proposal/myrmidon/src/main/org/apache/tools/ant/types/Path.java index c457fe659..602bb1150 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/types/Path.java +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/types/Path.java @@ -11,14 +11,12 @@ import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; -import java.util.Iterator; import java.util.Locale; -import java.util.Stack; import org.apache.avalon.excalibur.io.FileUtil; import org.apache.myrmidon.api.TaskException; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.PathTokenizer; -import org.apache.tools.ant.Project; +import org.apache.tools.ant.ProjectComponent; /** * This object represents a path as used by CLASSPATH or PATH environment @@ -51,9 +49,8 @@ import org.apache.tools.ant.Project; * @author Thomas.Haas@softwired-inc.com * @author Stefan Bodewig */ - public class Path - extends DataType + extends ProjectComponent implements Cloneable { public final static Path systemClasspath = createSystemClasspath(); @@ -91,11 +88,8 @@ public class Path /** * Returns its argument with all file separator characters replaced so that * they match the local OS conventions. - * - * @param source Description of Parameter - * @return Description of the Returned Value */ - public static String translateFile( String source ) + private static String translateFile( final String source ) { if( source == null ) return ""; @@ -112,7 +106,7 @@ public class Path /** * Splits a PATH (with : or ; as separators) into its parts. */ - public String[] translatePath( Project project, String source ) + private String[] translatePath( final File baseDirectory, String source ) { final ArrayList result = new ArrayList(); if( source == null ) @@ -123,15 +117,18 @@ public class Path while( tok.hasMoreTokens() ) { element.setLength( 0 ); - String pathElement = tok.nextToken(); + final String pathElement = tok.nextToken(); try { - element.append( resolveFile( project, pathElement ) ); + element.append( resolveFile( baseDirectory, pathElement ) ); } catch( TaskException e ) { - getLogger().debug( "Dropping path element " + pathElement + " as it is not valid relative to the project" ); + final String message = + "Dropping path element " + pathElement + " as it is not valid relative to the project"; + getLogger().debug( message ); } + for( int i = 0; i < element.length(); i++ ) { translateFileSep( element, i ); @@ -139,8 +136,7 @@ public class Path result.add( element.toString() ); } - final String[] res = new String[ result.size() ]; - return (String[])result.toArray( res ); + return (String[])result.toArray( new String[ result.size() ] ); } /** @@ -151,7 +147,7 @@ public class Path * @param pos Description of Parameter * @return Description of the Returned Value */ - protected static boolean translateFileSep( StringBuffer buffer, int pos ) + private static boolean translateFileSep( StringBuffer buffer, int pos ) { if( buffer.charAt( pos ) == '/' || buffer.charAt( pos ) == '\\' ) { @@ -163,15 +159,12 @@ public class Path /** * Adds a String to the ArrayList if it isn't already included. - * - * @param v The feature to be added to the UnlessPresent attribute - * @param s The feature to be added to the UnlessPresent attribute */ - private static void addUnlessPresent( ArrayList v, String s ) + private static void addUnlessPresent( final ArrayList list, final String entry ) { - if( v.indexOf( s ) == -1 ) + if( !list.contains( entry ) ) { - v.add( s ); + list.add( entry ); } } @@ -179,18 +172,14 @@ public class Path * Resolve a filename with Project's help - if we know one that is.

* * Assume the filename is absolute if project is null.

- * - * @param project Description of Parameter - * @param relativeName Description of Parameter - * @return Description of the Returned Value */ - private static String resolveFile( Project project, String relativeName ) + private static String resolveFile( final File baseDirectory, final String relativeName ) throws TaskException { - if( project != null ) + if( null != baseDirectory ) { - File f = FileUtil.resolveFile( project.getBaseDir(), relativeName ); - return f.getAbsolutePath(); + final File file = FileUtil.resolveFile( baseDirectory, relativeName ); + return file.getAbsolutePath(); } return relativeName; } @@ -200,15 +189,9 @@ public class Path * * @param location the location of the element to add (must not be null * nor empty. - * @exception TaskException Description of Exception */ - public void setLocation( File location ) - throws TaskException + public void setLocation( final File location ) { - if( isReference() ) - { - throw tooManyAttributes(); - } createPathElement().setLocation( location ); } @@ -216,63 +199,28 @@ public class Path * Parses a path definition and creates single PathElements. * * @param path the path definition. - * @exception TaskException Description of Exception */ public void setPath( String path ) - throws TaskException { - if( isReference() ) - { - throw tooManyAttributes(); - } createPathElement().setPath( path ); } - /** - * Makes this instance in effect a reference to another Path instance.

- * - * You must not set another attribute or nest elements inside this element - * if you make it a reference.

- * - * @param r The new Refid value - * @exception TaskException Description of Exception - */ - public void setRefid( Reference r ) - throws TaskException - { - if( !elements.isEmpty() ) - { - throw tooManyAttributes(); - } - elements.add( r ); - super.setRefid( r ); - } - /** * Adds the components on the given path which exist to this Path. * Components that don't exist, aren't added. * * @param source - source path whose components are examined for existence */ - public void addExisting( Path source ) + public void addExisting( final Path source ) throws TaskException { - String[] list = source.list(); + final String[] list = source.list(); for( int i = 0; i < list.length; i++ ) { - File f = null; - if( getProject() != null ) - { - f = resolveFile( list[ i ] ); - } - else - { - f = new File( list[ i ] ); - } - - if( f.exists() ) + final File file = new File( list[ i ] ); + if( file.exists() ) { - setLocation( f ); + setLocation( file ); } } } @@ -281,8 +229,6 @@ public class Path * Emulation of extdirs feature in java >= 1.2. This method adds all files * in the given directories (but not in sub-directories!) to the classpath, * so that you don't have to specify them all one by one. - * - * @param extdirs The feature to be added to the Extdirs attribute */ public void addExtdirs( Path extdirs ) throws TaskException @@ -300,16 +246,16 @@ public class Path } } - String[] dirs = extdirs.list(); + final String[] dirs = extdirs.list(); for( int i = 0; i < dirs.length; i++ ) { - File dir = resolveFile( dirs[ i ] ); + final File dir = resolveFile( dirs[ i ] ); if( dir.exists() && dir.isDirectory() ) { - FileSet fs = new FileSet(); - fs.setDir( dir ); - fs.setIncludes( "*" ); - addFileset( fs ); + final FileSet fileSet = new FileSet(); + fileSet.setDir( dir ); + fileSet.setIncludes( "*" ); + addFileset( fileSet ); } } } @@ -320,15 +266,9 @@ public class Path * @param fs The feature to be added to the Fileset attribute * @exception TaskException Description of Exception */ - public void addFileset( FileSet fs ) - throws TaskException + public void addFileset( final FileSet fileSet ) { - if( isReference() ) - { - throw noChildrenAllowed(); - } - elements.add( fs ); - checked = false; + elements.add( fileSet ); } /** @@ -382,42 +322,24 @@ public class Path /** * Append the contents of the other Path instance to this. - * - * @param other Description of Parameter */ - public void append( Path other ) + public void append( final Path other ) throws TaskException { - if( other == null ) - return; - String[] l = other.list(); - for( int i = 0; i < l.length; i++ ) + if( null == other ) { - if( elements.indexOf( l[ i ] ) == -1 ) - { - elements.add( l[ i ] ); - } + throw new NullPointerException( "other" ); } - } - /** - * Return a Path that holds the same elements as this instance. - * - * @return Description of the Returned Value - */ - public Object clone() - { - try - { - Path p = new Path(); - p.append( this ); - return p; - } - catch( TaskException e ) + final String[] list = other.list(); + for( int i = 0; i < list.length; i++ ) { - throw new IllegalStateException( e.getMessage() ); + final String file = list[ i ]; + if( elements.contains( file ) ) + { + elements.add( file ); + } } - } /** @@ -459,20 +381,17 @@ public class Path { // only: the developer knows what (s)he is doing result.addExisting( Path.systemClasspath ); - } else if( order.equals( "first" ) ) { // first: developer could use a little help result.addExisting( Path.systemClasspath ); result.addExisting( this ); - } else if( order.equals( "ignore" ) ) { // ignore: don't trust anyone result.addExisting( this ); - } else { @@ -499,50 +418,27 @@ public class Path public Path createPath() throws TaskException { - if( isReference() ) - { - throw noChildrenAllowed(); - } - Path p = new Path(); - elements.add( p ); - checked = false; - return p; + final Path other = new Path(); + elements.add( other ); + return other; } /** * Creates the nested <pathelement> element. - * - * @return Description of the Returned Value - * @exception TaskException Description of Exception */ public PathElement createPathElement() - throws TaskException { - if( isReference() ) - { - throw noChildrenAllowed(); - } - PathElement pe = new PathElement(); - elements.add( pe ); - return pe; + final PathElement pathElement = new PathElement(); + elements.add( pathElement ); + return pathElement; } /** * Returns all path elements defined by this and nested path objects. - * - * @return list of path elements. */ public String[] list() throws TaskException { - if( !checked ) - { - // make sure we don't have a circular reference here - Stack stk = new Stack(); - stk.push( this ); - dieOnCircularReference( stk, getProject() ); - } - ArrayList result = new ArrayList( 2 * elements.size() ); for( int i = 0; i < elements.size(); i++ ) { @@ -599,14 +495,11 @@ public class Path } } } - String[] res = new String[ result.size() ]; - return (String[])result.toArray( res ); + return (String[])result.toArray( new String[ result.size() ] ); } /** * How many parts does this Path instance consist of. - * - * @return Description of the Returned Value */ public int size() throws TaskException @@ -673,52 +566,8 @@ public class Path } } - /** - * Overrides the version of DataType to recurse on all DataType child - * elements that may have been added. - * - * @param stk Description of Parameter - * @param p Description of Parameter - * @exception TaskException Description of Exception - */ - protected void dieOnCircularReference( Stack stk, Project p ) - throws TaskException - { - if( checked ) - { - return; - } - - Iterator enum = elements.iterator(); - while( enum.hasNext() ) - { - Object o = enum.next(); - if( o instanceof Reference ) - { - o = ( (Reference)o ).getReferencedObject( p ); - } - - if( o instanceof DataType ) - { - if( stk.contains( o ) ) - { - throw circularReference(); - } - else - { - stk.push( o ); - ( (DataType)o ).dieOnCircularReference( stk, p ); - stk.pop(); - } - } - } - checked = true; - } - /** * Helper class, holds the nested <pathelement> values. - * - * @author RT */ public class PathElement { @@ -731,7 +580,7 @@ public class Path public void setPath( String path ) { - parts = translatePath( getProject(), path ); + parts = translatePath( getProject().getBaseDir(), path ); } public String[] getParts() diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/types/PatternSet.java b/proposal/myrmidon/src/main/org/apache/tools/ant/types/PatternSet.java index 14a349eee..fd8b40652 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/types/PatternSet.java +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/types/PatternSet.java @@ -16,6 +16,7 @@ import java.util.Iterator; import java.util.StringTokenizer; import org.apache.myrmidon.api.TaskException; import org.apache.tools.ant.Project; +import org.apache.tools.ant.ProjectComponent; /** * Named collection of include/exclude tags.

@@ -31,7 +32,7 @@ import org.apache.tools.ant.Project; * @author Stefan Bodewig */ public class PatternSet - extends DataType + extends ProjectComponent { private ArrayList m_includeList = new ArrayList(); private ArrayList m_excludeList = new ArrayList(); diff --git a/proposal/myrmidon/src/main/org/apache/tools/ant/types/RegularExpression.java b/proposal/myrmidon/src/main/org/apache/tools/ant/types/RegularExpression.java index 69e90c9e0..4018508b1 100644 --- a/proposal/myrmidon/src/main/org/apache/tools/ant/types/RegularExpression.java +++ b/proposal/myrmidon/src/main/org/apache/tools/ant/types/RegularExpression.java @@ -7,9 +7,8 @@ */ package org.apache.tools.ant.types; -import java.util.Stack; import org.apache.myrmidon.api.TaskException; -import org.apache.tools.ant.Project; +import org.apache.tools.ant.ProjectComponent; import org.apache.tools.ant.util.regexp.Regexp; import org.apache.tools.ant.util.regexp.RegexpFactory; @@ -42,79 +41,37 @@ import org.apache.tools.ant.util.regexp.RegexpFactory; * @see java.util.regex.Pattern * @see org.apache.tools.ant.util.regexp.Regexp */ -public class RegularExpression extends DataType +public class RegularExpression + extends ProjectComponent { - public final static String DATA_TYPE_NAME = "regularexpression"; - // The regular expression factory private final static RegexpFactory factory = new RegexpFactory(); - private Regexp regexp; + private Regexp m_regexp; public RegularExpression() throws TaskException { - this.regexp = factory.newRegexp(); + m_regexp = factory.newRegexp(); } - public void setPattern( String pattern ) + public void setPattern( final String pattern ) throws TaskException { - this.regexp.setPattern( pattern ); + m_regexp.setPattern( pattern ); } /** * Gets the pattern string for this RegularExpression in the given project. - * - * @param p Description of Parameter - * @return The Pattern value */ - public String getPattern( Project p ) + public String getPattern() throws TaskException { - if( isReference() ) - return getRef( p ).getPattern( p ); - - return regexp.getPattern(); + return m_regexp.getPattern(); } - /** - * Get the RegularExpression this reference refers to in the given project. - * Check for circular references too - * - * @param p Description of Parameter - * @return The Ref value - */ - public RegularExpression getRef( Project p ) - throws TaskException + public Regexp getRegexp() { - if( !checked ) - { - Stack stk = new Stack(); - stk.push( this ); - dieOnCircularReference( stk, p ); - } - - Object o = ref.getReferencedObject( p ); - if( !( o instanceof RegularExpression ) ) - { - String msg = ref.getRefId() + " doesn\'t denote a regularexpression"; - throw new TaskException( msg ); - } - else - { - return (RegularExpression)o; - } + return m_regexp; } - - public Regexp getRegexp( Project p ) - throws TaskException - { - if( isReference() ) - { - return getRef( p ).getRegexp( p ); - } - return this.regexp; - } - } diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/types/DataType.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/types/DataType.java deleted file mode 100644 index 7b7163ae8..000000000 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/types/DataType.java +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (C) The Apache Software Foundation. All rights reserved. - * - * This software is published under the terms of the Apache Software License - * version 1.1, a copy of which has been included with this distribution in - * the LICENSE.txt file. - */ -package org.apache.tools.ant.types; - -import java.util.Stack; -import org.apache.myrmidon.api.TaskException; -import org.apache.tools.ant.Project; -import org.apache.tools.ant.ProjectComponent; - -/** - * Base class for those classes that can appear inside the build file as stand - * alone data types.

- * - * This class handles the common description attribute and provides a default - * implementation for reference handling and checking for circular references - * that is appropriate for types that can not be nested inside elements of the - * same type (i.e. <patternset> but not <path>).

- * - * @author Stefan Bodewig - */ -public abstract class DataType - extends ProjectComponent -{ - /** - * Value to the refid attribute. - */ - protected Reference ref; - - /** - * Are we sure we don't hold circular references?

- * - * Subclasses are responsible for setting this value to false if we'd need - * to investigate this condition (usually because a child element has been - * added that is a subclass of DataType).

- */ - protected boolean checked = true; - - /** - * Set the value of the refid attribute.

- * - * Subclasses may need to check whether any other attributes have been set - * as well or child elements have been created and thus override this - * method. if they do the must call super.setRefid.

- * - * @param ref The new Refid value - */ - public void setRefid( Reference ref ) - throws TaskException - { - this.ref = ref; - checked = false; - } - - /** - * Has the refid attribute of this element been set? - * - * @return The Reference value - */ - public boolean isReference() - { - return ref != null; - } - - /** - * Performs the check for circular references and returns the referenced - * object. - * - * @param requiredClass Description of Parameter - * @param dataTypeName Description of Parameter - * @return The CheckedRef value - */ - protected Object getCheckedRef( Class requiredClass, String dataTypeName ) - throws TaskException - { - if( !checked ) - { - Stack stk = new Stack(); - stk.push( this ); - dieOnCircularReference( stk, getProject() ); - } - - Object o = ref.getReferencedObject( getProject() ); - if( !( requiredClass.isAssignableFrom( o.getClass() ) ) ) - { - String msg = ref.getRefId() + " doesn\'t denote a " + dataTypeName; - throw new TaskException( msg ); - } - else - { - return o; - } - } - - /** - * Creates an exception that indicates the user has generated a loop of data - * types referencing each other. - * - * @return Description of the Returned Value - */ - protected TaskException circularReference() - { - return new TaskException( "This data type contains a circular reference." ); - } - - /** - * Check to see whether any DataType we hold references to is included in - * the Stack (which holds all DataType instances that directly or indirectly - * reference this instance, including this instance itself).

- * - * If one is included, throw a TaskException created by {@link - * #circularReference circularReference}.

- * - * This implementation is appropriate only for a DataType that cannot hold - * other DataTypes as children.

- * - * The general contract of this method is that it shouldn't do anything if - * {@link #checked checked} is true and set it to true on exit. - *

- * - * @param stk Description of Parameter - * @param p Description of Parameter - * @exception TaskException Description of Exception - */ - protected void dieOnCircularReference( Stack stk, Project p ) - throws TaskException - { - - if( checked || !isReference() ) - { - return; - } - Object o = ref.getReferencedObject( p ); - - if( o instanceof DataType ) - { - if( stk.contains( o ) ) - { - throw circularReference(); - } - else - { - stk.push( o ); - ( (DataType)o ).dieOnCircularReference( stk, p ); - stk.pop(); - } - } - checked = true; - } - - /** - * Creates an exception that indicates that this XML element must not have - * child elements if the refid attribute is set. - * - * @return Description of the Returned Value - */ - protected TaskException noChildrenAllowed() - { - return new TaskException( "You must not specify nested elements when using refid" ); - } - - /** - * Creates an exception that indicates that refid has to be the only - * attribute if it is set. - * - * @return Description of the Returned Value - */ - protected TaskException tooManyAttributes() - { - return new TaskException( "You must not specify more than one attribute" + - " when using refid" ); - } -} diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/types/FileList.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/types/FileList.java index 1810ae5b4..0459ea3e8 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/types/FileList.java +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/types/FileList.java @@ -9,10 +9,9 @@ package org.apache.tools.ant.types; import java.io.File; import java.util.ArrayList; -import java.util.Stack; import java.util.StringTokenizer; import org.apache.myrmidon.api.TaskException; -import org.apache.tools.ant.Project; +import org.apache.tools.ant.ProjectComponent; /** * FileList represents an explicitly named list of files. FileLists are useful @@ -23,135 +22,54 @@ import org.apache.tools.ant.Project; * @author Craeg Strong * @version $Revision$ $Date$ */ -public class FileList extends DataType +public class FileList + extends ProjectComponent { - - private ArrayList filenames = new ArrayList(); - private File dir; + private final ArrayList m_filenames = new ArrayList(); + private File m_dir; public FileList() { - super(); - } - - protected FileList( FileList filelist ) - { - this.dir = filelist.dir; - this.filenames = filelist.filenames; } public void setDir( File dir ) - throws TaskException { - if( isReference() ) - { - throw tooManyAttributes(); - } - this.dir = dir; + m_dir = dir; } public void setFiles( String filenames ) - throws TaskException { - if( isReference() ) - { - throw tooManyAttributes(); - } if( filenames != null && filenames.length() > 0 ) { StringTokenizer tok = new StringTokenizer( filenames, ", \t\n\r\f", false ); while( tok.hasMoreTokens() ) { - this.filenames.add( tok.nextToken() ); + m_filenames.add( tok.nextToken() ); } } } - /** - * Makes this instance in effect a reference to another FileList instance. - *

- * - * You must not set another attribute or nest elements inside this element - * if you make it a reference.

- * - * @param r The new Refid value - * @exception TaskException Description of Exception - */ - public void setRefid( Reference r ) - throws TaskException - { - if( ( dir != null ) || ( filenames.size() != 0 ) ) - { - throw tooManyAttributes(); - } - super.setRefid( r ); - } - - public File getDir( Project p ) - throws TaskException + public File getDir() { - if( isReference() ) - { - return getRef( p ).getDir( p ); - } - return dir; + return m_dir; } /** * Returns the list of files represented by this FileList. - * - * @param p Description of Parameter - * @return The Files value */ - public String[] getFiles( Project p ) + public String[] getFiles() throws TaskException { - if( isReference() ) - { - return getRef( p ).getFiles( p ); - } - - if( dir == null ) + if( m_dir == null ) { throw new TaskException( "No directory specified for filelist." ); } - if( filenames.size() == 0 ) + if( m_filenames.size() == 0 ) { throw new TaskException( "No files specified for filelist." ); } - final String result[] = new String[ filenames.size() ]; - return (String[])filenames.toArray( result ); + return (String[])m_filenames.toArray( new String[ m_filenames.size() ] ); } - - /** - * Performs the check for circular references and returns the referenced - * FileList. - * - * @param p Description of Parameter - * @return The Ref value - */ - protected FileList getRef( Project p ) - throws TaskException - { - if( !checked ) - { - Stack stk = new Stack(); - stk.push( this ); - dieOnCircularReference( stk, p ); - } - - Object o = ref.getReferencedObject( p ); - if( !( o instanceof FileList ) ) - { - String msg = ref.getRefId() + " doesn\'t denote a filelist"; - throw new TaskException( msg ); - } - else - { - return (FileList)o; - } - } - -}//-- FileList.java +} diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/types/FileSet.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/types/FileSet.java index f73ed3da4..a2714bc84 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/types/FileSet.java +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/types/FileSet.java @@ -12,6 +12,7 @@ import java.util.ArrayList; import org.apache.myrmidon.api.TaskException; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.FileScanner; +import org.apache.tools.ant.ProjectComponent; /** * Moved out of MatchingTask to make it a standalone object that could be @@ -26,7 +27,7 @@ import org.apache.tools.ant.FileScanner; * @author Magesh Umasankar */ public class FileSet - extends DataType + extends ProjectComponent implements Cloneable { private PatternSet m_defaultPatterns = new PatternSet(); diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/types/Filter.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/types/Filter.java new file mode 100644 index 000000000..b82949da8 --- /dev/null +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/types/Filter.java @@ -0,0 +1,78 @@ +/* + * 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.tools.ant.types; + +/** + * Individual filter component of filterset + * + * @author Michael McCallum + * @created 14 March 2001 + */ +public class Filter +{ + /** + * 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 Filter( final String token, final String value ) + { + m_token = token; + m_value = value; + } + + /** + * No argument conmstructor + */ + public Filter() + { + } + + /** + * 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; + } + + /** + * Gets the Token attribute of the Filter object + */ + public String getToken() + { + return m_token; + } + + /** + * Gets the Value attribute of the Filter object + */ + public String getValue() + { + return m_value; + } +} diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/types/FilterSet.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/types/FilterSet.java index 6cf25aab2..abf5c5b5b 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/types/FilterSet.java +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/types/FilterSet.java @@ -16,6 +16,7 @@ import java.util.Hashtable; import java.util.Iterator; import java.util.Properties; import org.apache.myrmidon.api.TaskException; +import org.apache.tools.ant.ProjectComponent; /** * A set of filters to be applied to something. A filter set may have begintoken @@ -25,7 +26,7 @@ import org.apache.myrmidon.api.TaskException; * @created 14 March 2001 */ public class FilterSet - extends DataType + extends ProjectComponent implements Cloneable { @@ -39,13 +40,13 @@ public class FilterSet */ public final static String DEFAULT_TOKEN_END = "@"; - private String startOfToken = DEFAULT_TOKEN_START; - private String endOfToken = DEFAULT_TOKEN_END; + private String m_startOfToken = DEFAULT_TOKEN_START; + private String m_endOfToken = DEFAULT_TOKEN_END; /** * List of ordered filters and filter files. */ - private ArrayList filters = new ArrayList(); + private ArrayList m_filters = new ArrayList(); public FilterSet() { @@ -60,7 +61,7 @@ public class FilterSet throws TaskException { super(); - this.filters = (ArrayList)filterset.getFilters().clone(); + m_filters = (ArrayList)filterset.getFilters().clone(); } /** @@ -71,15 +72,11 @@ public class FilterSet public void setBeginToken( String startOfToken ) throws TaskException { - if( isReference() ) - { - throw tooManyAttributes(); - } if( startOfToken == null || "".equals( startOfToken ) ) { throw new TaskException( "beginToken must not be empty" ); } - this.startOfToken = startOfToken; + m_startOfToken = startOfToken; } /** @@ -90,15 +87,11 @@ public class FilterSet public void setEndToken( String endOfToken ) throws TaskException { - if( isReference() ) - { - throw tooManyAttributes(); - } if( endOfToken == null || "".equals( endOfToken ) ) { throw new TaskException( "endToken must not be empty" ); } - this.endOfToken = endOfToken; + m_endOfToken = endOfToken; } /** @@ -111,31 +104,17 @@ public class FilterSet public void setFiltersfile( File filtersFile ) throws TaskException { - if( isReference() ) - { - throw tooManyAttributes(); - } readFiltersFromFile( filtersFile ); } public String getBeginToken() - throws TaskException { - if( isReference() ) - { - return getRef().getBeginToken(); - } - return startOfToken; + return m_startOfToken; } public String getEndToken() - throws TaskException { - if( isReference() ) - { - return getRef().getEndToken(); - } - return endOfToken; + return m_endOfToken; } /** @@ -162,13 +141,8 @@ public class FilterSet * @param filter The feature to be added to the Filter attribute */ public void addFilter( Filter filter ) - throws TaskException { - if( isReference() ) - { - throw noChildrenAllowed(); - } - filters.add( filter ); + m_filters.add( filter ); } /** @@ -178,13 +152,8 @@ public class FilterSet * @param value The value for the new filter. */ public void addFilter( String token, String value ) - throws TaskException { - if( isReference() ) - { - throw noChildrenAllowed(); - } - filters.add( new Filter( token, value ) ); + m_filters.add( new Filter( token, value ) ); } /** @@ -193,34 +162,10 @@ public class FilterSet * @param filterSet the filterset to be added to this filterset */ public void addFilterSet( FilterSet filterSet ) - throws TaskException { - if( isReference() ) - { - throw noChildrenAllowed(); - } for( Iterator e = filterSet.getFilters().iterator(); e.hasNext(); ) { - filters.add( (Filter)e.next() ); - } - } - - public Object clone() - { - try - { - if( isReference() ) - { - return new FilterSet( getRef() ); - } - else - { - return new FilterSet( this ); - } - } - catch( final TaskException te ) - { - throw new RuntimeException( te.toString() ); + m_filters.add( (Filter)e.next() ); } } @@ -230,12 +175,7 @@ public class FilterSet * @return The filter that was created. */ public FiltersFile createFiltersfile() - throws TaskException { - if( isReference() ) - { - throw noChildrenAllowed(); - } return new FiltersFile(); } @@ -260,11 +200,6 @@ public class FilterSet public void readFiltersFromFile( File filtersFile ) throws TaskException { - if( isReference() ) - { - throw tooManyAttributes(); - } - if( filtersFile.isFile() ) { getLogger().debug( "Reading filters from " + filtersFile ); @@ -371,97 +306,8 @@ public class FilterSet } protected ArrayList getFilters() - throws TaskException - { - if( isReference() ) - { - return getRef().getFilters(); - } - return filters; - } - - protected FilterSet getRef() - throws TaskException - { - return (FilterSet)getCheckedRef( FilterSet.class, "filterset" ); - } - - /** - * Individual filter component of filterset - * - * @author Michael McCallum - * @created 14 March 2001 - */ - public static class Filter { - /** - * Token which will be replaced in the filter operation - */ - String token; - - /** - * The value which will replace the token in the filtering operation - */ - String 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 Filter( String token, String value ) - { - this.token = token; - this.value = value; - } - - /** - * No argument conmstructor - */ - public Filter() - { - } - - /** - * Sets the Token attribute of the Filter object - * - * @param token The new Token value - */ - public void setToken( String token ) - { - this.token = token; - } - - /** - * Sets the Value attribute of the Filter object - * - * @param value The new Value value - */ - public void setValue( String value ) - { - this.value = value; - } - - /** - * Gets the Token attribute of the Filter object - * - * @return The Token value - */ - public String getToken() - { - return token; - } - - /** - * Gets the Value attribute of the Filter object - * - * @return The Value value - */ - public String getValue() - { - return value; - } + return m_filters; } /** @@ -472,7 +318,6 @@ public class FilterSet */ public class FiltersFile { - /** * Constructor for the Filter object */ diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/types/Mapper.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/types/Mapper.java index 4b35736b1..e72030e1c 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/types/Mapper.java +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/types/Mapper.java @@ -9,8 +9,8 @@ package org.apache.tools.ant.types; import java.net.URL; import java.net.URLClassLoader; -import java.util.Stack; import org.apache.myrmidon.api.TaskException; +import org.apache.tools.ant.ProjectComponent; import org.apache.tools.ant.util.FileNameMapper; /** @@ -19,7 +19,7 @@ import org.apache.tools.ant.util.FileNameMapper; * @author Stefan Bodewig */ public class Mapper - extends DataType + extends ProjectComponent implements Cloneable { private MapperType m_type; @@ -33,14 +33,9 @@ public class Mapper * * @param classname The new Classname value */ - public void setClassname( String classname ) - throws TaskException + public void setClassname( final String classname ) { - if( isReference() ) - { - throw tooManyAttributes(); - } - this.m_classname = classname; + m_classname = classname; } /** @@ -51,97 +46,38 @@ public class Mapper public void setClasspath( Path classpath ) throws TaskException { - if( isReference() ) - { - throw tooManyAttributes(); - } - if( this.m_classpath == null ) + if( m_classpath == null ) { - this.m_classpath = classpath; + m_classpath = classpath; } else { - this.m_classpath.append( classpath ); + m_classpath.append( classpath ); } } - /** - * Set the classpath to load the FileNameMapper through via reference - * (attribute). - * - * @param r The new ClasspathRef value - */ - public void setClasspathRef( Reference r ) - throws TaskException - { - if( isReference() ) - { - throw tooManyAttributes(); - } - createClasspath().setRefid( r ); - } - /** * Set the argument to FileNameMapper.setFrom - * - * @param from The new From value */ - public void setFrom( String from ) - throws TaskException - { - if( isReference() ) - { - throw tooManyAttributes(); - } - this.m_from = from; - } - - /** - * Make this Mapper instance a reference to another Mapper.

- * - * You must not set any other attribute if you make it a reference.

- * - * @param r The new Refid value - * @exception TaskException Description of Exception - */ - public void setRefid( Reference r ) - throws TaskException + public void setFrom( final String from ) { - if( m_type != null || m_from != null || m_to != null ) - { - throw tooManyAttributes(); - } - super.setRefid( r ); + m_from = from; } /** * Set the argument to FileNameMapper.setTo - * - * @param to The new To value */ - public void setTo( String to ) - throws TaskException + public void setTo( final String to ) { - if( isReference() ) - { - throw tooManyAttributes(); - } - this.m_to = to; + m_to = to; } /** * Set the type of FileNameMapper to use. - * - * @param type The new Type value */ public void setType( MapperType type ) - throws TaskException { - if( isReference() ) - { - throw tooManyAttributes(); - } - this.m_type = type; + m_type = type; } /** @@ -153,11 +89,6 @@ public class Mapper public FileNameMapper getImplementation() throws TaskException { - if( isReference() ) - { - return getRef().getImplementation(); - } - if( m_type == null && m_classname == null ) { throw new TaskException( "one of the attributes type or classname is required" ); @@ -217,43 +148,10 @@ public class Mapper public Path createClasspath() throws TaskException { - if( isReference() ) + if( m_classpath == null ) { - throw noChildrenAllowed(); + m_classpath = new Path(); } - if( this.m_classpath == null ) - { - this.m_classpath = new Path(); - } - return this.m_classpath.createPath(); + return m_classpath.createPath(); } - - /** - * Performs the check for circular references and returns the referenced - * Mapper. - * - * @return The Ref value - */ - protected Mapper getRef() - throws TaskException - { - if( !checked ) - { - Stack stk = new Stack(); - stk.push( this ); - dieOnCircularReference( stk, getProject() ); - } - - Object o = ref.getReferencedObject( getProject() ); - if( !( o instanceof Mapper ) ) - { - String msg = ref.getRefId() + " doesn\'t denote a mapper"; - throw new TaskException( msg ); - } - else - { - return (Mapper)o; - } - } - } diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/types/Path.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/types/Path.java index c457fe659..602bb1150 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/types/Path.java +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/types/Path.java @@ -11,14 +11,12 @@ import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; -import java.util.Iterator; import java.util.Locale; -import java.util.Stack; import org.apache.avalon.excalibur.io.FileUtil; import org.apache.myrmidon.api.TaskException; import org.apache.tools.ant.DirectoryScanner; import org.apache.tools.ant.PathTokenizer; -import org.apache.tools.ant.Project; +import org.apache.tools.ant.ProjectComponent; /** * This object represents a path as used by CLASSPATH or PATH environment @@ -51,9 +49,8 @@ import org.apache.tools.ant.Project; * @author Thomas.Haas@softwired-inc.com * @author Stefan Bodewig */ - public class Path - extends DataType + extends ProjectComponent implements Cloneable { public final static Path systemClasspath = createSystemClasspath(); @@ -91,11 +88,8 @@ public class Path /** * Returns its argument with all file separator characters replaced so that * they match the local OS conventions. - * - * @param source Description of Parameter - * @return Description of the Returned Value */ - public static String translateFile( String source ) + private static String translateFile( final String source ) { if( source == null ) return ""; @@ -112,7 +106,7 @@ public class Path /** * Splits a PATH (with : or ; as separators) into its parts. */ - public String[] translatePath( Project project, String source ) + private String[] translatePath( final File baseDirectory, String source ) { final ArrayList result = new ArrayList(); if( source == null ) @@ -123,15 +117,18 @@ public class Path while( tok.hasMoreTokens() ) { element.setLength( 0 ); - String pathElement = tok.nextToken(); + final String pathElement = tok.nextToken(); try { - element.append( resolveFile( project, pathElement ) ); + element.append( resolveFile( baseDirectory, pathElement ) ); } catch( TaskException e ) { - getLogger().debug( "Dropping path element " + pathElement + " as it is not valid relative to the project" ); + final String message = + "Dropping path element " + pathElement + " as it is not valid relative to the project"; + getLogger().debug( message ); } + for( int i = 0; i < element.length(); i++ ) { translateFileSep( element, i ); @@ -139,8 +136,7 @@ public class Path result.add( element.toString() ); } - final String[] res = new String[ result.size() ]; - return (String[])result.toArray( res ); + return (String[])result.toArray( new String[ result.size() ] ); } /** @@ -151,7 +147,7 @@ public class Path * @param pos Description of Parameter * @return Description of the Returned Value */ - protected static boolean translateFileSep( StringBuffer buffer, int pos ) + private static boolean translateFileSep( StringBuffer buffer, int pos ) { if( buffer.charAt( pos ) == '/' || buffer.charAt( pos ) == '\\' ) { @@ -163,15 +159,12 @@ public class Path /** * Adds a String to the ArrayList if it isn't already included. - * - * @param v The feature to be added to the UnlessPresent attribute - * @param s The feature to be added to the UnlessPresent attribute */ - private static void addUnlessPresent( ArrayList v, String s ) + private static void addUnlessPresent( final ArrayList list, final String entry ) { - if( v.indexOf( s ) == -1 ) + if( !list.contains( entry ) ) { - v.add( s ); + list.add( entry ); } } @@ -179,18 +172,14 @@ public class Path * Resolve a filename with Project's help - if we know one that is.

* * Assume the filename is absolute if project is null.

- * - * @param project Description of Parameter - * @param relativeName Description of Parameter - * @return Description of the Returned Value */ - private static String resolveFile( Project project, String relativeName ) + private static String resolveFile( final File baseDirectory, final String relativeName ) throws TaskException { - if( project != null ) + if( null != baseDirectory ) { - File f = FileUtil.resolveFile( project.getBaseDir(), relativeName ); - return f.getAbsolutePath(); + final File file = FileUtil.resolveFile( baseDirectory, relativeName ); + return file.getAbsolutePath(); } return relativeName; } @@ -200,15 +189,9 @@ public class Path * * @param location the location of the element to add (must not be null * nor empty. - * @exception TaskException Description of Exception */ - public void setLocation( File location ) - throws TaskException + public void setLocation( final File location ) { - if( isReference() ) - { - throw tooManyAttributes(); - } createPathElement().setLocation( location ); } @@ -216,63 +199,28 @@ public class Path * Parses a path definition and creates single PathElements. * * @param path the path definition. - * @exception TaskException Description of Exception */ public void setPath( String path ) - throws TaskException { - if( isReference() ) - { - throw tooManyAttributes(); - } createPathElement().setPath( path ); } - /** - * Makes this instance in effect a reference to another Path instance.

- * - * You must not set another attribute or nest elements inside this element - * if you make it a reference.

- * - * @param r The new Refid value - * @exception TaskException Description of Exception - */ - public void setRefid( Reference r ) - throws TaskException - { - if( !elements.isEmpty() ) - { - throw tooManyAttributes(); - } - elements.add( r ); - super.setRefid( r ); - } - /** * Adds the components on the given path which exist to this Path. * Components that don't exist, aren't added. * * @param source - source path whose components are examined for existence */ - public void addExisting( Path source ) + public void addExisting( final Path source ) throws TaskException { - String[] list = source.list(); + final String[] list = source.list(); for( int i = 0; i < list.length; i++ ) { - File f = null; - if( getProject() != null ) - { - f = resolveFile( list[ i ] ); - } - else - { - f = new File( list[ i ] ); - } - - if( f.exists() ) + final File file = new File( list[ i ] ); + if( file.exists() ) { - setLocation( f ); + setLocation( file ); } } } @@ -281,8 +229,6 @@ public class Path * Emulation of extdirs feature in java >= 1.2. This method adds all files * in the given directories (but not in sub-directories!) to the classpath, * so that you don't have to specify them all one by one. - * - * @param extdirs The feature to be added to the Extdirs attribute */ public void addExtdirs( Path extdirs ) throws TaskException @@ -300,16 +246,16 @@ public class Path } } - String[] dirs = extdirs.list(); + final String[] dirs = extdirs.list(); for( int i = 0; i < dirs.length; i++ ) { - File dir = resolveFile( dirs[ i ] ); + final File dir = resolveFile( dirs[ i ] ); if( dir.exists() && dir.isDirectory() ) { - FileSet fs = new FileSet(); - fs.setDir( dir ); - fs.setIncludes( "*" ); - addFileset( fs ); + final FileSet fileSet = new FileSet(); + fileSet.setDir( dir ); + fileSet.setIncludes( "*" ); + addFileset( fileSet ); } } } @@ -320,15 +266,9 @@ public class Path * @param fs The feature to be added to the Fileset attribute * @exception TaskException Description of Exception */ - public void addFileset( FileSet fs ) - throws TaskException + public void addFileset( final FileSet fileSet ) { - if( isReference() ) - { - throw noChildrenAllowed(); - } - elements.add( fs ); - checked = false; + elements.add( fileSet ); } /** @@ -382,42 +322,24 @@ public class Path /** * Append the contents of the other Path instance to this. - * - * @param other Description of Parameter */ - public void append( Path other ) + public void append( final Path other ) throws TaskException { - if( other == null ) - return; - String[] l = other.list(); - for( int i = 0; i < l.length; i++ ) + if( null == other ) { - if( elements.indexOf( l[ i ] ) == -1 ) - { - elements.add( l[ i ] ); - } + throw new NullPointerException( "other" ); } - } - /** - * Return a Path that holds the same elements as this instance. - * - * @return Description of the Returned Value - */ - public Object clone() - { - try - { - Path p = new Path(); - p.append( this ); - return p; - } - catch( TaskException e ) + final String[] list = other.list(); + for( int i = 0; i < list.length; i++ ) { - throw new IllegalStateException( e.getMessage() ); + final String file = list[ i ]; + if( elements.contains( file ) ) + { + elements.add( file ); + } } - } /** @@ -459,20 +381,17 @@ public class Path { // only: the developer knows what (s)he is doing result.addExisting( Path.systemClasspath ); - } else if( order.equals( "first" ) ) { // first: developer could use a little help result.addExisting( Path.systemClasspath ); result.addExisting( this ); - } else if( order.equals( "ignore" ) ) { // ignore: don't trust anyone result.addExisting( this ); - } else { @@ -499,50 +418,27 @@ public class Path public Path createPath() throws TaskException { - if( isReference() ) - { - throw noChildrenAllowed(); - } - Path p = new Path(); - elements.add( p ); - checked = false; - return p; + final Path other = new Path(); + elements.add( other ); + return other; } /** * Creates the nested <pathelement> element. - * - * @return Description of the Returned Value - * @exception TaskException Description of Exception */ public PathElement createPathElement() - throws TaskException { - if( isReference() ) - { - throw noChildrenAllowed(); - } - PathElement pe = new PathElement(); - elements.add( pe ); - return pe; + final PathElement pathElement = new PathElement(); + elements.add( pathElement ); + return pathElement; } /** * Returns all path elements defined by this and nested path objects. - * - * @return list of path elements. */ public String[] list() throws TaskException { - if( !checked ) - { - // make sure we don't have a circular reference here - Stack stk = new Stack(); - stk.push( this ); - dieOnCircularReference( stk, getProject() ); - } - ArrayList result = new ArrayList( 2 * elements.size() ); for( int i = 0; i < elements.size(); i++ ) { @@ -599,14 +495,11 @@ public class Path } } } - String[] res = new String[ result.size() ]; - return (String[])result.toArray( res ); + return (String[])result.toArray( new String[ result.size() ] ); } /** * How many parts does this Path instance consist of. - * - * @return Description of the Returned Value */ public int size() throws TaskException @@ -673,52 +566,8 @@ public class Path } } - /** - * Overrides the version of DataType to recurse on all DataType child - * elements that may have been added. - * - * @param stk Description of Parameter - * @param p Description of Parameter - * @exception TaskException Description of Exception - */ - protected void dieOnCircularReference( Stack stk, Project p ) - throws TaskException - { - if( checked ) - { - return; - } - - Iterator enum = elements.iterator(); - while( enum.hasNext() ) - { - Object o = enum.next(); - if( o instanceof Reference ) - { - o = ( (Reference)o ).getReferencedObject( p ); - } - - if( o instanceof DataType ) - { - if( stk.contains( o ) ) - { - throw circularReference(); - } - else - { - stk.push( o ); - ( (DataType)o ).dieOnCircularReference( stk, p ); - stk.pop(); - } - } - } - checked = true; - } - /** * Helper class, holds the nested <pathelement> values. - * - * @author RT */ public class PathElement { @@ -731,7 +580,7 @@ public class Path public void setPath( String path ) { - parts = translatePath( getProject(), path ); + parts = translatePath( getProject().getBaseDir(), path ); } public String[] getParts() diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/types/PatternSet.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/types/PatternSet.java index 14a349eee..fd8b40652 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/types/PatternSet.java +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/types/PatternSet.java @@ -16,6 +16,7 @@ import java.util.Iterator; import java.util.StringTokenizer; import org.apache.myrmidon.api.TaskException; import org.apache.tools.ant.Project; +import org.apache.tools.ant.ProjectComponent; /** * Named collection of include/exclude tags.

@@ -31,7 +32,7 @@ import org.apache.tools.ant.Project; * @author Stefan Bodewig */ public class PatternSet - extends DataType + extends ProjectComponent { private ArrayList m_includeList = new ArrayList(); private ArrayList m_excludeList = new ArrayList(); diff --git a/proposal/myrmidon/src/todo/org/apache/tools/ant/types/RegularExpression.java b/proposal/myrmidon/src/todo/org/apache/tools/ant/types/RegularExpression.java index 69e90c9e0..4018508b1 100644 --- a/proposal/myrmidon/src/todo/org/apache/tools/ant/types/RegularExpression.java +++ b/proposal/myrmidon/src/todo/org/apache/tools/ant/types/RegularExpression.java @@ -7,9 +7,8 @@ */ package org.apache.tools.ant.types; -import java.util.Stack; import org.apache.myrmidon.api.TaskException; -import org.apache.tools.ant.Project; +import org.apache.tools.ant.ProjectComponent; import org.apache.tools.ant.util.regexp.Regexp; import org.apache.tools.ant.util.regexp.RegexpFactory; @@ -42,79 +41,37 @@ import org.apache.tools.ant.util.regexp.RegexpFactory; * @see java.util.regex.Pattern * @see org.apache.tools.ant.util.regexp.Regexp */ -public class RegularExpression extends DataType +public class RegularExpression + extends ProjectComponent { - public final static String DATA_TYPE_NAME = "regularexpression"; - // The regular expression factory private final static RegexpFactory factory = new RegexpFactory(); - private Regexp regexp; + private Regexp m_regexp; public RegularExpression() throws TaskException { - this.regexp = factory.newRegexp(); + m_regexp = factory.newRegexp(); } - public void setPattern( String pattern ) + public void setPattern( final String pattern ) throws TaskException { - this.regexp.setPattern( pattern ); + m_regexp.setPattern( pattern ); } /** * Gets the pattern string for this RegularExpression in the given project. - * - * @param p Description of Parameter - * @return The Pattern value */ - public String getPattern( Project p ) + public String getPattern() throws TaskException { - if( isReference() ) - return getRef( p ).getPattern( p ); - - return regexp.getPattern(); + return m_regexp.getPattern(); } - /** - * Get the RegularExpression this reference refers to in the given project. - * Check for circular references too - * - * @param p Description of Parameter - * @return The Ref value - */ - public RegularExpression getRef( Project p ) - throws TaskException + public Regexp getRegexp() { - if( !checked ) - { - Stack stk = new Stack(); - stk.push( this ); - dieOnCircularReference( stk, p ); - } - - Object o = ref.getReferencedObject( p ); - if( !( o instanceof RegularExpression ) ) - { - String msg = ref.getRefId() + " doesn\'t denote a regularexpression"; - throw new TaskException( msg ); - } - else - { - return (RegularExpression)o; - } + return m_regexp; } - - public Regexp getRegexp( Project p ) - throws TaskException - { - if( isReference() ) - { - return getRef( p ).getRegexp( p ); - } - return this.regexp; - } - }