KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > terracotta > modules > iBatis_2_2_0 > IBatisClassAdapter


1 /*
2  * All content copyright (c) 2003-2007 Terracotta, Inc., except as may otherwise be noted in a separate copyright notice. All rights reserved.
3  */

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 JavaDoc SQLMAPCLIENT_CLASS_SLASHES = "com/ibatis/sqlmap/engine/impl/SqlMapClientImpl";
17   private final static String JavaDoc SIMPLEDATASOURCE_CLASS_SLASHES = "com/ibatis/common/jdbc/SimpleDataSource";
18   private String JavaDoc 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 JavaDoc loader) {
29     return new IBatisClassAdapter(visitor);
30   }
31   
32   public void visit(int version, int access, String JavaDoc name, String JavaDoc signature, String JavaDoc superName, String JavaDoc[] interfaces) {
33     super.visit(version, access, name, signature, superName, interfaces);
34     this.classNameSlashes = name;
35   }
36   
37   public MethodVisitor visitMethod(int access, String JavaDoc name, String JavaDoc desc, String JavaDoc signature, String JavaDoc[] 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