package org.ovirt.engine.core.compat; import java.io.IOException; import com.google.gwt.regexp.shared.MatchResult; import com.google.gwt.regexp.shared.RegExp; /** * A String Formatter for DotNet string.Format() patterns */ public class FormatterDotnet { private static final String STR_ARG_FORMAT = "\\{(\\d)\\}"; // Creating a regex for '{0} {1} ... ' pattern. private static final RegExp REGEXP = RegExp.compile(STR_ARG_FORMAT, "g"); private Appendable a; public FormatterDotnet() { init(new StringBuilder()); } public FormatterDotnet(Appendable a) { if (a == null) { a = new StringBuilder(); } init(a); } public FormatterDotnet format(String format, Object... args) { try { a.append(getFormattedString(format, args)); } catch (IOException e) { throw new RuntimeException(e); } return this; }; public Appendable out() { return a; } @Override public String toString() { return a.toString(); } private String getFormattedString(String pattern, Object... args) { // Replacing specified arguments according to the indexes in the pattern. MatchResult mr = REGEXP.exec(pattern); String formattedStr = pattern; while (mr != null) { String holder = mr.getGroup(0); String indexStr = mr.getGroup(1); int argIndex = Integer.parseInt(indexStr); // Replacing the current match with the corresponding argument. Object arg = args[argIndex]; formattedStr = formattedStr.replace(holder, String.valueOf(arg)); // Look up for another match. mr = REGEXP.exec(pattern); } return formattedStr; } // Initialize internal data. private void init(Appendable a) { this.a = a; } }