Hello,
I tried to write a Jelly Unit test case for Ant filtersets. Thanks James
Strachan for the pointers.
Here is my test case I used:
<!-- test case to show how filtersets are broken -->
<test:case name="antFilterset">
<ant:filterset id="maven.webserver.filterset.default">
<ant:filter token="maven.webserver.home" value="some dir" />
</ant:filterset>
<ant:copy file="src/test/org/apache/commons/jelly/ant/AntFilterset.txt"
tofile="src/test/org/apache/commons/jelly/ant/AntFilterset.properties">
<ant:filterset refid="maven.webserver.filterset.default" />
</ant:copy>
</test:case>
[java] [ERROR] AntTag - -Class org.apache.commons.jelly.tags.junit.CaseTag
doesn't support the nested "filterset" element.
[java] [echo]
[java] [echo]
[java] [copy] Copying 1 file to
G:\cygwin\home\plynch\dev\apache\jakarta-commons-sandbox\jelly\src\test\org\apac
he\commons\jelly\ant
Before the copy AntFilterset.txt file contains simply:
maven.webserver.home=@maven.webserver.home@
After the copy, u guessed it:
maven.webserver.home=@maven.webserver.home@
Needless to say the filter token was not replaced in the copied file. Something
needs to be done in order for the filterset to be nested in the case tag for
starters.
To assert if the filter succeeds, I was going to read in the copied property
file and then test the property in the AntFilterset.properties for it's value.
Please note...
This failed case has been around in Maven for a long time. To reproduce in
Maven, define a goal similar to this one, assuming all properties are set in a
plugin.properties:
<goal name="testFilterset">
<ant:filterset id="maven.webserver.filterset.default">
<ant:filter token="maven.webserver.home" value="${maven.webserver.home}"
/>
<ant:filter token="maven.webserver.name" value="${maven.webserver.name}"
/>
<ant:filter token="maven.webserver.version"
value="${maven.webserver.version}" />
<ant:filter token="maven.webserver.port.http"
value="${maven.webserver.port.http}" />
<ant:filter token="maven.webserver.port.https"
value="${maven.webserver.port.https}" />
<ant:filter token="maven.webserver.port.one"
value="${maven.webserver.port.one}" />
<ant:filter token="maven.webserver.port.two"
value="${maven.webserver.port.two}" />
<ant:filter token="maven.webserver.port.three"
value="${maven.webserver.port.three}" />
<ant:filter token="maven.webserver.conf.dir"
value="${maven.webserver.conf.dir}" />
<ant:filter token="maven.webserver.host" value="${maven.webserver.host}"
/>
</ant:filterset>
<!-- copy any user configuration files w/ filtering by forcing copy -->
<!-- expecting at least a httpd.conf -->
<ant:copy todir="${maven.webserver.dir}" overwrite="true">
<ant:fileset dir="${maven.webserver.conf.dir}" />
<ant:filterset refid="maven.webserver.filterset.default" />
<ant:filterset refid="maven.webserver.filterset" />
</ant:copy>
</goal>
Any files copied that contain any tokens do not get filtered with their property
value.
The only case I have found filtersets to work is demonstrated by Maven Cactus
plugin. Here is an example from Maven's Cactus plugin:
<copy todir="${maven.cactus.build.resources.dir}"
file="${maven.cactus.configFile}" filtering="on">
<filterset>
<filter token="maven.cactus.port" value="${maven.cactus.port}"/>
</filterset>
</copy>
Poor Vincent ( Cactus plugin developer ) seems to be fooling himself that
filtersets are playing happily, and by rights he does get the token replaced in
his copied file. ( Hi Vincent :)
In this case the port number from plugin.properties gets replaced, but only
because the attribute filtering="on" is there and the nested filterset is not
using a refid. Not to mention that the nested filterset should work without
filtering="on" as per the Ant docs re that attribute of the copy task:
>From Ant documentation:
" Indicates whether token filtering using the global build-file filters should
take place during the copy. Note: Nested <filterset> elements will always be
used, even if this attribute is not specified, or its value is false (no, or
off). "
I looked at Jelly's AntTag.java off and on over the past month trying to figure
out
how to fix this, but no luck so far. This one haunts me.
( Attention Maven users: Any proposed fix should also consider what happens when
the filterset is defined in a prereq goal and referenced inside a goal inside an
jelly script imported into the script which defines the filterset. :) )
Any Jelly gurus know what is up?
-Peter
--
To unsubscribe, e-mail: <mailto:commons-dev-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:commons-dev-help@jakarta.apache.org>