package net.sourceforge.retroweaver; import java.util.Map; import org.objectweb.asm.Attribute; import org.objectweb.asm.ByteVector; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.Label; import org.objectweb.asm.util.ASMifiable; import org.objectweb.asm.util.Traceable; public class RetroWeaverAttribute extends Attribute implements ASMifiable, Traceable { private static final String RETROWEAVER_ATTRIBUTE_NAME = "net.sourceforge.Retroweaver"; private final int retroweaverBuildNumber; private final int originalClassVersion; private final long timestamp; public RetroWeaverAttribute(int retroweaverBuildNumber, int originalClassVersion) { this(retroweaverBuildNumber, originalClassVersion, System.currentTimeMillis()); } public RetroWeaverAttribute(int retroweaverBuildNumber, int originalClassVersion, long timestamp) { super(RETROWEAVER_ATTRIBUTE_NAME); this.retroweaverBuildNumber = retroweaverBuildNumber; this.originalClassVersion = originalClassVersion; this.timestamp = timestamp; } public int getRetroweaverBuildNumber() { return retroweaverBuildNumber; } public int getOriginalClassVersion() { return originalClassVersion; } public long getTimestamp() { return timestamp; } public boolean isUnknown() { return false; } protected Attribute read( final ClassReader cr, final int off, final int len, final char[] buf, final int codeOff, final Label[] labels) { return new RetroWeaverAttribute( cr.readInt(off), cr.readInt(off+4), cr.readLong(off+8)); } protected ByteVector write( final ClassWriter cw, final byte[] code, final int len, final int maxStack, final int maxLocals) { ByteVector bv = new ByteVector(); bv.putInt(retroweaverBuildNumber); bv.putInt(originalClassVersion); bv.putLong(timestamp); return bv; } public void asmify( final StringBuffer buf, final String varName, final Map labelNames) { buf.append("Attribute ") .append(varName) .append(" = new net.sourceforge.retroweaver.RetroweaverAttribute(") .append(retroweaverBuildNumber) .append(", ") .append(originalClassVersion) .append(", ") .append(timestamp) .append(" /*").append(new java.util.Date(timestamp)).append("*/);\n"); } public void trace(final StringBuffer buf, final Map labelNames) { buf.append(retroweaverBuildNumber) .append(' ') .append(originalClassVersion) .append(' ') .append(timestamp) .append(" (").append(new java.util.Date(timestamp)).append(")\n"); } }