git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271033 13f79535-47bb-0310-9956-ffa450edef68master
@@ -5,50 +5,75 @@ | |||||
<body> | <body> | ||||
<h2><a name="loadfile">LoadFile</a></h2> | <h2><a name="loadfile">LoadFile</a></h2> | ||||
<h3>Description</h3> | <h3>Description</h3> | ||||
<p> | <p> | ||||
Load a text file into a single property. Unless an encoding is specified, | Load a text file into a single property. Unless an encoding is specified, | ||||
the encoding of the current locale is used. There is no explicit limit | the encoding of the current locale is used. There is no explicit limit | ||||
upon the size of the file which can be loaded, but loading very large | upon the size of the file which can be loaded, but loading very large | ||||
files is not something anyone has yet explored. | |||||
files is not something anyone has yet explored. Because the file is | |||||
converted to text | |||||
</p> | </p> | ||||
<h3>Parameters</h3> | <h3>Parameters</h3> | ||||
<table border="1" cellpadding="2" cellspacing="0"> | <table border="1" cellpadding="2" cellspacing="0"> | ||||
<tr> | |||||
<tr> | |||||
<td valign="top"><b>Attribute</b></td> | <td valign="top"><b>Attribute</b></td> | ||||
<td valign="top"><b>Description</b></td> | <td valign="top"><b>Description</b></td> | ||||
<td align="center" valign="top"><b>Required</b></td> | <td align="center" valign="top"><b>Required</b></td> | ||||
</tr> | </tr> | ||||
<tr> | |||||
<tr> | |||||
<td valign="top">srcFile</td> | <td valign="top">srcFile</td> | ||||
<td valign="top">source file</td> | <td valign="top">source file</td> | ||||
<td valign="top" align="center">Yes</td> | <td valign="top" align="center">Yes</td> | ||||
</tr> | </tr> | ||||
<tr> | |||||
<tr> | |||||
<td valign="top">property</td> | <td valign="top">property</td> | ||||
<td valign="top">property to save to</td> | <td valign="top">property to save to</td> | ||||
<td valign="top" align="center">Yes</td> | <td valign="top" align="center">Yes</td> | ||||
</tr> | </tr> | ||||
<tr> | |||||
<tr> | |||||
<td valign="top">encoding</td> | <td valign="top">encoding</td> | ||||
<td valign="top">encoding to use when loading the file</td> | <td valign="top">encoding to use when loading the file</td> | ||||
<td align="center" valign="top">No</td> | <td align="center" valign="top">No</td> | ||||
</tr> | </tr> | ||||
<tr> | |||||
<tr> | |||||
<td valign="top">failonerror</td> | <td valign="top">failonerror</td> | ||||
<td valign="top">Whether to halt the build on failure</td> | <td valign="top">Whether to halt the build on failure</td> | ||||
<td align="center" valign="top">No, default "true"</td> | <td align="center" valign="top">No, default "true"</td> | ||||
</tr> | </tr> | ||||
<tr> | |||||
<td valign="top">evaluateProperties</td> | |||||
<td valign="top">flag to enable property evalation in the file</td> | |||||
<td align="center" valign="top">No, default "false"</td> | |||||
</tr> | |||||
<tr> | |||||
<td valign="top">makeOneLine</td> | |||||
<td valign="top">flag to strip out newlines (but not spaces or | |||||
tabs) from the file</td> | |||||
<td align="center" valign="top">No, default "false"</td> | |||||
</tr> | |||||
</table> | </table> | ||||
<p> | |||||
The <tt>makeOneLine</tt> parameter enables you to use a file as an | |||||
input to task parameters which expect single line input. It flattens | |||||
the file by removing all carriage return and line feed characters, | |||||
so that the file | |||||
<pre>a | |||||
b | |||||
c | |||||
</pre>would become "abc": you need spaces or | |||||
commas at the end/start of line to stop alphanumeric characters | |||||
being merged together. | |||||
<h3>Examples</h3> | <h3>Examples</h3> | ||||
<pre> <loadfile property="mail.recipients" | |||||
srcFile="recipients.txt" / > | |||||
<pre> <loadfile property="message" | |||||
srcFile="message.txt" / > | |||||
</pre> | </pre> | ||||
Load file recipients.txt into property "mail.recipients" | |||||
Load file message.txt into property "message"; an <tt><echo></tt> | |||||
can print this. | |||||
<pre> <loadfile property="encoded-file" | <pre> <loadfile property="encoded-file" | ||||
srcFile="loadfile.xml" | srcFile="loadfile.xml" | ||||
@@ -56,16 +81,35 @@ Load file recipients.txt into property "mail.recipients" | |||||
</pre> | </pre> | ||||
Load a file using the latin-1 encoding | Load a file using the latin-1 encoding | ||||
<pre> <loadfile | |||||
property="optional.value" | |||||
srcFile="optional.txt" | |||||
<pre> <loadfile | |||||
property="optional.value" | |||||
srcFile="optional.txt" | |||||
failonerror="false" /> | failonerror="false" /> | ||||
</pre> | </pre> | ||||
Load a file, don't fail if it is missing (a message is printed, though) | |||||
Load a file, don't fail if it is missing (a message is printed, though) | |||||
<pre> <loadfile | |||||
property="mail.recipients" | |||||
srcFile="recipientlist.txt" | |||||
makeOneLine="true" /> | |||||
</pre> | |||||
load a property which can be used as a parameter for another task (in this case mail), | |||||
merging lines to ensure this happens. | |||||
<pre> <loadfile | |||||
property="system.configuration.xml" | |||||
srcFile="configuration.xml" | |||||
evaluateProperties="true" /> | |||||
</pre> | |||||
load an XML file into a property, expanding all properties declared | |||||
in the file in the process. | |||||
<hr> | <hr> | ||||
<p align="center">Copyright © 2001 Apache Software Foundation. All rights | |||||
<p align="center">Copyright © 2001-2002 Apache Software Foundation. All rights | |||||
Reserved.</p> | Reserved.</p> | ||||
</body> | </body> | ||||
@@ -1,19 +1,19 @@ | |||||
<?xml version="1.0" encoding="ISO-8859-1"?> | <?xml version="1.0" encoding="ISO-8859-1"?> | ||||
<project name="loadfile-test" basedir="." default="testLoadAFile"> | <project name="loadfile-test" basedir="." default="testLoadAFile"> | ||||
<target name="init"> | <target name="init"> | ||||
</target> | </target> | ||||
<target name="testNoSourcefileDefined" depends="init"> | <target name="testNoSourcefileDefined" depends="init"> | ||||
<loadfile property="foo" /> | <loadfile property="foo" /> | ||||
</target> | </target> | ||||
<target name="testNoPropertyDefined" | <target name="testNoPropertyDefined" | ||||
depends="init"> | depends="init"> | ||||
<loadfile srcFile="somefile" /> | <loadfile srcFile="somefile" /> | ||||
</target> | </target> | ||||
<target name="testNoSourcefilefound" | <target name="testNoSourcefilefound" | ||||
depends="init"> | depends="init"> | ||||
@@ -22,15 +22,15 @@ | |||||
<target name="testFailOnError" | <target name="testFailOnError" | ||||
depends="init"> | depends="init"> | ||||
<loadfile | |||||
property="testFailOnError" | |||||
srcFile="somefile" | |||||
<loadfile | |||||
property="testFailOnError" | |||||
srcFile="somefile" | |||||
failonerror="false"/> | failonerror="false"/> | ||||
</target> | |||||
</target> | |||||
<target name="testLoadAFile" | <target name="testLoadAFile" | ||||
depends="init"> | depends="init"> | ||||
<echo | |||||
<echo | |||||
message="What's it going to be then, eh?" | message="What's it going to be then, eh?" | ||||
file="loadfile1.tmp" | file="loadfile1.tmp" | ||||
/> | /> | ||||
@@ -44,9 +44,38 @@ | |||||
srcFile="loadfile.xml" | srcFile="loadfile.xml" | ||||
encoding="ISO-8859-1"/> | encoding="ISO-8859-1"/> | ||||
</target> | </target> | ||||
<target name="cleanup"> | |||||
<target name="testEvalProps" | |||||
depends="init"> | |||||
<property name="weather" value="rain" /> | |||||
<echo | |||||
message="All these moments will be lost in time, like teardrops in the ${weather}" | |||||
file="loadfile1.tmp" | |||||
/> | |||||
<loadfile property="testEvalProps" | |||||
srcFile="loadfile1.tmp" | |||||
evaluateProperties="true" | |||||
/> | |||||
<echo>${testLoadAFile}</echo> | |||||
</target> | |||||
<target name="testOneLine" | |||||
depends="init"> | |||||
<echo | |||||
message="1, 2, 3, 4" | |||||
file="loadfile1.tmp" | |||||
/> | |||||
<loadfile property="testOneLine" | |||||
srcFile="loadfile1.tmp" | |||||
makeOneLine="true" | |||||
/> | |||||
<echo>${testLoadAFile}</echo> | |||||
</target> | |||||
<target name="cleanup"> | |||||
<delete file="loadfile1.tmp"/> | <delete file="loadfile1.tmp"/> | ||||
</target> | </target> | ||||
</project> | </project> |
@@ -1,7 +1,7 @@ | |||||
/* | /* | ||||
* The Apache Software License, Version 1.1 | * The Apache Software License, Version 1.1 | ||||
* | * | ||||
* Copyright (c) 2001 The Apache Software Foundation. All rights | |||||
* Copyright (c) 2001-2002 The Apache Software Foundation. All rights | |||||
* reserved. | * reserved. | ||||
* | * | ||||
* Redistribution and use in source and binary forms, with or without | * Redistribution and use in source and binary forms, with or without | ||||
@@ -56,14 +56,10 @@ package org.apache.tools.ant.taskdefs; | |||||
import org.apache.tools.ant.Task; | import org.apache.tools.ant.Task; | ||||
import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
import org.apache.tools.ant.ProjectHelper; | |||||
import java.io.File; | |||||
import java.io.FileInputStream; | |||||
import java.io.InputStreamReader; | |||||
import java.io.IOException; | |||||
import java.io.BufferedInputStream; | |||||
import java.io.*; | |||||
/** | /** | ||||
* Load a file into a property | * Load a file into a property | ||||
@@ -95,6 +91,16 @@ public class LoadFile extends Task { | |||||
private String property = null; | private String property = null; | ||||
/** flag to control if we flatten the file or no' | |||||
* | |||||
*/ | |||||
private boolean makeOneLine=false; | |||||
/** | |||||
* flag to control whether props get evaluated or not | |||||
*/ | |||||
private boolean evaluateProperties=false; | |||||
/** | /** | ||||
* Encoding to use for filenames, defaults to the platform's default | * Encoding to use for filenames, defaults to the platform's default | ||||
* encoding. <p> | * encoding. <p> | ||||
@@ -140,6 +146,22 @@ public class LoadFile extends Task { | |||||
failOnError = fail; | failOnError = fail; | ||||
} | } | ||||
/** | |||||
* setter to flatten the file to a single line | |||||
* @since 1.6 | |||||
*/ | |||||
public void setMakeOneLine(boolean makeOneLine) { | |||||
this.makeOneLine=makeOneLine; | |||||
} | |||||
/** | |||||
* setter to eval properties. | |||||
* @since 1.6 | |||||
*/ | |||||
public void setEvaluateProperties(boolean evaluateProperties) { | |||||
this.evaluateProperties=evaluateProperties; | |||||
} | |||||
/** | /** | ||||
* read in a source file to a property | * read in a source file to a property | ||||
@@ -157,7 +179,7 @@ public class LoadFile extends Task { | |||||
} | } | ||||
FileInputStream fis = null; | FileInputStream fis = null; | ||||
BufferedInputStream bis = null; | BufferedInputStream bis = null; | ||||
InputStreamReader instream = null; | |||||
Reader instream = null; | |||||
log("loading "+srcFile+" into property "+property,Project.MSG_VERBOSE); | log("loading "+srcFile+" into property "+property,Project.MSG_VERBOSE); | ||||
try { | try { | ||||
long len = srcFile.length(); | long len = srcFile.length(); | ||||
@@ -179,6 +201,12 @@ public class LoadFile extends Task { | |||||
} | } | ||||
instream.read(buffer); | instream.read(buffer); | ||||
String text = new String(buffer); | String text = new String(buffer); | ||||
if (makeOneLine) { | |||||
text=stripLineBreaks(text); | |||||
} | |||||
if(evaluateProperties) { | |||||
text=ProjectHelper.replaceProperties(project,text); | |||||
} | |||||
project.setNewProperty(property, text); | project.setNewProperty(property, text); | ||||
log("loaded "+buffer.length+" characters",Project.MSG_VERBOSE); | log("loaded "+buffer.length+" characters",Project.MSG_VERBOSE); | ||||
log(property+" := "+text,Project.MSG_DEBUG); | log(property+" := "+text,Project.MSG_DEBUG); | ||||
@@ -201,5 +229,28 @@ public class LoadFile extends Task { | |||||
} | } | ||||
} | } | ||||
/** | |||||
* strip out all line breaks from a string. | |||||
* @param source source | |||||
* This implementation always duplicates the string; it is nominally possible to probe | |||||
* the string first looking for any line breaks before bothering to do a copy. But we assume if | |||||
* the option is requested, then line breaks are probably in the source string. | |||||
*/ | |||||
protected String stripLineBreaks(String source) { | |||||
//Linebreaks. What do to on funny IBM mainframes with odd line endings? | |||||
String linebreaks="\r\n"; | |||||
int len=source.length(); | |||||
StringBuffer dest=new StringBuffer(len); | |||||
for(int i=0;i<len;++i) { | |||||
char ch=source.charAt(i); | |||||
if(linebreaks.indexOf(ch)==-1) { | |||||
dest.append(ch); | |||||
} | |||||
} | |||||
return new String(dest); | |||||
} | |||||
//end class | //end class | ||||
} | } |
@@ -1,7 +1,7 @@ | |||||
/* | /* | ||||
* The Apache Software License, Version 1.1 | * The Apache Software License, Version 1.1 | ||||
* | * | ||||
* Copyright (c) 2001 The Apache Software Foundation. All rights | |||||
* Copyright (c) 2001-2002 The Apache Software Foundation. All rights | |||||
* reserved. | * reserved. | ||||
* | * | ||||
* Redistribution and use in source and binary forms, with or without | * Redistribution and use in source and binary forms, with or without | ||||
@@ -124,10 +124,7 @@ public class LoadFileTest extends BuildFileTest { | |||||
*/ | */ | ||||
public void testFailOnError() | public void testFailOnError() | ||||
throws BuildException { | throws BuildException { | ||||
executeTarget("testFailOnError"); | |||||
if(project.getProperty("testFailOnError")!=null) { | |||||
fail("property should not have been defined"); | |||||
} | |||||
expectPropertyUnset("testFailOnError","testFailOnError"); | |||||
} | } | ||||
@@ -152,9 +149,27 @@ public class LoadFileTest extends BuildFileTest { | |||||
if(project.getProperty("testLoadAFileEnc")==null) { | if(project.getProperty("testLoadAFileEnc")==null) { | ||||
fail("file load failed"); | fail("file load failed"); | ||||
} | } | ||||
} | |||||
/** | |||||
* A unit test for JUnit | |||||
*/ | |||||
public void testEvalProps() | |||||
throws BuildException { | |||||
executeTarget("testEvalProps"); | |||||
if(project.getProperty("testEvalProps").indexOf("rain")<0) { | |||||
fail("property eval broken"); | |||||
} | |||||
} | } | ||||
/** | |||||
* A unit test for JUnit | |||||
*/ | |||||
public void testOneLine() | |||||
throws BuildException { | |||||
expectPropertySet("testOneLine","testOneLine","1,2,3,4"); | |||||
} | |||||
} | } | ||||