1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.seasar.cubby.internal.util;
18
19 import java.lang.reflect.Method;
20
21 import org.seasar.cubby.action.Accept;
22 import org.seasar.cubby.action.OnSubmit;
23 import org.seasar.cubby.action.Path;
24 import org.seasar.cubby.action.RequestMethod;
25
26
27
28
29
30
31 public class MetaUtils {
32
33
34 private static final String INDEX_METHOD_NAME = "index";
35
36
37 private static final Accept DEFAULT_ACCEPT_ANNOTATION;
38 static {
39 @Accept
40 class AcceptDummy {
41 }
42 DEFAULT_ACCEPT_ANNOTATION = AcceptDummy.class
43 .getAnnotation(Accept.class);
44 }
45
46
47
48
49
50
51
52
53 public static String getActionDirectory(final Class<?> actionClass) {
54 final String actionName;
55 final Path path = actionClass.getAnnotation(Path.class);
56 if (path != null && !StringUtils.isEmpty(path.value())) {
57 actionName = path.value();
58 } else {
59 final String name = left(actionClass.getSimpleName(), "$");
60 actionName = toFirstLower(name.replaceAll(
61 "(.*[.])*([^.]+)(Action$)", "$2"));
62 }
63 return actionName;
64 }
65
66
67
68
69
70
71
72
73
74
75 private static String left(final String text, final String sep) {
76 final int pos = text.indexOf(sep);
77 if (pos != -1) {
78 return text.substring(0, pos);
79 }
80 return text;
81 }
82
83
84
85
86
87
88
89
90 private static String toFirstLower(final String text) {
91 if (StringUtils.isEmpty(text)) {
92 throw new IllegalArgumentException("text is empty.");
93 }
94 final StringBuilder sb = new StringBuilder();
95 sb.append(text.substring(0, 1).toLowerCase());
96 if (text.length() > 1) {
97 sb.append(text.substring(1));
98 }
99 return sb.toString();
100 }
101
102
103
104
105
106
107
108
109
110
111 public static String getActionPath(final Class<?> actionClass,
112 final Method method) {
113 final String path;
114 final String actionMethodName = getActionMethodName(method);
115 if (actionMethodName.startsWith("/")) {
116 path = actionMethodName;
117 } else {
118 final String actionDirectory = getActionDirectory(actionClass);
119 if ("/".equals(actionDirectory)) {
120 path = "/" + actionMethodName;
121 } else {
122 path = "/" + actionDirectory + "/" + actionMethodName;
123 }
124 }
125 return path;
126 }
127
128
129
130
131
132
133
134
135 private static String getActionMethodName(final Method method) {
136 final String actionName;
137 final Path path = method.getAnnotation(Path.class);
138 if (path != null && !StringUtils.isEmpty(path.value())) {
139 if ("/".equals(path.value())) {
140 actionName = "";
141 } else {
142 actionName = path.value();
143 }
144 } else {
145 final String methodName = method.getName();
146 if (INDEX_METHOD_NAME.equals(methodName)) {
147 actionName = "";
148 } else {
149 actionName = methodName;
150 }
151 }
152 return actionName;
153 }
154
155
156
157
158
159
160
161
162
163
164 public static RequestMethod[] getAcceptableRequestMethods(
165 final Class<?> actionClass, final Method method) {
166 final Accept accept;
167 if (method.isAnnotationPresent(Accept.class)) {
168 accept = method.getAnnotation(Accept.class);
169 } else if (actionClass.isAnnotationPresent(Accept.class)) {
170 accept = actionClass.getAnnotation(Accept.class);
171 } else {
172 accept = DEFAULT_ACCEPT_ANNOTATION;
173 }
174 return accept.value();
175 }
176
177
178
179
180
181
182
183
184 public static int getPriority(final Method method) {
185 final Path path = method.getAnnotation(Path.class);
186 return path != null ? path.priority() : Integer.MAX_VALUE;
187 }
188
189
190
191
192
193
194
195
196
197
198
199 public static String getOnSubmit(final Method method) {
200 final OnSubmit onSubmit = method.getAnnotation(OnSubmit.class);
201 final String parameterName;
202 if (onSubmit == null) {
203 parameterName = null;
204 } else {
205 parameterName = onSubmit.value();
206 }
207 return parameterName;
208 }
209
210 }