1 package org.seasar.cubby.controller.impl;
2
3 import java.io.Serializable;
4 import java.lang.reflect.InvocationTargetException;
5 import java.lang.reflect.Method;
6
7 import org.seasar.cubby.action.Action;
8 import org.seasar.cubby.action.ActionResult;
9 import org.seasar.cubby.action.Form;
10 import org.seasar.cubby.action.Validation;
11 import org.seasar.cubby.controller.ActionContext;
12 import org.seasar.cubby.controller.ActionDef;
13 import org.seasar.cubby.controller.Populator;
14 import org.seasar.framework.beans.BeanDesc;
15 import org.seasar.framework.beans.PropertyDesc;
16 import org.seasar.framework.beans.factory.BeanDescFactory;
17 import org.seasar.framework.container.ComponentDef;
18 import org.seasar.framework.log.Logger;
19
20
21
22
23
24
25 public class ActionContextImpl implements ActionContext, Serializable {
26
27 private static final long serialVersionUID = 2416038583405864226L;
28
29 private static final Object[] EMPTY_ARGS = new Object[0];
30
31 private final Logger logger = Logger.getLogger(this.getClass());
32
33 private ActionDef actionDef;
34
35 private Action action;
36
37 private Populator populator;
38
39 public void initialize(final ActionDef actionDef) {
40 this.actionDef = actionDef;
41 }
42
43 public Populator getPopulator() {
44 return populator;
45 }
46
47 public void setPopulator(final Populator populator) {
48 this.populator = populator;
49 }
50
51 public ComponentDef getComponentDef() {
52 return actionDef.getComponentDef();
53 }
54
55 public Method getMethod() {
56 return actionDef.getMethod();
57 }
58
59 public Action getAction() {
60 if (action == null) {
61 action = (Action) actionDef.getComponentDef().getComponent();
62 }
63 return action;
64 }
65
66 public Validation getValidation() {
67 return actionDef.getMethod().getAnnotation(Validation.class);
68 }
69
70 public ActionResult invoke() throws Throwable {
71 try {
72 final ActionResult result = (ActionResult) actionDef.getMethod().invoke(getAction(),
73 EMPTY_ARGS);
74 return result;
75 } catch (final InvocationTargetException ex) {
76 logger.log(ex);
77 throw ex.getCause();
78 }
79 }
80
81 public Object getFormBean() {
82 final Form form = getForm();
83 if (form == null) {
84 return null;
85 }
86 final Action action = getAction();
87 final String formName = form.value();
88 if (Form.THIS.equals(formName)) {
89 return action;
90 } else {
91 final BeanDesc beanDesc = BeanDescFactory.getBeanDesc(action.getClass());
92 final PropertyDesc propertyDesc = beanDesc.getPropertyDesc(formName);
93 final Object value = propertyDesc.getValue(action);
94 return value;
95 }
96 }
97
98 private Form getForm() {
99 return actionDef.getMethod().getAnnotation(Form.class);
100 }
101
102 }