This is a fairly large submission and it touches quite a few files, so here are a few explanations.
- The original aim of this submission is to make Argument a true DataType, that
can exist under a project
just like a Path or a FileSet.
- I also wanted references to Path to Argument, to FileSet to be meaningful,
with an Argument being able to
reference a Path for example. For this purpose I created the CompositeType
interface, implemented by
those three classes.
- A Property can now reference a Path, an Argument, or a FileSet and,
optionally, specify a custom separator.
- The major problem is that to extract a meaningful value out of a FileSet, or
to do a circular reference check
on any of those types, a Project needs to be specified, which is not
compatible with a simple toString()
method. I realized that when any of those types are evaluated only one
project is current: if we are running
nested Ant tasks, there may be several projects but only one is active.
I therefore added three static method to Project:
public static Project create() // creates a project and makes it the
current one (the constructor is now protected).
public static Project getCurrent() // gets the current project.
public static void removeCurrent() // removes the current project, making
the previous one current.
Currently, Projects are simply added to and removed from a Stack. If we ever
venture into multithreaded Ant
tasks, there will probably be one such stack per thread.
At this point, the current project is readily available from any class.
Therefore I have removed any Project parameter
from all the methods and constructors of DataType-derived classes. Obviously,
this is a change in the API.
The next logical step would be to do the same with Tasks (but I haven't done
that yet).
- Path and Argument are very similar. I made them derive both from the class
NestedDataType which derives from
DataType, implements the CompositeType interface, implements
dieOnCircularReference() correctly for nested
data types, and implement several utility methods.
- The class PathElement is gone, since Path could already contain Strings as a
result of append().
- In a build file:
path and pathelement are synonyms.
arg, args, and argument are synonyms.
Maybe we should eliminate some of those synonyms for the sake of clarity.
- Path and FileSet remove their duplicates by default, while Argument does not.
This behavior can be modified
by the noduplicate attribute.
- Path and FileSet use File.pathSeparatorChar as their separator, while
Argument uses space. This behavior can
be modified by the separator attribute. Note that a Property can also refer
to one of those type with a different
separator without altering the object it refers to (separator is a "view"
attribute, while noduplicate is an intrisic
attribute).
- The PathTest was already failing on Windows before I changed anything,
because paths such as "/a" would
be translated into "c:\a". Since I don't find this behavior unreasonnable, I
modified the test to accept this.
If the previous behavior is reinstated, all that is needed is to modifiy the
PathTest.assertPathMatch() method.
- I have added a test for Property and for NestedDataType.
- All the tests on built-in tasks succeed on my machine (W2K).
- I do not have any other optional components that JUnit. Code (in particular
testing code) in those tasks will
probably need to be modified to take into account that the API to Path,
FileSet and PatternSet has changed .
- I have slightly updated the documentation, but I still need to give it more
work.
TODO:
- Make sure that optional tasks still compile and work.
- Find a reasonable value for PatternSet.toString().
- Figure out what a Property is allowed to refer to. For example, at this
point, if a Property refers to another
Property that refers to another Property, its value is null (because it does
not follow references recursively).
- Maybe change Tasks so that their constructors and methods no longer use a
Project parameter.
- If we allow universal reference, a Task then becomes a sort of DataType too.
Note on the patch: I could not get a recursive patch to work on my machine (W2K
+ cygwin 1.1.0).
jakarta-ant.zip will expand to a subset of the jakarta-ant directory structure
with each directory containing
new files (such as NestedDataType) and a patch file (dir.patch) that can be
applied in that directory to get
the other files.
Thank you.
Vincent.
<<attachment: jakarta-ant.zip>>
