package bytecode; import java.io.Reader; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Properties; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; public class ApplyExceptions extends BaseStreamingJarProcessor { public static void main(String[] args) { new ApplyExceptions().go(args); } Properties props = new Properties(); @Override public void loadConfig(Reader file) throws Exception { props.load(file); } @Override public ClassVisitor createClassVisitor(ClassVisitor parent) throws Exception { return new ClassVisitor(Opcodes.ASM5, parent) { String className; @Override public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) { className = name; super.visit(version, access, name, signature, superName, interfaces); } @Override public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { if(exceptions == null) exceptions = new String[0]; String propExcs = props.getProperty(className+"."+name+desc, "").split("\\|")[0]; if(!propExcs.equals("")) { List<String> excSet = new ArrayList<String>(Arrays.asList(exceptions)); for(String newExc : Arrays.asList(propExcs.split(","))) if(!excSet.contains(newExc)) excSet.add(newExc); exceptions = excSet.toArray(new String[excSet.size()]); } return super.visitMethod(access, name, desc, signature, exceptions); } }; } }