3/10/2010

How to trim ant property string value

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.

<?xml version="1.0" encoding="UTF-8"?>
<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}'" />
</target>

<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/>
</filterchain>
</move>
<loadfile property="@{property}" srcFile="${temp.file}.2" />
<delete file="${temp.file}.2" failonerror="false" />
</sequential>
</macrodef>

</project>
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.

6 comments:

Chris Holman said...
This comment has been removed by the author.
Chris Holman said...

File operations like this are relatively slow.
You could also use the ant contrib task propertyregex:

<macrodef name="trim">
  <attribute name="property" />
  <sequential>
    <propertyregex
      property="@{property}"
      input="${@{property}}"
      regexp="[\s]*(.+)[\s]*"
      replace="\1"
      defaultvalue="${@{property}}"
      override="true"
    />
  </sequential>
</macrodef>

yogesh said...
This comment has been removed by the author.
yogesh said...

I have one property file named "yogesh.properties".
This property file is used in filterset
<filterset id="myfilterset">
<filtersfile file="${yogesh.properties}"/>
<filter token="svn.folder.location" value="${svn.folder.location}"/>
<filter token="lastBranchRevision" value="${lastBranchRevision}"/>
this filter set is used in copy
<copy todir="${build.root}/${appname}" filtering="true" >
<filterset refid="myfilterset"/>
<fileset dir="../WebContent">
<include name="**/*.dtd"/>
<include name="WEB-INF/web.xml"/>
<include name="META-INF/context.xml"/>
</fileset>
</copy>
I want to trim values of "yogesh.property"(without change/Edit property file) before it place to the target.How to achieve this?

Steve Smith said...

Great and Useful Article.

Online Java Course

Java Online Training

Java Course Online

J2EE training

online J2EE training

Best Recommended books for Spring framework

Java Interview Questions












Java Training Institutes in Chennai

Java Training in Chennai

J2EE Training in Chennai

java j2ee training institutes in chennai

Steve Smith said...

Great and Useful Article.

Online Java Course

Java Online Training

Java Course Online

J2EE training

online J2EE training

Best Recommended books for Spring framework

Java Interview Questions












Java Training Institutes in Chennai

Java Training in Chennai

J2EE Training in Chennai

java j2ee training institutes in chennai