Browse Source

Removed DataType and maual handling of references etc

git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@270510 13f79535-47bb-0310-9956-ffa450edef68
master
Peter Donald 23 years ago
parent
commit
0c0ea74958
18 changed files with 374 additions and 1634 deletions
  1. +0
    -177
      proposal/myrmidon/src/main/org/apache/tools/ant/types/DataType.java
  2. +14
    -96
      proposal/myrmidon/src/main/org/apache/tools/ant/types/FileList.java
  3. +2
    -1
      proposal/myrmidon/src/main/org/apache/tools/ant/types/FileSet.java
  4. +78
    -0
      proposal/myrmidon/src/main/org/apache/tools/ant/types/Filter.java
  5. +14
    -169
      proposal/myrmidon/src/main/org/apache/tools/ant/types/FilterSet.java
  6. +15
    -117
      proposal/myrmidon/src/main/org/apache/tools/ant/types/Mapper.java
  7. +51
    -202
      proposal/myrmidon/src/main/org/apache/tools/ant/types/Path.java
  8. +2
    -1
      proposal/myrmidon/src/main/org/apache/tools/ant/types/PatternSet.java
  9. +11
    -54
      proposal/myrmidon/src/main/org/apache/tools/ant/types/RegularExpression.java
  10. +0
    -177
      proposal/myrmidon/src/todo/org/apache/tools/ant/types/DataType.java
  11. +14
    -96
      proposal/myrmidon/src/todo/org/apache/tools/ant/types/FileList.java
  12. +2
    -1
      proposal/myrmidon/src/todo/org/apache/tools/ant/types/FileSet.java
  13. +78
    -0
      proposal/myrmidon/src/todo/org/apache/tools/ant/types/Filter.java
  14. +14
    -169
      proposal/myrmidon/src/todo/org/apache/tools/ant/types/FilterSet.java
  15. +15
    -117
      proposal/myrmidon/src/todo/org/apache/tools/ant/types/Mapper.java
  16. +51
    -202
      proposal/myrmidon/src/todo/org/apache/tools/ant/types/Path.java
  17. +2
    -1
      proposal/myrmidon/src/todo/org/apache/tools/ant/types/PatternSet.java
  18. +11
    -54
      proposal/myrmidon/src/todo/org/apache/tools/ant/types/RegularExpression.java

+ 0
- 177
proposal/myrmidon/src/main/org/apache/tools/ant/types/DataType.java View File

@@ -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. <p>
*
* 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. &lt;patternset&gt; but not &lt;path&gt;).</p>
*
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
*/
public abstract class DataType
extends ProjectComponent
{
/**
* Value to the refid attribute.
*/
protected Reference ref;

/**
* Are we sure we don't hold circular references? <p>
*
* 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).</p>
*/
protected boolean checked = true;

/**
* Set the value of the refid attribute. <p>
*
* 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 <code>super.setRefid</code>.</p>
*
* @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). <p>
*
* If one is included, throw a TaskException created by {@link
* #circularReference circularReference}.</p> <p>
*
* This implementation is appropriate only for a DataType that cannot hold
* other DataTypes as children.</p> <p>
*
* The general contract of this method is that it shouldn't do anything if
* {@link #checked <code>checked</code>} is true and set it to true on exit.
* </p>
*
* @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" );
}
}

+ 14
- 96
proposal/myrmidon/src/main/org/apache/tools/ant/types/FileList.java View File

@@ -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 <a href="mailto:cstrong@arielpartners.com">Craeg Strong</a>
* @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.
* <p>
*
* You must not set another attribute or nest elements inside this element
* if you make it a reference.</p>
*
* @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
}

+ 2
- 1
proposal/myrmidon/src/main/org/apache/tools/ant/types/FileSet.java View File

@@ -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 <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a>
*/
public class FileSet
extends DataType
extends ProjectComponent
implements Cloneable
{
private PatternSet m_defaultPatterns = new PatternSet();


+ 78
- 0
proposal/myrmidon/src/main/org/apache/tools/ant/types/Filter.java View File

@@ -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;
}
}

+ 14
- 169
proposal/myrmidon/src/main/org/apache/tools/ant/types/FilterSet.java View File

@@ -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
*/


+ 15
- 117
proposal/myrmidon/src/main/org/apache/tools/ant/types/Mapper.java View File

@@ -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 <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
*/
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. <p>
*
* You must not set any other attribute if you make it a reference.</p>
*
* @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;
}
}

}

