View Javadoc

1   package org.seasar.cubby.convention.impl;
2   
3   import static org.seasar.cubby.CubbyConstants.ATTR_ACTION_CLASS_NAME;
4   
5   import java.lang.reflect.Method;
6   import java.util.ArrayList;
7   import java.util.List;
8   import java.util.StringTokenizer;
9   
10  import javax.servlet.http.HttpServletRequest;
11  
12  import org.seasar.cubby.controller.ActionDef;
13  import org.seasar.cubby.controller.impl.ActionDefImpl;
14  import org.seasar.cubby.convention.CubbyConvention;
15  import org.seasar.cubby.util.CubbyUtils;
16  import org.seasar.framework.container.ComponentDef;
17  import org.seasar.framework.container.S2Container;
18  import org.seasar.framework.convention.NamingConvention;
19  import org.seasar.framework.exception.NoSuchMethodRuntimeException;
20  import org.seasar.framework.util.ClassUtil;
21  
22  public class CubbyConventionImpl implements CubbyConvention {
23  
24  	private S2Container container;
25  
26  	private NamingConvention namingConvention;
27  
28  	public void setContainer(final S2Container container) {
29  		this.container = container;
30  	}
31  
32  	public void setNamingConvention(final NamingConvention namingConvention) {
33  		this.namingConvention = namingConvention;
34  	}
35  
36  	public ActionDef fromPathToActionDef(final HttpServletRequest request,
37  			final String path) {
38  		final List<String> tokens = new ArrayList<String>();
39  		for (StringTokenizer tokenizer = new StringTokenizer(path, "/"); tokenizer
40  				.hasMoreTokens();) {
41  			final String token = tokenizer.nextToken();
42  			tokens.add(token);
43  		}
44  		if (tokens.isEmpty()) {
45  			return null;
46  		}
47  
48  		final String methodName = tokens.remove(tokens.size() - 1);
49  
50  		CubbyUtils.join(tokens.iterator(), '_');
51  		final String actionName = CubbyUtils.join(tokens.iterator(), '_')
52  				+ namingConvention.getActionSuffix();
53  		final ComponentDef componentDef = fromRequestOrActionNameToComponentDef(request, actionName);
54  		if (componentDef == null) {
55  			return null;
56  		}
57  
58  		final Method method;
59  		try {
60  			method = ClassUtil.getMethod(componentDef
61  					.getComponentClass(), methodName, new Class[0]);
62  		} catch (NoSuchMethodRuntimeException e) {
63  			return null;
64  		}
65  
66  		final ActionDef actionDef = new ActionDefImpl(componentDef, method);
67  
68  		return actionDef;
69  	}
70  
71  	private ComponentDef fromRequestOrActionNameToComponentDef(final HttpServletRequest request, final String actionName) {
72  		ComponentDef componentDef = fromRequestToComponentDef(request);
73  		if (componentDef == null) {
74  			componentDef = fromActionNameToComponentDef(actionName);
75  		}
76  		return componentDef;
77  	}
78  
79  	private ComponentDef fromRequestToComponentDef(final HttpServletRequest request) {
80  		final String actionClassName = (String) request.getAttribute(ATTR_ACTION_CLASS_NAME);
81  		if (actionClassName == null) {
82  			return null;
83  		}
84  		final Class<?> actionClass = ClassUtil.forName(actionClassName);
85  		if (!container.getRoot().hasComponentDef(actionClass)) {
86  			return null;
87  		}
88  		final ComponentDef componentDef = container.getRoot().getComponentDef(actionClass);
89  		return componentDef;
90  	}
91  
92  	private ComponentDef fromActionNameToComponentDef(final String actionName) {
93  		if (!container.getRoot().hasComponentDef(actionName)) {
94  			return null;
95  		}
96  		final ComponentDef componentDef = container.getRoot().getComponentDef(
97  				actionName);
98  		return componentDef;
99  	}
100 
101 }