When writing ant build files, I often need to trim the string value of an ant property. But I couldn't find a simple task to do that. So I wrote the following ant macrodef for this purpose. In short, it saves the property value into a temp file, trims lines while moving the file, and loads the file back into a new property.
<project basedir="." default="trim" name="test">
<target name="trim">
<trim input="${text}" property="text.trimmed">
<echo message="original text='${text}'">
<echo message="trimmed text='${text.trimmed}'">
</echo>
<macrodef name="trim">
<attribute name="input">
<attribute name="property">
<sequential>
<tempfile property="temp.file">
<echo file="${temp.file}" message="@{input}">
<move file="${temp.file}" tofile="${temp.file}.2">
<filterchain>
<trim>
</trim>
</filterchain>
<loadfile property="@{property}" srcfile="${temp.file}.2">
<delete failonerror="false" file="${temp.file}.2">
</delete>
</loadfile>
</move></echo></tempfile></sequential></attribute></attribute></macrodef></echo></trim></target>
To run this target:
/tmp > ant -Dtext=' a b c '
Buildfile: build.xml
trim:
[move] Moving 1 file to /tmp
[delete] Deleting: /tmp/null1355243589.2
[echo] original text=' a b c '
[echo] trimmed text='a b c'
BUILD SUCCESSFUL
Total time: 0 seconds
The ant macro named trim declares the trim operation, while the trim target shows an example of calling the trim macro.
There are other solutions to achive the same result, e.g., write a custom ant task, or use ant-contrib tasks. But the advantage of this sample is that it only uses built-in ant tasks and no other library jars are needed.