+ 51
- 202
proposal/myrmidon/src/main/org/apache/tools/ant/types/Path.java View File

@@ -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 <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
*/

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. <p>
*
* Assume the filename is absolute if project is null.</p>
*
* @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 <code>null</code>
* 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. <p>
*
* You must not set another attribute or nest elements inside this element
* if you make it a reference.</p>
*
* @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 <code>&lt;pathelement&gt;</code> 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 <code>&lt;pathelement&gt;</code> 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()


+ 2
- 1
proposal/myrmidon/src/main/org/apache/tools/ant/types/PatternSet.java View File

@@ -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. <p>
@@ -31,7 +32,7 @@ import org.apache.tools.ant.Project;
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
*/
public class PatternSet
extends DataType
extends ProjectComponent
{
private ArrayList m_includeList = new ArrayList();
private ArrayList m_excludeList = new ArrayList();


+ 11
- 54
proposal/myrmidon/src/main/org/apache/tools/ant/types/RegularExpression.java View File

@@ -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;
}

}

+ 0
- 177
proposal/myrmidon/src/todo/org/apache/tools/ant/types/DataType.java View File

@@ -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. <p>
*
* 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. &lt;patternset&gt; but not &lt;path&gt;).</p>
*
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
*/
public abstract class DataType
extends ProjectComponent
{
/**
* Value to the refid attribute.
*/
protected Reference ref;

/**
* Are we sure we don't hold circular references? <p>
*
* 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).</p>
*/
protected boolean checked = true;

/**
* Set the value of the refid attribute. <p>
*
* 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 <code>super.setRefid</code>.</p>
*
* @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). <p>
*
* If one is included, throw a TaskException created by {@link
* #circularReference circularReference}.</p> <p>
*
* This implementation is appropriate only for a DataType that cannot hold
* other DataTypes as children.</p> <p>
*
* The general contract of this method is that it shouldn't do anything if
* {@link #checked <code>checked</code>} is true and set it to true on exit.
* </p>
*
* @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" );
}
}

+ 14
- 96
proposal/myrmidon/src/todo/org/apache/tools/ant/types/FileList.java View File

@@ -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 <a href="mailto:cstrong@arielpartners.com">Craeg Strong</a>
* @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.
* <p>
*
* You must not set another attribute or nest elements inside this element
* if you make it a reference.</p>
*
* @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
}

+ 2
- 1
proposal/myrmidon/src/todo/org/apache/tools/ant/types/FileSet.java View File

@@ -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 <a href="mailto:umagesh@rediffmail.com">Magesh Umasankar</a>
*/
public class FileSet
extends DataType
extends ProjectComponent
implements Cloneable
{
private PatternSet m_defaultPatterns = new PatternSet();


+ 78
- 0
proposal/myrmidon/src/todo/org/apache/tools/ant/types/Filter.java View File

@@ -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;
}
}

+ 14
- 169
proposal/myrmidon/src/todo/org/apache/tools/ant/types/FilterSet.java View File

@@ -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
*/


+ 15
- 117
proposal/myrmidon/src/todo/org/apache/tools/ant/types/Mapper.java View File

@@ -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 <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
*/
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. <p>
*
* You must not set any other attribute if you make it a reference.</p>
*
* @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;
}
}

}

+ 51
- 202
proposal/myrmidon/src/todo/org/apache/tools/ant/types/Path.java View File

@@ -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 <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
*/

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. <p>
*
* Assume the filename is absolute if project is null.</p>
*
* @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 <code>null</code>
* 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. <p>
*
* You must not set another attribute or nest elements inside this element
* if you make it a reference.</p>
*
* @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 <code>&lt;pathelement&gt;</code> 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 <code>&lt;pathelement&gt;</code> 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()


+ 2
- 1
proposal/myrmidon/src/todo/org/apache/tools/ant/types/PatternSet.java View File

@@ -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. <p>
@@ -31,7 +32,7 @@ import org.apache.tools.ant.Project;
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a>
*/
public class PatternSet
extends DataType
extends ProjectComponent
{
private ArrayList m_includeList = new ArrayList();
private ArrayList m_excludeList = new ArrayList();


+ 11
- 54
proposal/myrmidon/src/todo/org/apache/tools/ant/types/RegularExpression.java View File

@@ -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;
}

}

Loading…
Cancel
Save