Methods Summary |
---|
private java.lang.StringBuffer | buildFilterChain(java.lang.StringBuffer inputBuffer)Creates the chain of filters to operate.
StringBuffer buf = inputBuffer;
for (int i = 0; i < replacefilters.size(); i++) {
Replacefilter filter = (Replacefilter) replacefilters.elementAt(i);
filter.setInputBuffer(buf);
buf = filter.getOutputBuffer();
}
return buf;
|
private org.apache.tools.ant.taskdefs.Replace$Replacefilter | createPrimaryfilter()Adds the token and value as first <replacefilter> element.
The token and value are always processed first.
Replacefilter filter = new Replacefilter();
replacefilters.insertElementAt(filter, 0);
return filter;
|
public org.apache.tools.ant.taskdefs.Replace$NestedString | createReplaceToken()Create a token to filter as the text of a nested element.
if (token == null) {
token = new NestedString();
}
return token;
|
public org.apache.tools.ant.taskdefs.Replace$NestedString | createReplaceValue()Create a string to replace the token as the text of a nested element.
return value;
|
public org.apache.tools.ant.taskdefs.Replace$Replacefilter | createReplacefilter()Add a nested <replacefilter> element.
Replacefilter filter = new Replacefilter();
replacefilters.addElement(filter);
return filter;
|
public void | execute()Do the execution.
Vector savedFilters = (Vector) replacefilters.clone();
Properties savedProperties =
properties == null ? null : (Properties) properties.clone();
if (token != null) {
// line separators in values and tokens are "\n"
// in order to compare with the file contents, replace them
// as needed
StringBuffer val = new StringBuffer(value.getText());
stringReplace(val, "\r\n", "\n");
stringReplace(val, "\n", StringUtils.LINE_SEP);
StringBuffer tok = new StringBuffer(token.getText());
stringReplace(tok, "\r\n", "\n");
stringReplace(tok, "\n", StringUtils.LINE_SEP);
Replacefilter firstFilter = createPrimaryfilter();
firstFilter.setToken(tok.toString());
firstFilter.setValue(val.toString());
}
try {
if (replaceFilterFile != null) {
Properties props = getProperties(replaceFilterFile);
Enumeration e = props.keys();
while (e.hasMoreElements()) {
String tok = e.nextElement().toString();
Replacefilter replaceFilter = createReplacefilter();
replaceFilter.setToken(tok);
replaceFilter.setValue(props.getProperty(tok));
}
}
validateAttributes();
if (propertyFile != null) {
properties = getProperties(propertyFile);
}
validateReplacefilters();
fileCount = 0;
replaceCount = 0;
if (src != null) {
processFile(src);
}
if (dir != null) {
DirectoryScanner ds = super.getDirectoryScanner(dir);
String[] srcs = ds.getIncludedFiles();
for (int i = 0; i < srcs.length; i++) {
File file = new File(dir, srcs[i]);
processFile(file);
}
}
if (summary) {
log("Replaced " + replaceCount + " occurrences in "
+ fileCount + " files.", Project.MSG_INFO);
}
} finally {
replacefilters = savedFilters;
properties = savedProperties;
} // end of finally
|
private void | flushFilterChain()Flushes all filters.
for (int i = 0; i < replacefilters.size(); i++) {
Replacefilter filter = (Replacefilter) replacefilters.elementAt(i);
filter.flush();
}
|
public java.util.Properties | getProperties(java.io.File propertyFile)Load a properties file.
Properties props = new Properties();
FileInputStream in = null;
try {
in = new FileInputStream(propertyFile);
props.load(in);
} catch (FileNotFoundException e) {
String message = "Property file (" + propertyFile.getPath()
+ ") not found.";
throw new BuildException(message);
} catch (IOException e) {
String message = "Property file (" + propertyFile.getPath()
+ ") cannot be loaded.";
throw new BuildException(message);
} finally {
FileUtils.close(in);
}
return props;
|
private void | logFilterChain(java.lang.String filename)Logs the chain of filters to operate on the file.
for (int i = 0; i < replacefilters.size(); i++) {
Replacefilter filter = (Replacefilter) replacefilters.elementAt(i);
log("Replacing in " + filename + ": " + filter.getToken()
+ " --> " + filter.getReplaceValue(), Project.MSG_VERBOSE);
}
|
private void | processFile(java.io.File src)Perform the replacement on the given file.
The replacement is performed on a temporary file which then
replaces the original file.
if (!src.exists()) {
throw new BuildException("Replace: source file " + src.getPath()
+ " doesn't exist", getLocation());
}
File temp = null;
FileInput in = null;
FileOutput out = null;
try {
in = new FileInput(src);
temp = FILE_UTILS.createTempFile("rep", ".tmp",
src.getParentFile());
out = new FileOutput(temp);
int repCountStart = replaceCount;
logFilterChain(src.getPath());
out.setInputBuffer(buildFilterChain(in.getOutputBuffer()));
while (in.readChunk()) {
if (processFilterChain()) {
out.process();
}
}
flushFilterChain();
out.flush();
in.close();
in = null;
out.close();
out = null;
boolean changes = (replaceCount != repCountStart);
if (changes) {
FILE_UTILS.rename(temp, src);
temp = null;
}
} catch (IOException ioe) {
throw new BuildException("IOException in " + src + " - "
+ ioe.getClass().getName() + ":"
+ ioe.getMessage(), ioe, getLocation());
} finally {
if (null != in) {
in.closeQuietly();
}
if (null != out) {
out.closeQuietly();
}
if (temp != null) {
if (!temp.delete()) {
temp.deleteOnExit();
}
}
}
|
private boolean | processFilterChain()Performs the normal processing of the filters.
for (int i = 0; i < replacefilters.size(); i++) {
Replacefilter filter = (Replacefilter) replacefilters.elementAt(i);
if (!filter.process()) {
return false;
}
}
return true;
|
public void | setDir(java.io.File dir)The base directory to use when replacing a token in multiple files;
required if file is not defined.
this.dir = dir;
|
public void | setEncoding(java.lang.String encoding)Set the file encoding to use on the files read and written by the task;
optional, defaults to default JVM encoding.
this.encoding = encoding;
|
public void | setFile(java.io.File file)Set the source file; required unless dir is set.
this.src = file;
|
public void | setPropertyFile(java.io.File propertyFile)The name of a property file from which properties specified using nested
<replacefilter> elements are drawn; required only if
the property attribute of <replacefilter> is used.
this.propertyFile = propertyFile;
|
public void | setReplaceFilterFile(java.io.File replaceFilterFile)Sets the name of a property file containing filters; optional.
Each property will be treated as a replacefilter where token is the name
of the property and value is the value of the property.
this.replaceFilterFile = replaceFilterFile;
|
public void | setSummary(boolean summary)Indicates whether a summary of the replace operation should be
produced, detailing how many token occurrences and files were
processed; optional, default=false .
this.summary = summary;
|
public void | setToken(java.lang.String token)Set the string token to replace; required unless a nested
replacetoken element or the replacefilterfile
attribute is used.
createReplaceToken().addText(token);
|
public void | setValue(java.lang.String value)Set the string value to use as token replacement;
optional, default is the empty string "".
createReplaceValue().addText(value);
|
private void | stringReplace(java.lang.StringBuffer str, java.lang.String str1, java.lang.String str2)Replace occurrences of str1 in StringBuffer str with str2.
int found = str.toString().indexOf(str1);
while (found >= 0) {
str.replace(found, found + str1.length(), str2);
found = str.toString().indexOf(str1, found + str2.length());
}
|
public void | validateAttributes()Validate attributes provided for this task in .xml build file.
if (src == null && dir == null) {
String message = "Either the file or the dir attribute "
+ "must be specified";
throw new BuildException(message, getLocation());
}
if (propertyFile != null && !propertyFile.exists()) {
String message = "Property file " + propertyFile.getPath()
+ " does not exist.";
throw new BuildException(message, getLocation());
}
if (token == null && replacefilters.size() == 0) {
String message = "Either token or a nested replacefilter "
+ "must be specified";
throw new BuildException(message, getLocation());
}
if (token != null && "".equals(token.getText())) {
String message = "The token attribute must not be an empty string.";
throw new BuildException(message, getLocation());
}
|
public void | validateReplacefilters()Validate nested elements.
for (int i = 0; i < replacefilters.size(); i++) {
Replacefilter element =
(Replacefilter) replacefilters.elementAt(i);
element.validate();
}
|