1 /*************************************************************************************** 2 * Copyright (c) Jonas BonŽr, Alexandre Vasseur. All rights reserved. * 3 * http://aspectwerkz.codehaus.org * 4 * ---------------------------------------------------------------------------------- * 5 * The software in this package is published under the terms of the LGPL license * 6 * a copy of which has been included with this distribution in the license.txt file. * 7 **************************************************************************************/ 8 package org.codehaus.aspectwerkz.transform.inlining.spi; 9 10 import org.codehaus.aspectwerkz.reflect.ClassInfo; 11 import org.codehaus.aspectwerkz.definition.AspectDefinition; 12 import org.codehaus.aspectwerkz.transform.inlining.AdviceMethodInfo; 13 import org.codehaus.aspectwerkz.transform.inlining.AspectInfo; 14 import org.objectweb.asm.CodeVisitor; 15 import org.objectweb.asm.ClassWriter; 16 17 /*** 18 * TODO document 19 * 20 * @author <a href="mailto:jboner@codehaus.org">Jonas BonŽr </a> 21 */ 22 public interface AspectModel { 23 /*** 24 * Returns the aspect model type, which is an id for the the special aspect model, can be anything as long 25 * as it is unique. 26 * 27 * @return the aspect model type id 28 */ 29 String getAspectModelType(); 30 31 /*** 32 * Defines the aspect and adds definition to the aspect definition. 33 * 34 * @param aspectClassInfo 35 * @param aspectDef 36 * @param loader 37 */ 38 void defineAspect(ClassInfo aspectClassInfo, AspectDefinition aspectDef, ClassLoader loader); 39 40 /*** 41 * Returns info about the closure class, name and type (interface or class). 42 * 43 * @return the closure class info 44 */ 45 AroundClosureClassInfo getAroundClosureClassInfo(); 46 47 /*** 48 * Creates the methods required to implement or extend to implement the closure for the specific aspect model type. 49 * 50 * @param cw 51 * @param className 52 */ 53 void createMandatoryMethods(ClassWriter cw, String className); 54 55 /*** 56 * Creates invocation of the super class for the around closure. 57 * <p/> 58 * E.g. the invocation of super(..) in the constructor. 59 * <p/> 60 * Only needed to be implemented if the around closure base class is really a base class and not an interface. 61 * 62 * @param cv 63 */ 64 void createInvocationOfAroundClosureSuperClass(CodeVisitor cv); 65 66 /*** 67 * Creates aspect reference field (field in the jit jointpoint class f.e.) for an aspect instance. 68 * 69 * @param cw 70 * @param aspectInfo 71 * @param joinPointClassName 72 */ 73 void createAspectReferenceField(ClassWriter cw, AspectInfo aspectInfo, String joinPointClassName); 74 75 /*** 76 * Creates instantiation of an aspect instance. 77 * 78 * @param cv 79 * @param aspectInfo 80 * @param joinPointClassName 81 */ 82 void createAspectInstantiation(CodeVisitor cv, AspectInfo aspectInfo, String joinPointClassName); 83 84 /*** 85 * Handles the arguments to the around advice. 86 * 87 * @param cv 88 * @param adviceMethodInfo 89 */ 90 void createAroundAdviceArgumentHandling(CodeVisitor cv, AdviceMethodInfo adviceMethodInfo); 91 92 /*** 93 * Handles the arguments to the after advice. 94 * 95 * @param cv 96 * @param adviceMethodInfo 97 */ 98 void createBeforeAdviceArgumentHandling(CodeVisitor cv, AdviceMethodInfo adviceMethodInfo); 99 100 /*** 101 * Handles the arguments to the after advice. 102 * 103 * @param cv 104 * @param adviceMethodInfo 105 */ 106 void createAfterAdviceArgumentHandling(CodeVisitor cv, AdviceMethodInfo adviceMethodInfo); 107 108 /*** 109 * Should return true if the aspect model requires that Runtime Type Information (RTTI) is build up 110 * for the join point. Needed for reflective systems and systems that does not support f.e. args() binding. 111 * 112 * @return 113 */ 114 boolean requiresReflectiveInfo(); 115 116 /*** 117 * Info about the around closure class or interface for this specific aspect model. 118 * 119 * @author <a href="mailto:jboner@codehaus.org">Jonas BonŽr </a> 120 */ 121 public static class AroundClosureClassInfo { 122 private final String m_superClassName; 123 private final String[] m_interfaceNames; 124 public AroundClosureClassInfo(final String superClassName, final String[] interfaceNames) { 125 m_superClassName = superClassName; 126 m_interfaceNames = interfaceNames; 127 } 128 129 public String getSuperClassName() { 130 return m_superClassName; 131 } 132 133 public String[] getInterfaceNames() { 134 return m_interfaceNames; 135 } 136 137 /*** 138 * Type safe enum for the around closure class type. 139 */ 140 public static class Type { 141 public static final Type INTERFACE = new Type("INTERFACE"); 142 public static final Type CLASS = new Type("CLASS"); 143 private final String m_name; 144 private Type(String name) { 145 m_name = name; 146 } 147 public String toString() { 148 return m_name; 149 } 150 } 151 152 } 153 }