Philip inherited a large Java application. It was the sort of application that needed to solve a clear business problem, so the original programmer started by building his own “template engine”, to simplify the process of generating output.

A template engine needs a simple way to do string replacements, but unfortunately, Java doesn’t offer a String class with a variety of “replace” methods for different situations. No, this Architect had to invent this wheel, using nothing but used chewing gum and his own wits.

public class FunctionLibrary {

    public static String replaceAll(String input, String toRepalce,
            String replacement) {
        return StringUtil.replaceAll(input, toRepalce, replacement);
    }
}

Ah, the power of object orientation . Talk about adherence to the “single responsibility principle”! But wait, what does StringUtil do?

public class StringUtil {
  public static String replaceAll(String aReceiver, String anOldString, String aNewString) {
    int tmpIndex;
    int tmpLastIndex = 0;
    StringBuffer tmpResult;
    int tmpLength;

    if (null == aReceiver) {
      return null;
    }

    if ((null == anOldString) || (null == aNewString)) {
      return aReceiver;
    }

    tmpLength = anOldString.length();

    if (aReceiver.length() < 1) {
      if (tmpLength < 1) {
        return aNewString;
      }

      return "";
    }

    if (tmpLength < 1) {
      tmpResult = new StringBuffer();
      tmpResult.append(aNewString);
      tmpResult.append(aReceiver);

      return tmpResult.toString();
    }

    tmpIndex = aReceiver.indexOf(anOldString, 0);

    if (tmpIndex < 0) {
      return aReceiver;
    }

    tmpResult = new StringBuffer();

    while (tmpIndex > -1) {
      tmpResult.append(aReceiver.substring(tmpLastIndex, tmpIndex));
      tmpResult.append(aNewString);
      tmpIndex += tmpLength;
      tmpLastIndex = tmpIndex;

      tmpIndex = aReceiver.indexOf(anOldString, tmpIndex);
    }

    if (tmpLastIndex < aReceiver.length()) {
      tmpResult.append(aReceiver.substring(tmpLastIndex));
    }

    return tmpResult.toString();
  }
}