Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -46,32 +46,31 @@ 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<File> writenFiles = new ArrayList<File>();
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<DataRow> rows = getRows(filename);

Binding[] generatedFiles = processRows(rows);

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());
Expand Down Expand Up @@ -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());
}

Expand All @@ -134,7 +133,7 @@ private List<DataRow> getRows(String filename) throws IOException {
return rows;
}

private Binding[] processRows(List<DataRow> rows) throws IOException {
private Binding[] processRows(List<DataRow> rows) throws IOException, ClassNotFoundException {
ArrayList<Binding> bindings = new ArrayList<>();
HashSet interfaceNames = new HashSet();

Expand Down Expand Up @@ -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<String, List<Method>> getPublicApi(JavaClass clazz) {
private Map<String, List<Method>> getPublicApi(JavaClass clazz) throws ClassNotFoundException {
Map<String, List<Method>> api = new HashMap<String, List<Method>>();
JavaClass currentClass = clazz;
String clazzName = clazz.getClassName();
Expand Down Expand Up @@ -240,7 +239,7 @@ private Map<String, List<Method>> getPublicApi(JavaClass clazz) {
break;
} else {
String superClassName = currentClass.getSuperclassName();
currentClass = classes.get(superClassName.replace('$', '.'));
currentClass = getClass(superClassName);
}
}
return api;
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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<String> objectMethods = new HashSet<String>();
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);
Expand All @@ -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('$', '.'));
}
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -656,7 +654,7 @@ private void writeType(Type t, Writer w) {
w.write(type);
}

private void collectInterfaceMethods(JavaClass clazz, List<Method> methods) {
private void collectInterfaceMethods(JavaClass clazz, List<Method> methods) throws ClassNotFoundException {
JavaClass currentClass = clazz;

while (true) {
Expand All @@ -669,7 +667,7 @@ private void collectInterfaceMethods(JavaClass clazz, List<Method> 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);
Expand All @@ -683,12 +681,12 @@ private void collectInterfaceMethods(JavaClass clazz, List<Method> methods) {
break;
} else {
String superClassName = currentClass.getSuperclassName();
currentClass = classes.get(superClassName.replace('$', '.'));
currentClass = getClass(superClassName);
}
}
}

private boolean isApplicationClass(JavaClass clazz, Map<String, JavaClass> classes) {
private boolean isApplicationClass(JavaClass clazz, Map<String, JavaClass> classes) throws ClassNotFoundException {
boolean isApplicationClass = false;

String applicationClassname = "android.app.Application";
Expand All @@ -707,9 +705,19 @@ private boolean isApplicationClass(JavaClass clazz, Map<String, JavaClass> 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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}