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