@@ -74,7 +74,7 @@ import org.apache.tools.ant.Project;
* @author <A href="mailto:martin@mvdb.net"> Martin van den Bemt </A>
* @author <A href="mailto:martin@mvdb.net"> Martin van den Bemt </A>
*/
*/
public class FilterSet extends DataType implements Cloneable {
public class FilterSet extends DataType implements Cloneable {
/**
/**
* Individual filter component of filterset
* Individual filter component of filterset
*
*
@@ -83,10 +83,10 @@ public class FilterSet extends DataType implements Cloneable {
public static class Filter {
public static class Filter {
/** Token which will be replaced in the filter operation */
/** Token which will be replaced in the filter operation */
String token;
String token;
/** The value which will replace the token in the filtering operation */
/** The value which will replace the token in the filtering operation */
String value;
String value;
/**
/**
* Constructor for the Filter object
* Constructor for the Filter object
*
*
@@ -97,13 +97,13 @@ public class FilterSet extends DataType implements Cloneable {
this.token = token;
this.token = token;
this.value = value;
this.value = value;
}
}
/**
/**
* No argument conmstructor
* No argument conmstructor
*/
*/
public Filter() {
public Filter() {
}
}
/**
/**
* Sets the Token attribute of the Filter object
* Sets the Token attribute of the Filter object
*
*
@@ -112,7 +112,7 @@ public class FilterSet extends DataType implements Cloneable {
public void setToken(String token) {
public void setToken(String token) {
this.token = token;
this.token = token;
}
}
/**
/**
* Sets the Value attribute of the Filter object
* Sets the Value attribute of the Filter object
*
*
@@ -121,7 +121,7 @@ public class FilterSet extends DataType implements Cloneable {
public void setValue(String value) {
public void setValue(String value) {
this.value = value;
this.value = value;
}
}
/**
/**
* Gets the Token attribute of the Filter object
* Gets the Token attribute of the Filter object
*
*
@@ -130,7 +130,7 @@ public class FilterSet extends DataType implements Cloneable {
public String getToken() {
public String getToken() {
return token;
return token;
}
}
/**
/**
* Gets the Value attribute of the Filter object
* Gets the Value attribute of the Filter object
*
*
@@ -140,20 +140,20 @@ public class FilterSet extends DataType implements Cloneable {
return value;
return value;
}
}
}
}
/**
/**
* The filtersfile nested element.
* The filtersfile nested element.
*
*
* @author Michael McCallum
* @author Michael McCallum
*/
*/
public class FiltersFile {
public class FiltersFile {
/**
/**
* Constructor for the Filter object
* Constructor for the Filter object
*/
*/
public FiltersFile() {
public FiltersFile() {
}
}
/**
/**
* Sets the file from which filters will be read.
* Sets the file from which filters will be read.
*
*
@@ -163,24 +163,27 @@ public class FilterSet extends DataType implements Cloneable {
readFiltersFromFile(file);
readFiltersFromFile(file);
}
}
}
}
/** The default token start string */
/** The default token start string */
public static final String DEFAULT_TOKEN_START = "@";
public static final String DEFAULT_TOKEN_START = "@";
/** The default token end string */
/** The default token end string */
public static final String DEFAULT_TOKEN_END = "@";
public static final String DEFAULT_TOKEN_END = "@";
private String startOfToken = DEFAULT_TOKEN_START;
private String startOfToken = DEFAULT_TOKEN_START;
private String endOfToken = DEFAULT_TOKEN_END;
private String endOfToken = DEFAULT_TOKEN_END;
/**
/**
* List of ordered filters and filter files.
* List of ordered filters and filter files.
*/
*/
private Vector filters = new Vector();
private Vector filters = new Vector();
/**
* Default constructor
*/
public FilterSet() {
public FilterSet() {
}
}
/**
/**
* Create a Filterset from another filterset
* Create a Filterset from another filterset
*
*
@@ -191,6 +194,11 @@ public class FilterSet extends DataType implements Cloneable {
this.filters = (Vector) filterset.getFilters().clone();
this.filters = (Vector) filterset.getFilters().clone();
}
}
/**
* Get the filters in the filter set
*
* @return a Vector of Filter instances
*/
protected Vector getFilters() {
protected Vector getFilters() {
if (isReference()) {
if (isReference()) {
return getRef().getFilters();
return getRef().getFilters();
@@ -198,10 +206,15 @@ public class FilterSet extends DataType implements Cloneable {
return filters;
return filters;
}
}
/**
* Get the referred filter set
*
* @return the filterset from the reference.
*/
protected FilterSet getRef() {
protected FilterSet getRef() {
return (FilterSet) getCheckedRef(FilterSet.class, "filterset");
return (FilterSet) getCheckedRef(FilterSet.class, "filterset");
}
}
/**
/**
* Gets the filter hash of the FilterSet.
* Gets the filter hash of the FilterSet.
*
*
@@ -216,7 +229,7 @@ public class FilterSet extends DataType implements Cloneable {
}
}
return filterHash;
return filterHash;
}
}
/**
/**
* set the file containing the filters for this filterset.
* set the file containing the filters for this filterset.
*
*
@@ -229,7 +242,7 @@ public class FilterSet extends DataType implements Cloneable {
}
}
readFiltersFromFile(filtersFile);
readFiltersFromFile(filtersFile);
}
}
/**
/**
* The string used to id the beginning of a token.
* The string used to id the beginning of a token.
*
*
@@ -245,14 +258,19 @@ public class FilterSet extends DataType implements Cloneable {
this.startOfToken = startOfToken;
this.startOfToken = startOfToken;
}
}
/**
* Get the begin token for this filterset
*
* @return the filter set's begin token for filtering
*/
public String getBeginToken() {
public String getBeginToken() {
if (isReference()) {
if (isReference()) {
return getRef().getBeginToken();
return getRef().getBeginToken();
}
}
return startOfToken;
return startOfToken;
}
}
/**
/**
* The string used to id the end of a token.
* The string used to id the end of a token.
*
*
@@ -268,14 +286,19 @@ public class FilterSet extends DataType implements Cloneable {
this.endOfToken = endOfToken;
this.endOfToken = endOfToken;
}
}
/**
* Get the end token for this filterset
*
* @return the filter set's end token for replacement delimiting
*/
public String getEndToken() {
public String getEndToken() {
if (isReference()) {
if (isReference()) {
return getRef().getEndToken();
return getRef().getEndToken();
}
}
return endOfToken;
return endOfToken;
}
}
/**
/**
* Read the filters from the given file.
* Read the filters from the given file.
*
*
@@ -289,7 +312,7 @@ public class FilterSet extends DataType implements Cloneable {
}
}
if (!filtersFile.exists()) {
if (!filtersFile.exists()) {
throw new BuildException("Could not read filters from file "
throw new BuildException("Could not read filters from file "
+ filtersFile + " as it doesn't exist.");
+ filtersFile + " as it doesn't exist.");
}
}
@@ -300,7 +323,7 @@ public class FilterSet extends DataType implements Cloneable {
Properties props = new Properties();
Properties props = new Properties();
in = new FileInputStream(filtersFile);
in = new FileInputStream(filtersFile);
props.load(in);
props.load(in);
Enumeration enum = props.propertyNames();
Enumeration enum = props.propertyNames();
Vector filters = getFilters();
Vector filters = getFilters();
while (enum.hasMoreElements()) {
while (enum.hasMoreElements()) {
@@ -309,22 +332,23 @@ public class FilterSet extends DataType implements Cloneable {
filters.addElement(new Filter(strPropName, strValue));
filters.addElement(new Filter(strPropName, strValue));
}
}
} catch (Exception e) {
} catch (Exception e) {
throw new BuildException("Could not read filters from file: "
throw new BuildException("Could not read filters from file: "
+ filtersFile);
+ filtersFile);
} finally {
} finally {
if (in != null) {
if (in != null) {
try {
try {
in.close();
in.close();
} catch (IOException ioex) {
} catch (IOException ioex) {
// ignore
}
}
}
}
}
}
} else {
} else {
throw new BuildException("Must specify a file not a directory in "
throw new BuildException("Must specify a file not a directory in "
+ "the filtersfile attribute:" + filtersFile);
+ "the filtersfile attribute:" + filtersFile);
}
}
}
}
/**
/**
* Does replacement on the given string with token matching.
* Does replacement on the given string with token matching.
* This uses the defined begintoken and endtoken values which default to @ for both.
* This uses the defined begintoken and endtoken values which default to @ for both.
@@ -336,7 +360,7 @@ public class FilterSet extends DataType implements Cloneable {
String beginToken = getBeginToken();
String beginToken = getBeginToken();
String endToken = getEndToken();
String endToken = getEndToken();
int index = line.indexOf(beginToken);
int index = line.indexOf(beginToken);
if (index > -1) {
if (index > -1) {
Hashtable tokens = getFilterHash();
Hashtable tokens = getFilterHash();
try {
try {
@@ -344,14 +368,14 @@ public class FilterSet extends DataType implements Cloneable {
int i = 0;
int i = 0;
String token = null;
String token = null;
String value = null;
String value = null;
do {
do {
int endIndex = line.indexOf(endToken,
int endIndex = line.indexOf(endToken,
index + beginToken.length() + 1);
index + beginToken.length() + 1);
if (endIndex == -1) {
if (endIndex == -1) {
break;
break;
}
}
token
token
= line.substring(index + beginToken.length(), endIndex);
= line.substring(index + beginToken.length(), endIndex);
b.append(line.substring(i, index));
b.append(line.substring(i, index));
if (tokens.containsKey(token)) {
if (tokens.containsKey(token)) {
@@ -360,10 +384,10 @@ public class FilterSet extends DataType implements Cloneable {
// we have another token, let's parse it.
// we have another token, let's parse it.
value = replaceTokens(value, token);
value = replaceTokens(value, token);
}
}
log("Replacing: " + beginToken + token + endToken
log("Replacing: " + beginToken + token + endToken
+ " -> " + value, Project.MSG_VERBOSE);
+ " -> " + value, Project.MSG_VERBOSE);
b.append(value);
b.append(value);
i = index + beginToken.length() + token.length()
i = index + beginToken.length() + token.length()
+ endToken.length();
+ endToken.length();
} else {
} else {
// just append beginToken and search further
// just append beginToken and search further
@@ -371,7 +395,7 @@ public class FilterSet extends DataType implements Cloneable {
i = index + beginToken.length();
i = index + beginToken.length();
}
}
} while ((index = line.indexOf(beginToken, i)) > -1);
} while ((index = line.indexOf(beginToken, i)) > -1);
b.append(line.substring(i));
b.append(line.substring(i));
return b.toString();
return b.toString();
} catch (StringIndexOutOfBoundsException e) {
} catch (StringIndexOutOfBoundsException e) {
@@ -381,12 +405,12 @@ public class FilterSet extends DataType implements Cloneable {
return line;
return line;
}
}
}
}
/** Contains a list of parsed tokens */
/** Contains a list of parsed tokens */
private Vector passedTokens;
private Vector passedTokens;
/** if a ducplicate token is found, this is set to true */
/** if a ducplicate token is found, this is set to true */
private boolean duplicateToken = false;
private boolean duplicateToken = false;
/**
/**
* This parses tokens which point to tokens.
* This parses tokens which point to tokens.
* It also maintains a list of currently used tokens, so we cannot
* It also maintains a list of currently used tokens, so we cannot
@@ -395,8 +419,7 @@ public class FilterSet extends DataType implements Cloneable {
* @param parent the parant token (= the token it was parsed from)
* @param parent the parant token (= the token it was parsed from)
*/
*/
private String replaceTokens(String line, String parent)
private String replaceTokens(String line, String parent)
throws BuildException
{
throws BuildException {
if (passedTokens == null) {
if (passedTokens == null) {
passedTokens = new Vector();
passedTokens = new Vector();
}
}
@@ -405,8 +428,10 @@ public class FilterSet extends DataType implements Cloneable {
StringBuffer sb = new StringBuffer();
StringBuffer sb = new StringBuffer();
sb.append("Inifinite loop in tokens. Currently known tokens : ");
sb.append("Inifinite loop in tokens. Currently known tokens : ");
sb.append(passedTokens);
sb.append(passedTokens);
sb.append("\nProblem token : "+getBeginToken()+parent+getEndToken());
sb.append(" called from "+getBeginToken()+passedTokens.lastElement());
sb.append("\nProblem token : " + getBeginToken() + parent
+ getEndToken());
sb.append(" called from " + getBeginToken()
+ passedTokens.lastElement());
sb.append(getEndToken());
sb.append(getEndToken());
System.out.println(sb.toString());
System.out.println(sb.toString());
return parent;
return parent;
@@ -416,24 +441,24 @@ public class FilterSet extends DataType implements Cloneable {
if (value.indexOf(getBeginToken()) == -1 && !duplicateToken) {
if (value.indexOf(getBeginToken()) == -1 && !duplicateToken) {
duplicateToken = false;
duplicateToken = false;
passedTokens = null;
passedTokens = null;
} else if(duplicateToken) {
} else if (duplicateToken) {
// should always be the case...
// should always be the case...
if (passedTokens.size() > 0) {
if (passedTokens.size() > 0) {
value = (String) passedTokens.lastElement();
value = (String) passedTokens.lastElement();
passedTokens.removeElementAt(passedTokens.size()-1);
passedTokens.removeElementAt(passedTokens.size() - 1);
if (passedTokens.size() == 0) {
if (passedTokens.size() == 0) {
value = getBeginToken()+value+getEndToken();
value = getBeginToken() + value + getEndToken();
duplicateToken = false;
duplicateToken = false;
}
}
}
}
}
}
return value;
return value;
}
}
/**
/**
* Create a new filter
* Create a new filter
*
*
* @param the filter to be added
* @param filter the filter to be added
*/
*/
public void addFilter(Filter filter) {
public void addFilter(Filter filter) {
if (isReference()) {
if (isReference()) {
@@ -441,7 +466,7 @@ public class FilterSet extends DataType implements Cloneable {
}
}
filters.addElement(filter);
filters.addElement(filter);
}
}
/**
/**
* Create a new FiltersFile
* Create a new FiltersFile
*
*
@@ -453,7 +478,7 @@ public class FilterSet extends DataType implements Cloneable {
}
}
return new FiltersFile();
return new FiltersFile();
}
}
/**
/**
* Add a new filter made from the given token and value.
* Add a new filter made from the given token and value.
*
*
@@ -466,7 +491,7 @@ public class FilterSet extends DataType implements Cloneable {
}
}
filters.addElement(new Filter(token, value));
filters.addElement(new Filter(token, value));
}
}
/**
/**
* Add a Filterset to this filter set
* Add a Filterset to this filter set
*
*
@@ -480,7 +505,7 @@ public class FilterSet extends DataType implements Cloneable {
filters.addElement(e.nextElement());
filters.addElement(e.nextElement());
}
}
}
}
/**
/**
* Test to see if this filter set it empty.
* Test to see if this filter set it empty.
*
*
@@ -490,6 +515,13 @@ public class FilterSet extends DataType implements Cloneable {
return getFilters().size() > 0;
return getFilters().size() > 0;
}
}
/**
* clone the filterset
*
* @return a deep clone of this filterset
*
* @throws BuildException if the clone cannot be performed.
*/
public Object clone() throws BuildException {
public Object clone() throws BuildException {
if (isReference()) {
if (isReference()) {
return ((FilterSet) getRef()).clone();
return ((FilterSet) getRef()).clone();
@@ -506,6 +538,6 @@ public class FilterSet extends DataType implements Cloneable {
}
}
}
}