diff --git a/android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java b/android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java index 155c90a90..893a1dc07 100644 --- a/android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java +++ b/android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/Generator.java @@ -46,23 +46,22 @@ public Generator(String outputDir, String[] libs, boolean throwOnError) throws I } - public void writeBindings(String filename) throws IOException { + public void writeBindings(String filename) throws IOException, ClassNotFoundException { Binding[] bindings = generateBindings(filename); List writenFiles = new ArrayList(); for (Binding b : bindings) { - if(!writenFiles.contains(b.getFile())) { + if (!writenFiles.contains(b.getFile())) { writenFiles.add(b.getFile()); try (PrintStream ps = new PrintStream(b.getFile())) { ps.append(b.getContent()); } - } - else { + } else { throw new IOException("File already exists. This may lead to undesired behavior.\nPlease change the name of one of the extended classes.\n" + b.getFile()); } } } - public Binding[] generateBindings(String filename) throws IOException { + public Binding[] generateBindings(String filename) throws IOException, ClassNotFoundException { List rows = getRows(filename); Binding[] generatedFiles = processRows(rows); @@ -70,8 +69,8 @@ public Binding[] generateBindings(String filename) throws IOException { return generatedFiles; } - public Binding generateBinding(DataRow dataRow, HashSet interfaceNames) { - JavaClass clazz = classes.get(dataRow.getBaseClassname()); + public Binding generateBinding(DataRow dataRow, HashSet interfaceNames) throws ClassNotFoundException { + JavaClass clazz = getClass(dataRow.getBaseClassname()); boolean hasSpecifiedName = !dataRow.getFilename().isEmpty(); String packageName = hasSpecifiedName ? getBaseDir(dataRow.getFilename()) : (DEFAULT_PACKAGE_NAME + "." + clazz.getPackageName()); @@ -112,7 +111,7 @@ public Binding generateBinding(DataRow dataRow, HashSet interfaceNames) { return new Binding(new File(baseDir, normalizedName + JAVA_EXT), w.toString(), classname); } - public Binding generateBinding(DataRow dataRow) { + public Binding generateBinding(DataRow dataRow) throws ClassNotFoundException { return generateBinding(dataRow, new HashSet()); } @@ -134,7 +133,7 @@ private List getRows(String filename) throws IOException { return rows; } - private Binding[] processRows(List rows) throws IOException { + private Binding[] processRows(List rows) throws IOException, ClassNotFoundException { ArrayList bindings = new ArrayList<>(); HashSet interfaceNames = new HashSet(); @@ -184,11 +183,11 @@ private String getNormalizedName(String filename) { char c = Character.isJavaIdentifierPart(ch) ? ch : '_'; sb.append(c); } - String name = sb.toString(); - return name; + + return sb.toString(); } - private Map> getPublicApi(JavaClass clazz) { + private Map> getPublicApi(JavaClass clazz) throws ClassNotFoundException { Map> api = new HashMap>(); JavaClass currentClass = clazz; String clazzName = clazz.getClassName(); @@ -240,7 +239,7 @@ private Map> getPublicApi(JavaClass clazz) { break; } else { String superClassName = currentClass.getSuperclassName(); - currentClass = classes.get(superClassName.replace('$', '.')); + currentClass = getClass(superClassName); } } return api; @@ -329,7 +328,7 @@ private String getFullMethodSignature(Method m) { return sig; } - private void writeBinding(Writer w, DataRow dataRow, JavaClass clazz, String packageName, String name) { + private void writeBinding(Writer w, DataRow dataRow, JavaClass clazz, String packageName, String name) throws ClassNotFoundException { String[] implInterfaces = dataRow.getInterfaces(); collectImplementedInterfaces(implInterfaces, clazz); @@ -382,12 +381,12 @@ private void writeBinding(Writer w, DataRow dataRow, JavaClass clazz, String pac } } - boolean hasInitMethod2 = isApplicationClass ? false : hasInitMethod; + boolean hasInitMethod2 = !isApplicationClass && hasInitMethod; writeConstructors(clazz, name, hasInitMethod2, isApplicationClass, w); if (isInterface) { Set objectMethods = new HashSet(); - for (Method objMethod : classes.get("java.lang.Object").getMethods()) { + for (Method objMethod : getClass("java.lang.Object").getMethods()) { if (!objMethod.isStatic() && (objMethod.isPublic() || objMethod.isProtected())) { String sig = getFullMethodSignature(objMethod); objectMethods.add(sig); @@ -408,7 +407,7 @@ private void writeBinding(Writer w, DataRow dataRow, JavaClass clazz, String pac } while (!interfaceNames.isEmpty()) { String iname = interfaceNames.pollFirst(); - JavaClass iface = classes.get(iname.replace('$', '.')); + JavaClass iface = getClass(iname); for (String iname2 : iface.getInterfaceNames()) { interfaceNames.add(iname2.replace('$', '.')); } @@ -528,7 +527,6 @@ private void writeMethodSignature(Method m, Writer w) { private void writeThrowsClause(Method m, Writer w) { } - private void writeConstructors(JavaClass clazz, String classname, boolean hasInitMethod, boolean isApplicationClass, Writer w) { boolean isInterface = clazz.isInterface(); if (isInterface) { @@ -656,7 +654,7 @@ private void writeType(Type t, Writer w) { w.write(type); } - private void collectInterfaceMethods(JavaClass clazz, List methods) { + private void collectInterfaceMethods(JavaClass clazz, List methods) throws ClassNotFoundException { JavaClass currentClass = clazz; while (true) { @@ -669,7 +667,7 @@ private void collectInterfaceMethods(JavaClass clazz, List methods) { while (!queue.isEmpty()) { String ifaceName = queue.poll(); - JavaClass currentInterface = classes.get(ifaceName.replace('$', '.')); + JavaClass currentInterface = getClass(ifaceName); Method[] ifaceMethods = currentInterface.getMethods(); for (Method m : ifaceMethods) { methods.add(m); @@ -683,12 +681,12 @@ private void collectInterfaceMethods(JavaClass clazz, List methods) { break; } else { String superClassName = currentClass.getSuperclassName(); - currentClass = classes.get(superClassName.replace('$', '.')); + currentClass = getClass(superClassName); } } } - private boolean isApplicationClass(JavaClass clazz, Map classes) { + private boolean isApplicationClass(JavaClass clazz, Map classes) throws ClassNotFoundException { boolean isApplicationClass = false; String applicationClassname = "android.app.Application"; @@ -707,9 +705,19 @@ private boolean isApplicationClass(JavaClass clazz, Map class } String superClassName = currentClass.getSuperclassName(); - currentClass = classes.get(superClassName.replace('$', '.')); + currentClass = getClass(superClassName); } return isApplicationClass; } + + private JavaClass getClass(String className) throws ClassNotFoundException { + JavaClass clazz = classes.get(className.replace('$', '.')); + + if (clazz == null) { + throw new ClassNotFoundException("Class: " + className); + } + + return clazz; + } } diff --git a/android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/Main.java b/android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/Main.java index d5d28e202..9b663f699 100644 --- a/android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/Main.java +++ b/android-static-binding-generator/project/staticbindinggenerator/src/main/java/org/nativescript/staticbindinggenerator/Main.java @@ -4,14 +4,14 @@ import java.util.Arrays; public class Main { - public static void main(String[] args) throws IOException { - if (args.length < 3) { - throw new IllegalArgumentException("Expects at least three arguments"); - } - String inputBindingFilename = args[0]; - String outputDir = args[1]; - String[] libs = Arrays.copyOfRange(args, 2, args.length); + public static void main(String[] args) throws IOException, ClassNotFoundException { + if (args.length < 3) { + throw new IllegalArgumentException("Expects at least three arguments"); + } + String inputBindingFilename = args[0]; + String outputDir = args[1]; + String[] libs = Arrays.copyOfRange(args, 2, args.length); - new Generator(outputDir, libs).writeBindings(inputBindingFilename); + new Generator(outputDir, libs).writeBindings(inputBindingFilename); } }