I am trying to write an Ant <scriptfilter...>
to change occurrences of the string "__LINE__"
to the correct line number in Java source files.
Does anyone have an example of using JavaScript (or some other embedded scripting language) to do this? In particular, how do I create a "global" variable that is initialized to 1
when the script starts and is incremented with each new line?
Thanks.
UPDATE: Just tried the solution offered by Martin Clayton (thanks!), replacing the JavaScript with Beanshell, and it worked perfectly. Here is the Ant target code:
<target name="preprocess" depends="ivy.resolve" description="Preprocess the source code">
<mkdir dir="${target.source.dir}"/>
<copy todir="${target.source.dir}" includeemptydirs="true" failonerror="true" verbose="true">
<fileset dir="${src.dir}"/>
<filterchain>
<tokenfilter>
<filetokenizer/>
<scriptfilter language="beanshell" byline="true" setbeans="true"><![CDATA[
import java.io.BufferedReader;
import java.io.StringReader;
int count = 1;
BufferedReader br = new BufferedReader(new StringReader(self.getToken()));
StringBuilder builder = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
builder.append(line.replace("\"__LINE__\"", Integer.toString(count))).append('\n');
count++;
}
self.setToken(builder.toString());
]]></scriptfilter>
</tokenfilter>
</filterchain>
</copy>
</target>
You could use an ant property to hold the 'static'.
Here's a very simplified example, for one file.
The problem is: that doesn't extend to multiple files - the
lineNumber
doesn't reset to one between files.You might use a
filetokenizer
to get the whole file into javascript in one go, then process the file line-by-line. Here's a very noddy example (I know enough javascript to be dangerous). I'm sure this has lots of faults (not least: it doesn't handle non-newline terminated files; shocking string catenations). But the principle is that by getting each whole file into the script, you don't need any information to persist between script invocations.