1 4 package org.terracotta.modules.iBatis_2_2_0; 5 6 import com.tc.asm.ClassAdapter; 7 import com.tc.asm.ClassVisitor; 8 import com.tc.asm.Label; 9 import com.tc.asm.MethodAdapter; 10 import com.tc.asm.MethodVisitor; 11 import com.tc.asm.Opcodes; 12 import com.tc.object.bytecode.ClassAdapterFactory; 13 14 15 public class IBatisClassAdapter extends ClassAdapter implements Opcodes, ClassAdapterFactory { 16 private final static String SQLMAPCLIENT_CLASS_SLASHES = "com/ibatis/sqlmap/engine/impl/SqlMapClientImpl"; 17 private final static String SIMPLEDATASOURCE_CLASS_SLASHES = "com/ibatis/common/jdbc/SimpleDataSource"; 18 private String classNameSlashes; 19 20 public IBatisClassAdapter() { 21 super(null); 22 } 23 24 public IBatisClassAdapter(ClassVisitor cv) { 25 super(cv); 26 } 27 28 public ClassAdapter create(ClassVisitor visitor, ClassLoader loader) { 29 return new IBatisClassAdapter(visitor); 30 } 31 32 public void visit(int version, int access, String name, String signature, String superName, String [] interfaces) { 33 super.visit(version, access, name, signature, superName, interfaces); 34 this.classNameSlashes = name; 35 } 36 37 public MethodVisitor visitMethod(int access, String name, String desc, String signature, String [] exceptions) { 38 MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); 39 if (SIMPLEDATASOURCE_CLASS_SLASHES.equals(classNameSlashes)) { 40 if ("popConnection".equals(name) && "(Ljava/lang/String;Ljava/lang/String;)Lcom/ibatis/common/jdbc/SimpleDataSource$SimplePooledConnection;".equals(desc)) { 41 mv = new PopConnectionMethodAdapter(mv); 42 } 43 } 44 return mv; 45 } 46 47 public void visitEnd() { 48 if (SQLMAPCLIENT_CLASS_SLASHES.equals(classNameSlashes)) { 49 addSqlMapClientDefaultConstructor(); 50 } else if (SIMPLEDATASOURCE_CLASS_SLASHES.equals(classNameSlashes)) { 51 addSimpleDataSourceConstructor(); 52 } 53 super.visitEnd(); 54 } 55 56 private void addSimpleDataSourceConstructor() { 57 MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null); 58 mv.visitCode(); 59 Label l0 = new Label(); 60 mv.visitLabel(l0); 61 mv.visitLineNumber(115, l0); 62 mv.visitVarInsn(ALOAD, 0); 63 mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V"); 64 Label l1 = new Label(); 65 mv.visitLabel(l1); 66 mv.visitLineNumber(78, l1); 67 mv.visitVarInsn(ALOAD, 0); 68 mv.visitTypeInsn(NEW, "java/lang/Object"); 69 mv.visitInsn(DUP); 70 mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V"); 71 mv.visitFieldInsn(PUTFIELD, SIMPLEDATASOURCE_CLASS_SLASHES, "POOL_LOCK", "Ljava/lang/Object;"); 72 Label l2 = new Label(); 73 mv.visitLabel(l2); 74 mv.visitLineNumber(79, l2); 75 mv.visitVarInsn(ALOAD, 0); 76 mv.visitTypeInsn(NEW, "java/util/ArrayList"); 77 mv.visitInsn(DUP); 78 mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V"); 79 mv.visitFieldInsn(PUTFIELD, SIMPLEDATASOURCE_CLASS_SLASHES, "idleConnections", "Ljava/util/List;"); 80 Label l3 = new Label(); 81 mv.visitLabel(l3); 82 mv.visitLineNumber(80, l3); 83 mv.visitVarInsn(ALOAD, 0); 84 mv.visitTypeInsn(NEW, "java/util/ArrayList"); 85 mv.visitInsn(DUP); 86 mv.visitMethodInsn(INVOKESPECIAL, "java/util/ArrayList", "<init>", "()V"); 87 mv.visitFieldInsn(PUTFIELD, SIMPLEDATASOURCE_CLASS_SLASHES, "activeConnections", "Ljava/util/List;"); 88 Label l4 = new Label(); 89 mv.visitLabel(l4); 90 mv.visitLineNumber(81, l4); 91 mv.visitVarInsn(ALOAD, 0); 92 mv.visitInsn(LCONST_0); 93 mv.visitFieldInsn(PUTFIELD, SIMPLEDATASOURCE_CLASS_SLASHES, "requestCount", "J"); 94 Label l5 = new Label(); 95 mv.visitLabel(l5); 96 mv.visitLineNumber(82, l5); 97 mv.visitVarInsn(ALOAD, 0); 98 mv.visitInsn(LCONST_0); 99 mv.visitFieldInsn(PUTFIELD, SIMPLEDATASOURCE_CLASS_SLASHES, "accumulatedRequestTime", "J"); 100 Label l6 = new Label(); 101 mv.visitLabel(l6); 102 mv.visitLineNumber(83, l6); 103 mv.visitVarInsn(ALOAD, 0); 104 mv.visitInsn(LCONST_0); 105 mv.visitFieldInsn(PUTFIELD, SIMPLEDATASOURCE_CLASS_SLASHES, "accumulatedCheckoutTime", "J"); 106 Label l7 = new Label(); 107 mv.visitLabel(l7); 108 mv.visitLineNumber(84, l7); 109 mv.visitVarInsn(ALOAD, 0); 110 mv.visitInsn(LCONST_0); 111 mv.visitFieldInsn(PUTFIELD, SIMPLEDATASOURCE_CLASS_SLASHES, "claimedOverdueConnectionCount", "J"); 112 Label l8 = new Label(); 113 mv.visitLabel(l8); 114 mv.visitLineNumber(85, l8); 115 mv.visitVarInsn(ALOAD, 0); 116 mv.visitInsn(LCONST_0); 117 mv.visitFieldInsn(PUTFIELD, SIMPLEDATASOURCE_CLASS_SLASHES, "accumulatedCheckoutTimeOfOverdueConnections", "J"); 118 Label l9 = new Label(); 119 mv.visitLabel(l9); 120 mv.visitLineNumber(86, l9); 121 mv.visitVarInsn(ALOAD, 0); 122 mv.visitInsn(LCONST_0); 123 mv.visitFieldInsn(PUTFIELD, SIMPLEDATASOURCE_CLASS_SLASHES, "accumulatedWaitTime", "J"); 124 Label l10 = new Label(); 125 mv.visitLabel(l10); 126 mv.visitLineNumber(87, l10); 127 Label l11 = new Label(); 128 mv.visitLabel(l11); 129 mv.visitLineNumber(88, l11); 130 mv.visitVarInsn(ALOAD, 0); 131 mv.visitInsn(LCONST_0); 132 mv.visitFieldInsn(PUTFIELD, SIMPLEDATASOURCE_CLASS_SLASHES, "badConnectionCount", "J"); 133 Label l12 = new Label(); 134 mv.visitLabel(l12); 135 mv.visitLineNumber(116, l12); 136 Label l13 = new Label(); 137 mv.visitLabel(l13); 138 mv.visitLineNumber(117, l13); 139 mv.visitInsn(RETURN); 140 Label l14 = new Label(); 141 mv.visitLabel(l14); 142 mv.visitMaxs(0, 0); 143 mv.visitEnd(); 144 } 145 146 private void addSqlMapClientDefaultConstructor() { 147 MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null); 148 mv.visitCode(); 149 Label l0 = new Label(); 150 mv.visitLabel(l0); 151 mv.visitLineNumber(55, l0); 152 mv.visitVarInsn(ALOAD, 0); 153 mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V"); 154 Label l1 = new Label(); 155 mv.visitLabel(l1); 156 mv.visitLineNumber(48, l1); 157 mv.visitVarInsn(ALOAD, 0); 158 mv.visitTypeInsn(NEW, "java/lang/ThreadLocal"); 159 mv.visitInsn(DUP); 160 mv.visitMethodInsn(INVOKESPECIAL, "java/lang/ThreadLocal", "<init>", "()V"); 161 mv.visitFieldInsn(PUTFIELD, SQLMAPCLIENT_CLASS_SLASHES, "localSqlMapSession", "Ljava/lang/ThreadLocal;"); 162 Label l2 = new Label(); 163 mv.visitLabel(l2); 164 mv.visitLineNumber(56, l2); 165 Label l3 = new Label(); 166 mv.visitLabel(l3); 167 mv.visitLineNumber(57, l3); 168 mv.visitInsn(RETURN); 169 Label l4 = new Label(); 170 mv.visitLabel(l4); 171 mv.visitMaxs(0, 0); 172 mv.visitEnd(); 173 } 174 175 private static class PopConnectionMethodAdapter extends MethodAdapter implements Opcodes { 176 public PopConnectionMethodAdapter(MethodVisitor mv) { 177 super(mv); 178 } 179 180 public void visitCode() { 181 super.visitCode(); 182 mv.visitVarInsn(ALOAD, 0); 183 mv.visitFieldInsn(GETFIELD, SIMPLEDATASOURCE_CLASS_SLASHES, "jdbcDriver", "Ljava/lang/String;"); 184 mv.visitMethodInsn(INVOKESTATIC, "com/ibatis/common/resources/Resources", "instantiate", "(Ljava/lang/String;)Ljava/lang/Object;"); 185 mv.visitInsn(POP); 186 } 187 } 188 } 189 | Popular Tags |