code: private String buildFullMessage(String msg, Object arg0, Object arg1, Object arg2, Object[] argArray) {
  		StringBuilder sb = null;
  		int lastIndex = 0;
  		int argC = 0;
  		while (true) {
  			int argIndex = msg.indexOf(ARG_STRING, lastIndex);
  			// no more {} arguments?
  			if (argIndex == -1) {
  				break;
  			}
  			if (sb == null) {
  				// we build this lazily in case there is no {} in the msg
  				sb = new StringBuilder(DEFAULT_FULL_MESSAGE_LENGTH);
  			}
  			// add the string before the arg-string
  			sb.append(msg, lastIndex, argIndex);
  			// shift our last-index past the arg-string
  			lastIndex = argIndex + ARG_STRING.length();
  			// add the argument, if we still have any
  			if (argArray == null) {
  				if (argC == 0) {
  					appendArg(sb, arg0);
  				} else if (argC == 1) {
  					appendArg(sb, arg1);
  				} else if (argC == 2) {
  					appendArg(sb, arg2);
  				} else {
  					// we have too many {} so we just ignore them
  				}
  			} else if (argC < argArray.length) {
  				appendArg(sb, argArray[argC]);
  			} else {
  				// we have too many {} so we just ignore them
  			}
  			argC++;
  		}
  		if (sb == null) {
  			// if we have yet to create a StringBuilder then just append the msg which has no {}
  			return msg;
  		} else {
  			// spit out the end of the msg
  			sb.append(msg, lastIndex, msg.length());
  			return sb.toString();
  		}
  	}
docs: Return a combined single message from the msg (with possible {}) and optional arguments.