git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@450610 13f79535-47bb-0310-9956-ffa450edef68master
@@ -27,7 +27,10 @@ import org.apache.tools.ant.types.RegularExpression; | |||
import org.apache.tools.ant.types.Substitution; | |||
import org.apache.tools.ant.util.FileUtils; | |||
import org.apache.tools.ant.util.Tokenizer; | |||
import org.apache.tools.ant.util.FileTokenizer; | |||
import org.apache.tools.ant.util.LineTokenizer; | |||
import org.apache.tools.ant.util.StringTokenizer; | |||
import org.apache.tools.ant.util.StringUtils; | |||
import org.apache.tools.ant.util.regexp.Regexp; | |||
/** | |||
@@ -275,32 +278,15 @@ public class TokenFilter extends BaseFilterReader | |||
// -------------------------------------------- | |||
// | |||
// Tokenizer Classes | |||
// Tokenizer Classes (impls moved to oata.util) | |||
// | |||
// -------------------------------------------- | |||
/** | |||
* class to read the complete input into a string | |||
*/ | |||
public static class FileTokenizer extends ProjectComponent | |||
implements Tokenizer { | |||
/** | |||
* Get the complete input as a string | |||
* @param in the reader object | |||
* @return the complete input | |||
* @throws IOException if error reading | |||
*/ | |||
public String getToken(Reader in) throws IOException { | |||
return FileUtils.readFully(in); | |||
} | |||
/** | |||
* Return the intra-token string | |||
* @return an empty string always | |||
*/ | |||
public String getPostToken() { | |||
return ""; | |||
} | |||
public static class FileTokenizer | |||
extends org.apache.tools.ant.util.FileTokenizer { | |||
} | |||
/** | |||
@@ -308,132 +294,11 @@ public class TokenFilter extends BaseFilterReader | |||
* by white space, or by a specified list of | |||
* delim characters. Behaves like java.util.StringTokenizer. | |||
* if the stream starts with delim characters, the first | |||
* token will be an empty string (unless the treat tokens | |||
* as delims flag is set). | |||
* token will be an empty string (unless the treat delims | |||
* as tokens flag is set). | |||
*/ | |||
public static class StringTokenizer extends ProjectComponent | |||
implements Tokenizer { | |||
private String intraString = ""; | |||
private int pushed = -2; | |||
private char[] delims = null; | |||
private boolean delimsAreTokens = false; | |||
private boolean suppressDelims = false; | |||
private boolean includeDelims = false; | |||
/** | |||
* attribute delims - the delimiter characters | |||
* @param delims a string containing the delimiter characters | |||
*/ | |||
public void setDelims(String delims) { | |||
this.delims = resolveBackSlash(delims).toCharArray(); | |||
} | |||
/** | |||
* attribute delimsaretokens - treat delimiters as | |||
* separate tokens. | |||
* @param delimsAreTokens true if delimiters are to be separate | |||
*/ | |||
public void setDelimsAreTokens(boolean delimsAreTokens) { | |||
this.delimsAreTokens = delimsAreTokens; | |||
} | |||
/** | |||
* attribute suppressdelims - suppress delimiters. | |||
* default - false | |||
* @param suppressDelims if true do not report delimiters | |||
*/ | |||
public void setSuppressDelims(boolean suppressDelims) { | |||
this.suppressDelims = suppressDelims; | |||
} | |||
/** | |||
* attribute includedelims - treat delimiters as part | |||
* of the token. | |||
* default - false | |||
* @param includeDelims if true add delimiters to the token | |||
*/ | |||
public void setIncludeDelims(boolean includeDelims) { | |||
this.includeDelims = includeDelims; | |||
} | |||
/** | |||
* find and return the next token | |||
* | |||
* @param in the input stream | |||
* @return the token | |||
* @exception IOException if an error occurs reading | |||
*/ | |||
public String getToken(Reader in) throws IOException { | |||
int ch = -1; | |||
if (pushed != -2) { | |||
ch = pushed; | |||
pushed = -2; | |||
} else { | |||
ch = in.read(); | |||
} | |||
if (ch == -1) { | |||
return null; | |||
} | |||
boolean inToken = true; | |||
intraString = ""; | |||
StringBuffer word = new StringBuffer(); | |||
StringBuffer padding = new StringBuffer(); | |||
while (ch != -1) { | |||
char c = (char) ch; | |||
boolean isDelim = isDelim(c); | |||
if (inToken) { | |||
if (isDelim) { | |||
if (delimsAreTokens) { | |||
if (word.length() == 0) { | |||
word.append(c); | |||
} else { | |||
pushed = ch; | |||
} | |||
break; | |||
} | |||
padding.append(c); | |||
inToken = false; | |||
} else { | |||
word.append(c); | |||
} | |||
} else { | |||
if (isDelim) { | |||
padding.append(c); | |||
} else { | |||
pushed = ch; | |||
break; | |||
} | |||
} | |||
ch = in.read(); | |||
} | |||
intraString = padding.toString(); | |||
if (includeDelims) { | |||
word.append(intraString); | |||
} | |||
return word.toString(); | |||
} | |||
/** | |||
* @return the intratoken string | |||
*/ | |||
public String getPostToken() { | |||
if (suppressDelims || includeDelims) { | |||
return ""; | |||
} | |||
return intraString; | |||
} | |||
private boolean isDelim(char ch) { | |||
if (delims == null) { | |||
return Character.isWhitespace(ch); | |||
} | |||
for (int i = 0; i < delims.length; ++i) { | |||
if (delims[i] == ch) { | |||
return true; | |||
} | |||
} | |||
return false; | |||
} | |||
public static class StringTokenizer | |||
extends org.apache.tools.ant.util.StringTokenizer { | |||
} | |||
// -------------------------------------------- | |||
@@ -823,43 +688,7 @@ public class TokenFilter extends BaseFilterReader | |||
* @return converted string | |||
*/ | |||
public static String resolveBackSlash(String input) { | |||
StringBuffer b = new StringBuffer(); | |||
boolean backSlashSeen = false; | |||
for (int i = 0; i < input.length(); ++i) { | |||
char c = input.charAt(i); | |||
if (!backSlashSeen) { | |||
if (c == '\\') { | |||
backSlashSeen = true; | |||
} else { | |||
b.append(c); | |||
} | |||
} else { | |||
switch (c) { | |||
case '\\': | |||
b.append((char) '\\'); | |||
break; | |||
case 'n': | |||
b.append((char) '\n'); | |||
break; | |||
case 'r': | |||
b.append((char) '\r'); | |||
break; | |||
case 't': | |||
b.append((char) '\t'); | |||
break; | |||
case 'f': | |||
b.append((char) '\f'); | |||
break; | |||
case 's': | |||
b.append(" \t\n\r\f"); | |||
break; | |||
default: | |||
b.append(c); | |||
} | |||
backSlashSeen = false; | |||
} | |||
} | |||
return b.toString(); | |||
return StringUtils.resolveBackSlash(input); | |||
} | |||
/** | |||
@@ -0,0 +1,49 @@ | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one or more | |||
* contributor license agreements. See the NOTICE file distributed with | |||
* this work for additional information regarding copyright ownership. | |||
* The ASF licenses this file to You under the Apache License, Version 2.0 | |||
* (the "License"); you may not use this file except in compliance with | |||
* the License. You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
* | |||
*/ | |||
package org.apache.tools.ant.util; | |||
import java.io.IOException; | |||
import java.io.Reader; | |||
import org.apache.tools.ant.ProjectComponent; | |||
import org.apache.tools.ant.util.FileUtils; | |||
import org.apache.tools.ant.util.Tokenizer; | |||
/** | |||
* Class to read the complete input into a string. | |||
* @since Ant 1.7 | |||
*/ | |||
public class FileTokenizer extends ProjectComponent implements Tokenizer { | |||
/** | |||
* Get the complete input as a string | |||
* @param in the reader object | |||
* @return the complete input | |||
* @throws IOException if error reading | |||
*/ | |||
public String getToken(Reader in) throws IOException { | |||
return FileUtils.readFully(in); | |||
} | |||
/** | |||
* Return the intra-token string | |||
* @return an empty string always | |||
*/ | |||
public String getPostToken() { | |||
return ""; | |||
} | |||
} |
@@ -0,0 +1,153 @@ | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one or more | |||
* contributor license agreements. See the NOTICE file distributed with | |||
* this work for additional information regarding copyright ownership. | |||
* The ASF licenses this file to You under the Apache License, Version 2.0 | |||
* (the "License"); you may not use this file except in compliance with | |||
* the License. You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
* | |||
*/ | |||
package org.apache.tools.ant.util; | |||
import java.io.IOException; | |||
import java.io.Reader; | |||
import org.apache.tools.ant.ProjectComponent; | |||
import org.apache.tools.ant.util.Tokenizer; | |||
/** | |||
* Class to tokenize the input as areas separated | |||
* by white space, or by a specified list of | |||
* delim characters. Behaves like java.util.StringTokenizer. | |||
* If the stream starts with delim characters, the first | |||
* token will be an empty string (unless the treat delims | |||
* as tokens flag is set). | |||
* @since Ant 1.7 | |||
*/ | |||
public class StringTokenizer extends ProjectComponent implements Tokenizer { | |||
private String intraString = ""; | |||
private int pushed = -2; | |||
private char[] delims = null; | |||
private boolean delimsAreTokens = false; | |||
private boolean suppressDelims = false; | |||
private boolean includeDelims = false; | |||
/** | |||
* attribute delims - the delimiter characters | |||
* @param delims a string containing the delimiter characters | |||
*/ | |||
public void setDelims(String delims) { | |||
this.delims = StringUtils.resolveBackSlash(delims).toCharArray(); | |||
} | |||
/** | |||
* attribute delimsaretokens - treat delimiters as | |||
* separate tokens. | |||
* @param delimsAreTokens true if delimiters are to be separate | |||
*/ | |||
public void setDelimsAreTokens(boolean delimsAreTokens) { | |||
this.delimsAreTokens = delimsAreTokens; | |||
} | |||
/** | |||
* attribute suppressdelims - suppress delimiters. | |||
* default - false | |||
* @param suppressDelims if true do not report delimiters | |||
*/ | |||
public void setSuppressDelims(boolean suppressDelims) { | |||
this.suppressDelims = suppressDelims; | |||
} | |||
/** | |||
* attribute includedelims - treat delimiters as part | |||
* of the token. | |||
* default - false | |||
* @param includeDelims if true add delimiters to the token | |||
*/ | |||
public void setIncludeDelims(boolean includeDelims) { | |||
this.includeDelims = includeDelims; | |||
} | |||
/** | |||
* find and return the next token | |||
* | |||
* @param in the input stream | |||
* @return the token | |||
* @exception IOException if an error occurs reading | |||
*/ | |||
public String getToken(Reader in) throws IOException { | |||
int ch = -1; | |||
if (pushed != -2) { | |||
ch = pushed; | |||
pushed = -2; | |||
} else { | |||
ch = in.read(); | |||
} | |||
if (ch == -1) { | |||
return null; | |||
} | |||
boolean inToken = true; | |||
intraString = ""; | |||
StringBuffer word = new StringBuffer(); | |||
StringBuffer padding = new StringBuffer(); | |||
while (ch != -1) { | |||
char c = (char) ch; | |||
boolean isDelim = isDelim(c); | |||
if (inToken) { | |||
if (isDelim) { | |||
if (delimsAreTokens) { | |||
if (word.length() == 0) { | |||
word.append(c); | |||
} else { | |||
pushed = ch; | |||
} | |||
break; | |||
} | |||
padding.append(c); | |||
inToken = false; | |||
} else { | |||
word.append(c); | |||
} | |||
} else { | |||
if (isDelim) { | |||
padding.append(c); | |||
} else { | |||
pushed = ch; | |||
break; | |||
} | |||
} | |||
ch = in.read(); | |||
} | |||
intraString = padding.toString(); | |||
if (includeDelims) { | |||
word.append(intraString); | |||
} | |||
return word.toString(); | |||
} | |||
/** | |||
* @return the intratoken string | |||
*/ | |||
public String getPostToken() { | |||
return suppressDelims || includeDelims ? "" : intraString; | |||
} | |||
private boolean isDelim(char ch) { | |||
if (delims == null) { | |||
return Character.isWhitespace(ch); | |||
} | |||
for (int i = 0; i < delims.length; ++i) { | |||
if (delims[i] == ch) { | |||
return true; | |||
} | |||
} | |||
return false; | |||
} | |||
} |
@@ -130,4 +130,55 @@ public final class StringUtils { | |||
} | |||
return true; | |||
} | |||
/** | |||
* xml does not do "c" like interpretation of strings. | |||
* i.e. \n\r\t etc. | |||
* this method processes \n, \r, \t, \f, \\ | |||
* also subs \s -> " \n\r\t\f" | |||
* a trailing '\' will be ignored | |||
* | |||
* @param input raw string with possible embedded '\'s | |||
* @return converted string | |||
* @since Ant 1.7 | |||
*/ | |||
public static String resolveBackSlash(String input) { | |||
StringBuffer b = new StringBuffer(); | |||
boolean backSlashSeen = false; | |||
for (int i = 0; i < input.length(); ++i) { | |||
char c = input.charAt(i); | |||
if (!backSlashSeen) { | |||
if (c == '\\') { | |||
backSlashSeen = true; | |||
} else { | |||
b.append(c); | |||
} | |||
} else { | |||
switch (c) { | |||
case '\\': | |||
b.append((char) '\\'); | |||
break; | |||
case 'n': | |||
b.append((char) '\n'); | |||
break; | |||
case 'r': | |||
b.append((char) '\r'); | |||
break; | |||
case 't': | |||
b.append((char) '\t'); | |||
break; | |||
case 'f': | |||
b.append((char) '\f'); | |||
break; | |||
case 's': | |||
b.append(" \t\n\r\f"); | |||
break; | |||
default: | |||
b.append(c); | |||
} | |||
backSlashSeen = false; | |||
} | |||
} | |||
return b.toString(); | |||
} | |||
} |