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
56 if (index > 0) {
57 classPattern = pattern.substring(0, index);
58 if (classPattern.endsWith(".")) {
59 classPattern += ".*";
60 }
61 } else {
62
63 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 }