package com.tns.bindings; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.HashSet; import org.ow2.asmdex.ApplicationWriter; import com.tns.bindings.desc.ClassDescriptor; public class ProxyGenerator { private String path; private Dump dump; public static boolean IsLogEnabled = false; private String proxyThumb; public ProxyGenerator(String path) { this.path = path; dump = new Dump(); } public void setProxyThumb(String proxyThumb) { this.proxyThumb = proxyThumb; } public String generateProxy(String proxyName, ClassDescriptor classToProxy, HashSet<String> methodOverrides, HashSet<ClassDescriptor> implementedInterfaces, boolean isInterface, AnnotationDescriptor[] annotations) throws IOException { ApplicationWriter aw = new ApplicationWriter(); aw.visit(); dump.generateProxy(aw, proxyName, classToProxy, methodOverrides, implementedInterfaces, annotations); aw.visitEnd(); byte[] generatedBytes = aw.toByteArray(); String proxyFileName; if (proxyName.contains(".")) { proxyFileName = proxyName; } else { proxyFileName = classToProxy.getName().replace('$', '_'); if (!isInterface) { proxyFileName += Dump.CLASS_NAME_LOCATION_SEPARATOR + proxyName; } if (proxyThumb != null) { proxyFileName += "-" + proxyThumb; } } if (IsLogEnabled) System.out.println("Generator: Saving proxy with file name: " + proxyFileName); String proxyPath = saveProxy(proxyFileName, generatedBytes); return proxyPath; } private String saveProxy(String proxyName, byte[] proxyBytes) throws IOException { File file = new File(path + File.separator + proxyName + ".dex"); file.createNewFile(); FileOutputStream stream = new FileOutputStream(file); stream.write(proxyBytes); stream.flush(); stream.close(); return file.getAbsolutePath(); } }