001package io.ebean.enhance.ant;
002
003
004/**
005 * Utility String class that supports String manipulation functions.
006 */
007public class StringReplace {
008
009
010  /**
011  * This method takes a String and will replace all occurrences of the match
012  * String with that of the replace String.
013  *
014  * @param source
015  *            the source string
016  * @param match
017  *            the string used to find a match
018  * @param replace
019  *            the string used to replace match with
020  * @return the source string after the search and replace
021  */
022  public static String replace(String source, String match, String replace) {
023    return replaceString(source, match, replace, 30, 0, source.length());
024  }
025
026  /**
027  * Additionally specify the additionalSize to add to the buffer. This will
028  * make the buffer bigger so that it doesn't have to grow when replacement
029  * occurs.
030  */
031  private static String replaceString(String source, String match, String replace,
032      int additionalSize, int startPos, int endPos) {
033
034    char match0 = match.charAt(0);
035
036    int matchLength = match.length();
037
038    if (matchLength == 1 && replace.length() == 1) {
039      char replace0 = replace.charAt(0);
040      return source.replace(match0, replace0);
041    }
042    if (matchLength >= replace.length()) {
043      additionalSize = 0;
044    }
045
046
047    int sourceLength = source.length();
048    int lastMatch = endPos - matchLength;
049
050    StringBuilder sb = new StringBuilder(sourceLength + additionalSize);
051
052    if (startPos > 0) {
053      sb.append(source.substring(0, startPos));
054    }
055
056    char sourceChar;
057    boolean isMatch;
058    int sourceMatchPos;
059
060    for (int i = startPos; i < sourceLength; i++) {
061      sourceChar = source.charAt(i);
062      if (i > lastMatch || sourceChar != match0) {
063        sb.append(sourceChar);
064
065      } else {
066        // check to see if this is a match
067        isMatch = true;
068        sourceMatchPos = i;
069
070        // check each following character...
071        for (int j = 1; j < matchLength; j++) {
072          sourceMatchPos++;
073          if (source.charAt(sourceMatchPos) != match.charAt(j)) {
074            isMatch = false;
075            break;
076          }
077        }
078        if (isMatch) {
079          i = i + matchLength - 1;
080          sb.append(replace);
081        } else {
082          // was not a match
083          sb.append(sourceChar);
084        }
085      }
086    }
087
088    return sb.toString();
089  }
090
091
092}