1 package org.springframework.roo.addon.finder;
2
3 import java.util.ArrayList;
4 import java.util.List;
5 import java.util.SortedSet;
6 import java.util.TreeSet;
7
8 import org.springframework.roo.addon.beaninfo.BeanInfoMetadata;
9 import org.springframework.roo.addon.entity.RooEntity;
10 import org.springframework.roo.classpath.details.FieldMetadata;
11 import org.springframework.roo.classpath.details.MethodMetadata;
12 import org.springframework.roo.support.util.Assert;
13
14
15
16
17
18
19
20
21
22 public final class FinderTokenizer {
23
24 private SortedSet<FieldToken> fieldTokens;
25
26 private BeanInfoMetadata beanInfoMetadata;
27
28 private String completeFinder;
29
30
31
32
33
34
35
36
37
38
39 public List<Token> tokenize(String finder, String plural, BeanInfoMetadata beanInfoMetadata) {
40 Assert.notNull(finder, "finder method signature required");
41 Assert.hasText(finder, "Empty finder Strings not allowd");
42 Assert.hasText(plural, "Plural required");
43 Assert.notNull(beanInfoMetadata, "BeanInfoMetadata required");
44
45 this.beanInfoMetadata = beanInfoMetadata;
46 this.completeFinder = finder;
47
48
49 finder = finder.replace("find" + plural +"By", "");
50
51 fieldTokens = new TreeSet<FieldToken>();
52
53 for(MethodMetadata metadata : beanInfoMetadata.getPublicMutators()) {
54 FieldMetadata fieldMetadata = beanInfoMetadata.getFieldForPropertyName(metadata.getParameterNames().get(0));
55
56
57 if(fieldMetadata != null) {
58 fieldTokens.add(new FieldToken(fieldMetadata));
59 }
60 }
61
62 List<Token> tokens = new ArrayList<Token>();
63
64 while(finder.length() > 0) {
65 Token token = getFirstToken(finder);
66 if(token != null) {
67 if(token instanceof FieldToken) {
68 tokens.add((FieldToken)token);
69 }
70 if(token instanceof ReservedToken) {
71 tokens.add((ReservedToken)token);
72 }
73 finder = finder.substring(token.getValue().length());
74 }
75 }
76
77 return tokens;
78 }
79
80 private Token getFirstToken(String finder) {
81 for(FieldToken fieldToken: fieldTokens) {
82 if (finder.startsWith(fieldToken.getValue())) {
83 return fieldToken;
84 }
85 }
86 for(ReservedToken reservedToken: ReservedTokenHolder.getAllTokens()) {
87 if (finder.startsWith(reservedToken.getValue())) {
88 return reservedToken;
89 }
90 }
91 if (finder.length() > 0) {
92 throw new IllegalStateException("Dynamic finder is unable to match '" + finder + "' token of '" + completeFinder + "' finder definition in " + beanInfoMetadata.getJavaBean().getSimpleTypeName() + ".java");
93 }
94 return null;
95 }
96 }