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