com.googlecode.gwt.test.internal.patchers.JsonUtilsPatcher Maven / Gradle / Ivy
package com.googlecode.gwt.test.internal.patchers;
import com.google.gwt.core.client.JavaScriptObject;
import com.google.gwt.core.client.JsonUtils;
import com.googlecode.gwt.test.exceptions.GwtTestException;
import com.googlecode.gwt.test.exceptions.GwtTestJSONException;
import com.googlecode.gwt.test.patchers.PatchClass;
import com.googlecode.gwt.test.patchers.PatchMethod;
import com.googlecode.gwt.test.utils.JavaScriptObjects;
import org.apache.commons.lang3.StringEscapeUtils;
import org.codehaus.jackson.JsonFactory;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.JsonParser;
import org.codehaus.jackson.JsonToken;
import java.io.IOException;
import java.util.List;
@PatchClass(JsonUtils.class)
class JsonUtilsPatcher {
private static JsonFactory factory;
@PatchMethod
public static T safeEval(String json) {
return eval(json);
}
@PatchMethod
public static T unsafeEval(String json) {
return eval(json);
}
@PatchMethod
static String escapeValue(String toEscape) {
return "\"" + StringEscapeUtils.escapeEcmaScript(toEscape) + "\"";
}
@PatchMethod
static boolean hasJsonParse() {
return true;
}
@PatchMethod
static JavaScriptObject initEscapeTable() {
return null;
}
private static T eval(String json) {
JsonParser jp = null;
try {
jp = getFactory().createJsonParser(json);
jp.nextToken(); // will return JsonToken.START_OBJECT (verify?)
return extractJso(json, jp.getCurrentToken(), jp).cast();
} catch (Exception e) {
if (e instanceof GwtTestException) {
throw (GwtTestException) e;
}
throw new GwtTestJSONException("Error while parsing JSON string '" + json + "'", e);
} finally {
if (jp != null) {
try {
// ensure resources get cleaned up timely and properly
jp.close();
} catch (IOException e) {
// should never happen
}
}
}
}
private static JavaScriptObject extractArray(String json, JsonToken currentToken, JsonParser jp)
throws GwtTestJSONException, IOException {
JavaScriptObject jsArray = JavaScriptObject.createArray();
List