weaponized/src-datacreator/x/InterfaceAdder.java
package x;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Iterator;
import org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.ClassWriter;
/**
* This tool can add the interface for Map.Entry to an arbitrary class.
* Required, because the standard compilers won't compile our
* ListSpinnerModel without this class.
*/
public class InterfaceAdder {
final static Class<?> INTERFACE = Iterator.class;
static File file;
public static void main(String[] args) throws Exception {
file = new File(args[0]);
File outFile = new File(args[0]);
FileInputStream in = new FileInputStream(file);
// Parse input
ClassReader cr = new ClassReader(in);
ClassWriter cw = new ClassWriter(cr, 0);
ClassVisitor cv = cw;
// Our own visitor
MigexClassAdapter aspectacular = new MigexClassAdapter(cv);
cr.accept(aspectacular, 0);
in.close();
FileOutputStream out = new FileOutputStream(outFile);
byte[] outputBytes = cw.toByteArray();
out.write(outputBytes);
out.close();
}
static class MigexClassAdapter extends ClassAdapter {
private static String[] addString(String[] strings, String string) {
if( strings == null || strings.length == 0 ) {
return new String[] { string };
}
String[] newStrings = new String[strings.length+1];
System.arraycopy(strings, 0, newStrings, 0, strings.length);
newStrings[strings.length] = string;
return newStrings;
}
public MigexClassAdapter(ClassVisitor cv) {
super(cv);
}
@Override
public void visit(int version, int access, String name, String signature,
String superName, String[] interfaces) {
super.visit(version,access,name,signature,superName,
addString(interfaces,INTERFACE.getName().replace('.', '/')));
}
}
}