From ba745889faa25bb81c5d47917c26c502399f8801 Mon Sep 17 00:00:00 2001 From: Vasil Trifonov Date: Wed, 7 Nov 2018 17:24:11 +0200 Subject: [PATCH 1/3] Added a setting to wrap calls to CallJSMethod in try catch --- test-app/app/src/main/assets/app/package.json | 3 +- .../staticbindinggenerator/DefaultValues.java | 30 +++++++++++++++++++ .../staticbindinggenerator/Generator.java | 26 ++++++++++++++-- .../staticbindinggenerator/Main.java | 21 +++++++++++-- 4 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/DefaultValues.java diff --git a/test-app/app/src/main/assets/app/package.json b/test-app/app/src/main/assets/app/package.json index 38f7d033e..65dedca60 100644 --- a/test-app/app/src/main/assets/app/package.json +++ b/test-app/app/src/main/assets/app/package.json @@ -8,7 +8,8 @@ "freeMemoryRatio": 0.50, "markingMode": "full", "maxLogcatObjectSize": 1024, - "forceLog": false + "forceLog": false, + "suppressCallJSMethodExceptions": false }, "discardUncaughtJsExceptions": false } \ No newline at end of file diff --git a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/DefaultValues.java b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/DefaultValues.java new file mode 100644 index 000000000..ad17e369e --- /dev/null +++ b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/DefaultValues.java @@ -0,0 +1,30 @@ +package org.nativescript.staticbindinggenerator; + +import org.apache.bcel.generic.Type; + +import java.util.HashMap; +import java.util.Map; + +class DefaultValues { + static final Map defaultValues = new HashMap<>(); + + // load + static { + defaultValues.put(Type.BOOLEAN, "false"); + defaultValues.put(Type.BYTE, "0"); + defaultValues.put(Type.SHORT, "0"); + defaultValues.put(Type.INT, "0"); + defaultValues.put(Type.LONG, "0L"); + defaultValues.put(Type.CHAR, "'\u0000'"); + defaultValues.put(Type.FLOAT, "0.0F"); + defaultValues.put(Type.DOUBLE, "0.0"); + } + + public static final String defaultStringValueFor(Type type) { + if(defaultValues.containsKey(type)) { + return defaultValues.get(type); + } else { + return "null"; + } + } +} diff --git a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java index b00df9caa..0527bf09e 100644 --- a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java +++ b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java @@ -26,6 +26,7 @@ import org.apache.bcel.classfile.ClassParser; import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.classfile.Method; +import org.apache.bcel.generic.BasicType; import org.apache.bcel.generic.Type; public class Generator { @@ -47,15 +48,17 @@ public class Generator { private final File outputDir; private final List libs; private final Map classes; + private final boolean suppressCallJSMethodExceptions; public Generator(File outputDir, List libs) throws IOException { - this(outputDir, libs, false); + this(outputDir, libs, false, false); } - public Generator(File outputDir, List libs, boolean throwOnError) throws IOException { + public Generator(File outputDir, List libs, boolean suppressCallJSMethodExceptions, boolean throwOnError) throws IOException { this.outputDir = outputDir; this.libs = libs; this.classes = readClasses(libs, throwOnError); + this.suppressCallJSMethodExceptions = suppressCallJSMethodExceptions; } public void writeBindings(String filename) throws IOException, ClassNotFoundException { @@ -638,6 +641,12 @@ private void writeMethodBody(Method m, boolean isConstructor, boolean isApplicat } w.write("\t\t"); Type ret = m.getReturnType(); + + if(this.suppressCallJSMethodExceptions) { + w.writeln("try {"); + w.write("\t\t\t"); + } + if (!ret.equals(Type.VOID)) { w.write("return ("); writeType(ret, w); @@ -648,6 +657,19 @@ private void writeMethodBody(Method m, boolean isConstructor, boolean isApplicat w.write("\", "); writeType(ret, w); w.writeln(".class, args);"); + + if(this.suppressCallJSMethodExceptions) { + w.writeln("\t\t} catch (Throwable t) {"); + w.writeln("\t\t\tandroid.util.Log.w(\"Error\", t);"); + if (!ret.equals(Type.VOID)) { + w.write("\t\t\t"); + w.write("return "); + w.write(DefaultValues.defaultStringValueFor(ret)); + w.writeln(";"); + } + w.writeln("\t\t}"); + } + if (m.getName().equals("onCreate") && isApplicationClass) { w.writeln("\t\tif (runtime != null) {"); w.writeln("\t\t\truntime.run();"); diff --git a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Main.java b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Main.java index 6c38f3b2a..46bec54c0 100644 --- a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Main.java +++ b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Main.java @@ -33,7 +33,6 @@ public class Main { } public static void main(String[] args) throws IOException, ClassNotFoundException { - validateInput(); getWorkerExcludeFile(); @@ -45,7 +44,7 @@ public static void main(String[] args) throws IOException, ClassNotFoundExceptio // generate java bindings String inputBindingFilename = Paths.get(System.getProperty("user.dir"), SBG_BINDINGS_NAME).toString(); - new Generator(outputDir, rows).writeBindings(inputBindingFilename); + new Generator(outputDir, rows, isSuppressCallJSMethodExceptionsEnabled(), false).writeBindings(inputBindingFilename); } /* @@ -67,6 +66,24 @@ private static void generateJsInputFile() throws IOException { pw.close(); } + private static boolean isSuppressCallJSMethodExceptionsEnabled() throws IOException{ + File jsonFile = new File(inputDir, "package.json"); + String jsonContent = FileUtils.readFileToString(jsonFile, "UTF-8"); + JSONObject pjson = null; + try { + pjson = new JSONObject(jsonContent); + if (pjson.has("android")) { + JSONObject androidSettings = (JSONObject) pjson.get("android"); + if(androidSettings.has("suppressCallJSMethodExceptions") && androidSettings.get("suppressCallJSMethodExceptions").toString() == "true") { + return true; + } + } + } catch (JSONException e) { + e.printStackTrace(); + } + return false; + } + private static void validateInput() throws IOException { dependenciesFile = "sbg-java-dependencies.txt"; if (!(new File(dependenciesFile).exists())) { From 2683b2b8e26a05fdd5b0a04243e806c08fa6f39f Mon Sep 17 00:00:00 2001 From: Vasil Trifonov Date: Thu, 8 Nov 2018 10:50:28 +0200 Subject: [PATCH 2/3] use equals instead of == for strings --- .../main/java/org/nativescript/staticbindinggenerator/Main.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Main.java b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Main.java index 46bec54c0..adf52e5d5 100644 --- a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Main.java +++ b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Main.java @@ -74,7 +74,7 @@ private static boolean isSuppressCallJSMethodExceptionsEnabled() throws IOExcept pjson = new JSONObject(jsonContent); if (pjson.has("android")) { JSONObject androidSettings = (JSONObject) pjson.get("android"); - if(androidSettings.has("suppressCallJSMethodExceptions") && androidSettings.get("suppressCallJSMethodExceptions").toString() == "true") { + if(androidSettings.has("suppressCallJSMethodExceptions") && androidSettings.get("suppressCallJSMethodExceptions").toString().equals("true")) { return true; } } From 69ac687f007bb1e33513fc51f8c0df040fd22387 Mon Sep 17 00:00:00 2001 From: Vasil Trifonov Date: Thu, 8 Nov 2018 13:50:30 +0200 Subject: [PATCH 3/3] add a check for existing package.json file --- .../java/org/nativescript/staticbindinggenerator/Main.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Main.java b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Main.java index adf52e5d5..abe556179 100644 --- a/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Main.java +++ b/test-app/build-tools/static-binding-generator/src/main/java/org/nativescript/staticbindinggenerator/Main.java @@ -68,6 +68,9 @@ private static void generateJsInputFile() throws IOException { private static boolean isSuppressCallJSMethodExceptionsEnabled() throws IOException{ File jsonFile = new File(inputDir, "package.json"); + if (!jsonFile.exists()) { + return false; + } String jsonContent = FileUtils.readFileToString(jsonFile, "UTF-8"); JSONObject pjson = null; try {