1 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 [] 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 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 { 47 String [] 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 className = classNames[i]; 60 dsoContextMock.expects(once()).method("addInclude").with(eq(className), ANYTHING, eq("* " + className + ".*(..)")); 61 } 62 63 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;", "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;", "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 |