001 package net.sourceforge.retroweaver;
002
003 import java.util.Map;
004
005 import org.objectweb.asm.Attribute;
006 import org.objectweb.asm.ByteVector;
007 import org.objectweb.asm.ClassReader;
008 import org.objectweb.asm.ClassWriter;
009 import org.objectweb.asm.Label;
010 import org.objectweb.asm.util.ASMifiable;
011 import org.objectweb.asm.util.Traceable;
012
013 public class RetroWeaverAttribute extends Attribute implements ASMifiable, Traceable {
014
015 private static final String RETROWEAVER_ATTRIBUTE_NAME = "net.sourceforge.Retroweaver";
016
017 private final int retroweaverBuildNumber;
018
019 private final int originalClassVersion;
020
021 private final long timestamp;
022
023 public RetroWeaverAttribute(int retroweaverBuildNumber, int originalClassVersion) {
024 this(retroweaverBuildNumber, originalClassVersion, System.currentTimeMillis());
025 }
026
027 public RetroWeaverAttribute(int retroweaverBuildNumber, int originalClassVersion, long timestamp) {
028 super(RETROWEAVER_ATTRIBUTE_NAME);
029 this.retroweaverBuildNumber = retroweaverBuildNumber;
030 this.originalClassVersion = originalClassVersion;
031 this.timestamp = timestamp;
032 }
033
034 public int getRetroweaverBuildNumber() {
035 return retroweaverBuildNumber;
036 }
037
038 public int getOriginalClassVersion() {
039 return originalClassVersion;
040 }
041
042 public long getTimestamp() {
043 return timestamp;
044 }
045
046 public boolean isUnknown() {
047 return false;
048 }
049
050 protected Attribute read(
051 final ClassReader cr,
052 final int off,
053 final int len,
054 final char[] buf,
055 final int codeOff,
056 final Label[] labels)
057 {
058 return new RetroWeaverAttribute(
059 cr.readInt(off),
060 cr.readInt(off+4),
061 cr.readLong(off+8));
062 }
063
064 protected ByteVector write(
065 final ClassWriter cw,
066 final byte[] code,
067 final int len,
068 final int maxStack,
069 final int maxLocals)
070 {
071 ByteVector bv = new ByteVector();
072
073 bv.putInt(retroweaverBuildNumber);
074 bv.putInt(originalClassVersion);
075 bv.putLong(timestamp);
076
077 return bv;
078 }
079
080 public void asmify(
081 final StringBuffer buf,
082 final String varName,
083 final Map labelNames)
084 {
085 buf.append("Attribute ")
086 .append(varName)
087 .append(" = new net.sourceforge.retroweaver.RetroweaverAttribute(")
088 .append(retroweaverBuildNumber)
089 .append(", ")
090 .append(originalClassVersion)
091 .append(", ")
092 .append(timestamp)
093 .append(" /*").append(new java.util.Date(timestamp)).append("*/);\n");
094 }
095
096 public void trace(final StringBuffer buf, final Map labelNames) {
097 buf.append(retroweaverBuildNumber)
098 .append(' ')
099 .append(originalClassVersion)
100 .append(' ')
101 .append(timestamp)
102 .append(" (").append(new java.util.Date(timestamp)).append(")\n");
103 }
104
105 }
106
107