KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > tcspring > ClassHierarchyWalkerTest


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

4 package com.tcspring;
5
6 import org.jmock.Mock;
7 import org.jmock.MockObjectTestCase;
8
9 import com.tc.asm.ClassWriter;
10 import com.tc.asm.FieldVisitor;
11 import com.tc.asm.MethodVisitor;
12 import com.tc.asm.Opcodes;
13 import com.tc.aspectwerkz.reflect.ClassInfo;
14 import com.tc.aspectwerkz.reflect.impl.asm.AsmClassInfo;
15 import com.tc.object.bytecode.hook.DSOContext;
16
17 public class ClassHierarchyWalkerTest extends MockObjectTestCase implements Opcodes {
18
19   private DSOContext dsoContext;
20   private Mock dsoContextMock;
21   private ClassHierarchyWalker walker;
22
23   protected void setUp() {
24     dsoContextMock = mock(DSOContext.class);
25     dsoContext = (DSOContext) dsoContextMock.proxy();
26
27     walker = new ClassHierarchyWalker("id", dsoContext);
28   }
29
30   public void testWalkThroughClassHierarchy() {
31     String JavaDoc[] classNames = {
32         "com.tcspring.beans.SimpleBean",
33         "com.tcspring.beans.SimpleBean1",
34         "com.tcspring.beans.SimpleBean2",
35         "com.tcspring.beans.SimpleParentBean",
36         "com.tcspring.beans.SimplePropertyBean" };
37
38     for (int i = 0; i < classNames.length; i++) {
39       String JavaDoc className = classNames[i];
40       dsoContextMock.expects(once()).method("addInclude").with(eq(className), ANYTHING, eq("* " + className + ".*(..)"));
41     }
42
43     walker.walkClass(classNames[0], getClass().getClassLoader());
44   }
45   
46   public void testWalkWithGenerics() throws Exception JavaDoc {
47     String JavaDoc[] classNames = {
48         "com.tcspring.beans.SimpleBeanWithGenerics",
49         "com.tcspring.beans.SimpleBean1",
50         "com.tcspring.beans.SimpleBean2",
51         "java.util.ArrayList",
52         "java.util.AbstractList",
53         "java.util.AbstractCollection",
54         "com.tcspring.beans.SimplePropertyBean",
55         "com.tcspring.beans.SimpleBean",
56         "com.tcspring.beans.SimpleParentBean" };
57
58     for (int i = 0; i < classNames.length; i++) {
59       String JavaDoc className = classNames[i];
60       dsoContextMock.expects(once()).method("addInclude").with(eq(className), ANYTHING, eq("* " + className + ".*(..)"));
61     }
62     
63     /*
64      * constructing ClassInfo from the generated bytecode to retain 1.4 compatibility
65      *
66      * public class SimpleBeanWithGenerics {
67      * public Map<SimpleBean1, SimpleBean2[]> map1;
68      * public Map<SimpleBean1, ArrayList<SimplePropertyBean>> map2;
69      * }
70      */

71     ClassWriter cw = new ClassWriter(true);
72
73     cw.visit(V1_5, ACC_PUBLIC + ACC_SUPER, "com/tcspring/beans/SimpleBeanWithGenerics", null, "java/lang/Object", null);
74
75     cw.visitSource("SimpleBeanWithGenerics.java", null);
76
77     FieldVisitor fv1 = cw.visitField(ACC_PUBLIC, "map1", "Ljava/util/Map;", //
78
"Ljava/util/Map<Lcom/tcspring/beans/SimpleBean1;[Lcom/tcspring/beans/SimpleBean2;>;", null);
79     fv1.visitEnd();
80
81     FieldVisitor fv2 = cw.visitField(ACC_PUBLIC,"map2","Ljava/util/Map;", //
82
"Ljava/util/Map<Lcom/tcspring/beans/SimpleBean1;Ljava/util/ArrayList<Lcom/tcspring/beans/SimplePropertyBean;>;>;", null);
83     fv2.visitEnd();
84
85     MethodVisitor mv = cw.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null);
86     mv.visitCode();
87     mv.visitVarInsn(ALOAD, 0);
88     mv.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V");
89     mv.visitInsn(RETURN);
90     mv.visitMaxs(1, 1);
91     mv.visitEnd();
92
93     cw.visitEnd();
94
95     byte[] bytecode = cw.toByteArray();
96
97     ClassInfo classInfo = AsmClassInfo.newClassInfo(bytecode, getClass().getClassLoader());
98     
99     walker.walkClass(classInfo);
100   }
101 }
102
103
Popular Tags