hackedteam/vector-applet

View on GitHub
weaponized/src-datacreator/x/InterfaceAdder.java

Summary

Maintainability
A
45 mins
Test Coverage
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('.', '/')));
        }
        
    }
    
}