aboutsummaryrefslogtreecommitdiffstats
path: root/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/StringUtils.java
diff options
context:
space:
mode:
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/StringUtils.java')
-rw-r--r--framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/StringUtils.java273
1 files changed, 273 insertions, 0 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/StringUtils.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/StringUtils.java
new file mode 100644
index 00000000..626fb224
--- /dev/null
+++ b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/util/StringUtils.java
@@ -0,0 +1,273 @@
+/*
+ * 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.PrintWriter;
+import java.io.StringWriter;
+import java.util.Vector;
+
+import org.apache.tools.ant.BuildException;
+
+/**
+ * A set of helper methods related to string manipulation.
+ *
+ */
+public final class StringUtils {
+ private static final long KILOBYTE = 1024;
+ private static final long MEGABYTE = KILOBYTE * 1024;
+ private static final long GIGABYTE = MEGABYTE * 1024;
+ private static final long TERABYTE = GIGABYTE * 1024;
+ private static final long PETABYTE = TERABYTE * 1024;
+
+ /**
+ * constructor to stop anyone instantiating the class
+ */
+ private StringUtils() {
+ }
+
+ /** the line separator for this OS */
+ public static final String LINE_SEP = System.getProperty("line.separator");
+
+ /**
+ * Splits up a string into a list of lines. It is equivalent
+ * to <tt>split(data, '\n')</tt>.
+ * @param data the string to split up into lines.
+ * @return the list of lines available in the string.
+ */
+ public static Vector<String> lineSplit(String data) {
+ return split(data, '\n');
+ }
+
+ /**
+ * Splits up a string where elements are separated by a specific
+ * character and return all elements.
+ * @param data the string to split up.
+ * @param ch the separator character.
+ * @return the list of elements.
+ */
+ public static Vector<String> split(String data, int ch) {
+ Vector<String> elems = new Vector<String>();
+ int pos = -1;
+ int i = 0;
+ while ((pos = data.indexOf(ch, i)) != -1) {
+ String elem = data.substring(i, pos);
+ elems.addElement(elem);
+ i = pos + 1;
+ }
+ elems.addElement(data.substring(i));
+ return elems;
+ }
+
+ /**
+ * Replace occurrences into a string.
+ * @param data the string to replace occurrences into
+ * @param from the occurrence to replace.
+ * @param to the occurrence to be used as a replacement.
+ * @return the new string with replaced occurrences.
+ * @deprecated Use {@link String#replace(CharSequence, CharSequence)} now.
+ */
+ public static String replace(String data, String from, String to) {
+ return data.replace(from, to);
+ }
+
+ /**
+ * Convenient method to retrieve the full stacktrace from a given exception.
+ * @param t the exception to get the stacktrace from.
+ * @return the stacktrace from the given exception.
+ */
+ public static String getStackTrace(Throwable t) {
+ StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw, true);
+ t.printStackTrace(pw);
+ pw.flush();
+ pw.close();
+ return sw.toString();
+ }
+
+ /**
+ * Checks that a string buffer ends up with a given string. It may sound
+ * trivial with the existing
+ * JDK API but the various implementation among JDKs can make those
+ * methods extremely resource intensive
+ * and perform poorly due to massive memory allocation and copying. See
+ * @param buffer the buffer to perform the check on
+ * @param suffix the suffix
+ * @return <code>true</code> if the character sequence represented by the
+ * argument is a suffix of the character sequence represented by
+ * the StringBuffer object; <code>false</code> otherwise. Note that the
+ * result will be <code>true</code> if the argument is the
+ * empty string.
+ */
+ public static boolean endsWith(StringBuffer buffer, String suffix) {
+ if (suffix.length() > buffer.length()) {
+ return false;
+ }
+ // this loop is done on purpose to avoid memory allocation performance
+ // problems on various JDKs
+ // StringBuffer.lastIndexOf() was introduced in jdk 1.4 and
+ // implementation is ok though does allocation/copying
+ // StringBuffer.toString().endsWith() does massive memory
+ // allocation/copying on JDK 1.5
+ // See http://issues.apache.org/bugzilla/show_bug.cgi?id=37169
+ int endIndex = suffix.length() - 1;
+ int bufferIndex = buffer.length() - 1;
+ while (endIndex >= 0) {
+ if (buffer.charAt(bufferIndex) != suffix.charAt(endIndex)) {
+ return false;
+ }
+ bufferIndex--;
+ endIndex--;
+ }
+ 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 -&gt; " \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();
+ }
+
+ /**
+ * Takes a human readable size representation eg 10K
+ * a long value. Doesn't support 1.1K or other rational values.
+ * @param humanSize the amount as a human readable string.
+ * @return a long value representation
+ * @throws Exception if there is a problem.
+ * @since Ant 1.7
+ */
+ public static long parseHumanSizes(String humanSize) throws Exception {
+ long factor = 1L;
+ char s = humanSize.charAt(0);
+ switch (s) {
+ case '+':
+ humanSize = humanSize.substring(1);
+ break;
+ case '-':
+ factor = -1L;
+ humanSize = humanSize.substring(1);
+ break;
+ default:
+ break;
+ }
+ //last character isn't a digit
+ char c = humanSize.charAt(humanSize.length() - 1);
+ if (!Character.isDigit(c)) {
+ int trim = 1;
+ switch (c) {
+ case 'K':
+ factor *= KILOBYTE;
+ break;
+ case 'M':
+ factor *= MEGABYTE;
+ break;
+ case 'G':
+ factor *= GIGABYTE;
+ break;
+ case 'T':
+ factor *= TERABYTE;
+ break;
+ case 'P':
+ factor *= PETABYTE;
+ break;
+ default:
+ trim = 0;
+ }
+ humanSize = humanSize.substring(0, humanSize.length() - trim);
+ }
+ try {
+ return factor * Long.parseLong(humanSize);
+ } catch (NumberFormatException e) {
+ throw new BuildException("Failed to parse \"" + humanSize + "\"", e);
+ }
+ }
+
+ /**
+ * Removes the suffix from a given string, if the string contains
+ * that suffix.
+ * @param string String for check
+ * @param suffix Suffix to remove
+ * @return the <i>string</i> with the <i>suffix</i>
+ */
+ public static String removeSuffix(String string, String suffix) {
+ if (string.endsWith(suffix)) {
+ return string.substring(0, string.length() - suffix.length());
+ } else {
+ return string;
+ }
+ }
+
+ /**
+ * Removes the prefix from a given string, if the string contains
+ * that prefix.
+ * @param string String for check
+ * @param prefix Prefix to remove
+ * @return the <i>string</i> with the <i>prefix</i>
+ */
+ public static String removePrefix(String string, String prefix) {
+ if (string.startsWith(prefix)) {
+ return string.substring(prefix.length());
+ } else {
+ return string;
+ }
+ }
+}