package coloredlightscore.src.asm.transformer.core;
import com.google.common.base.Throwables;
import cpw.mods.fml.common.FMLLog;
import net.minecraft.launchwrapper.IClassTransformer;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.tree.ClassNode;
public abstract class SelectiveTransformer implements IClassTransformer {
@Override
public final byte[] transform(String name, String transformedName, byte[] bytes) {
if (bytes != null && transforms(transformedName)) {
FMLLog.info("Class %s is a candidate for transforming", transformedName);
try {
ClassNode clazz = ASMUtils.getClassNode(bytes);
if (transform(clazz, transformedName)) {
FMLLog.info("Transforming class " + transformedName);
ClassWriter writer = new ExtendedClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
clazz.accept(writer);
bytes = writer.toByteArray();
} else
FMLLog.warning("Did not transform %s", transformedName);
} catch (Exception e) {
FMLLog.severe("Exception during transformation of class " + transformedName);
e.printStackTrace();
Throwables.propagate(e);
}
}
return bytes;
}
protected abstract boolean transforms(String className);
protected abstract boolean transform(ClassNode clazz, String className);
}