package com.jasonette.seed.Core; import android.content.Context; import android.util.Log; import com.eclipsesource.v8.V8; import com.eclipsesource.v8.V8Array; import com.eclipsesource.v8.V8Object; import com.jasonette.seed.Helper.JasonHelper; import org.json.JSONObject; public class JasonParser { static JSONObject res; private static Context context; private static JasonParser instance = null; private JasonParser(){ this.listener = null; } public interface JasonParserListener { public void onFinished(JSONObject json); } private JasonParserListener listener; private V8 juice; public void setParserListener(JasonParserListener listener){ this.listener = listener; } public static JasonParser getInstance(Context context){ if(instance == null) { instance = new JasonParser(); try { String js = JasonHelper.read_file("parser", context); instance.juice = V8.createV8Runtime(); instance.juice.executeVoidScript(js); instance.juice.getLocker().release(); } catch (Exception e){ Log.d("Error", e.toString()); } } return instance; } public void parse(final String data_type, final JSONObject data, final Object template, final Context context){ try{ new Thread(new Runnable(){ @Override public void run() { try { // thread handling - acquire handle juice.getLocker().acquire(); Console console = new Console(); V8Object v8Console = new V8Object(juice); juice.add("console", v8Console); v8Console.registerJavaMethod(console, "log", "log", new Class<?>[] { String.class }); v8Console.registerJavaMethod(console, "error", "error", new Class<?>[] { String.class }); v8Console.registerJavaMethod(console, "trace", "trace", new Class<?>[] {}); V8Object parser = juice.getObject("parser"); String templateJson = template.toString(); String dataJson = data.toString(); String val = "{}"; if(data_type.equalsIgnoreCase("json")) { V8Array parameters = new V8Array(juice).push(templateJson); parameters.push(dataJson); parameters.push(true); val = parser.executeStringFunction("json", parameters); parameters.release(); } else { String raw_data = data.getString("$jason"); V8Array parameters = new V8Array(juice).push(templateJson); parameters.push(raw_data); parameters.push(true); val = parser.executeStringFunction("html", parameters); parameters.release(); } parser.release(); v8Console.release(); res = new JSONObject(val); listener.onFinished(res); } catch (Exception e){ Log.d("Error", e.toString()); } // thread handling - release handle juice.getLocker().release(); } }).start(); } catch (Exception e){ Log.d("Error", e.toString()); } } } /** * Override for console to print javascript debug output in the Android Studio console */ class Console { public void log(final String message) { Log.d("console.log", message); } public void error(final String message) { Log.e("console.error", message); } public void trace() { Log.e("console.trace", "Unable to reproduce JS stacktrace"); } }