1 2 package org.codehaus.aspectwerkz.expression.ast; 3 4 import org.codehaus.aspectwerkz.expression.SubtypePatternType; 5 import org.codehaus.aspectwerkz.expression.regexp.NamePattern; 6 import org.codehaus.aspectwerkz.expression.regexp.Pattern; 7 import org.codehaus.aspectwerkz.expression.regexp.TypePattern; 8 9 import java.util.ArrayList ; 10 import java.util.List ; 11 12 public class ASTMethodPattern extends SimpleNode { 13 private TypePattern m_returnTypePattern; 14 15 private TypePattern m_declaringTypePattern; 16 17 private NamePattern m_methodNamePattern; 18 19 private List m_modifiers = new ArrayList (); 20 21 public ASTMethodPattern(int id) { 22 super(id); 23 } 24 25 public ASTMethodPattern(ExpressionParser p, int id) { 26 super(p, id); 27 } 28 29 public Object jjtAccept(ExpressionParserVisitor visitor, Object data) { 30 return visitor.visit(this, data); 31 } 32 33 public void addModifier(String modifier) { 34 m_modifiers.add(modifier); 35 } 36 37 public void setReturnTypePattern(String pattern) { 38 if (pattern.endsWith("+")) { 39 pattern = pattern.substring(0, pattern.length() - 1); 40 m_returnTypePattern = Pattern.compileTypePattern(pattern, SubtypePatternType.MATCH_ON_ALL_METHODS); 41 } else if (pattern.endsWith("#")) { 42 pattern = pattern.substring(0, pattern.length() - 1); 43 m_returnTypePattern = Pattern.compileTypePattern( 44 pattern, 45 SubtypePatternType.MATCH_ON_BASE_TYPE_METHODS_ONLY 46 ); 47 } else { 48 m_returnTypePattern = Pattern.compileTypePattern(pattern, SubtypePatternType.NOT_HIERARCHICAL); 49 } 50 } 51 52 public void setFullNamePattern(final String pattern) throws ParseException { 53 int index = pattern.lastIndexOf('.'); 54 String classPattern = null; 55 if (index > 0) { 57 classPattern = pattern.substring(0, index); 58 if (classPattern.endsWith(".")) { 59 classPattern += ".*"; 60 } 61 } else { 62 classPattern = "*..*"; 64 } 65 if (classPattern.endsWith("+")) { 66 classPattern = classPattern.substring(0, classPattern.length() - 1); 67 m_declaringTypePattern = Pattern.compileTypePattern(classPattern, SubtypePatternType.MATCH_ON_ALL_METHODS); 68 } else if (classPattern.endsWith("#")) { 69 classPattern = classPattern.substring(0, classPattern.length() - 1); 70 m_declaringTypePattern = Pattern.compileTypePattern( 71 classPattern, 72 SubtypePatternType.MATCH_ON_BASE_TYPE_METHODS_ONLY 73 ); 74 } else { 75 m_declaringTypePattern = Pattern.compileTypePattern(classPattern, SubtypePatternType.NOT_HIERARCHICAL); 76 } 77 String methodNamePattern = pattern.substring(index + 1, pattern.length()); 78 m_methodNamePattern = Pattern.compileNamePattern(methodNamePattern); 79 if ("new".equals(methodNamePattern)) { 80 throw new ParseException("Using a constructor pattern with an explicit return type is not allowed"); 81 } 82 } 83 84 public TypePattern getReturnTypePattern() { 85 return m_returnTypePattern; 86 } 87 88 public TypePattern getDeclaringTypePattern() { 89 return m_declaringTypePattern; 90 } 91 92 public NamePattern getMethodNamePattern() { 93 return m_methodNamePattern; 94 } 95 96 public List getModifiers() { 97 return m_modifiers; 98 } 99 } | Popular Tags |