1 package org.seasar.cubby.action;
2
3 import static org.seasar.cubby.CubbyConstants.ATTR_ACTION;
4 import static org.seasar.cubby.CubbyConstants.ATTR_CONTEXT_PATH;
5 import static org.seasar.cubby.CubbyConstants.ATTR_MESSAGES;
6 import static org.seasar.cubby.CubbyConstants.ATTR_OUTPUT_VALUES;
7 import static org.seasar.cubby.CubbyConstants.RES_MESSAGES;
8
9 import java.util.ArrayList;
10 import java.util.Enumeration;
11 import java.util.Iterator;
12 import java.util.List;
13 import java.util.Map;
14 import java.util.ResourceBundle;
15
16 import javax.servlet.http.HttpServletRequest;
17 import javax.servlet.http.HttpServletRequestWrapper;
18
19 import org.seasar.cubby.controller.ActionContext;
20 import org.seasar.cubby.controller.Populator;
21 import org.seasar.cubby.util.LocaleHolder;
22 import org.seasar.framework.beans.BeanDesc;
23 import org.seasar.framework.beans.PropertyDesc;
24 import org.seasar.framework.beans.factory.BeanDescFactory;
25 import org.seasar.framework.util.ResourceBundleUtil;
26
27
28
29
30
31 public class ForwardHttpServletRequestWrapper extends HttpServletRequestWrapper {
32
33 private final ActionContext context;
34
35 private final Map<String, String> outputValues;
36
37 private final Map<?, ?> messages;
38
39 public ForwardHttpServletRequestWrapper(final HttpServletRequest request,
40 final ActionContext context) {
41 super(request);
42
43 this.context = context;
44
45 final Populator populator = context.getPopulator();
46 this.outputValues = populator.describe(context.getFormBean());
47
48 final ResourceBundle resource = ResourceBundleUtil.getBundle(
49 RES_MESSAGES, LocaleHolder.getLocale());
50 this.messages = ResourceBundleUtil.convertMap(resource);
51 }
52
53 @Override
54 public Object getAttribute(final String name) {
55 final Object attribute;
56 if (ATTR_CONTEXT_PATH.equals(name)) {
57 attribute = this.getContextPath();
58 } else if (ATTR_ACTION.equals(name)) {
59 attribute = context.getAction();
60 } else if (ATTR_OUTPUT_VALUES.equals(name)) {
61 attribute = outputValues;
62 } else if (ATTR_MESSAGES.equals(name)) {
63 attribute = messages;
64 } else {
65 final Class<?> concreteClass = context.getComponentDef().getConcreteClass();
66 final BeanDesc beanDesc = BeanDescFactory.getBeanDesc(concreteClass);
67 if (beanDesc.hasPropertyDesc(name)) {
68 final PropertyDesc propertyDesc = beanDesc.getPropertyDesc(name);
69 if (propertyDesc.isReadable()) {
70 attribute = propertyDesc.getValue(context.getAction());
71 } else {
72 attribute = super.getAttribute(name);
73 }
74 } else {
75 attribute = super.getAttribute(name);
76 }
77 }
78 return attribute;
79 }
80
81
82 @SuppressWarnings("unchecked")
83 @Override
84 public Enumeration getAttributeNames() {
85 final List attributeNames = new ArrayList();
86
87 attributeNames.add(ATTR_ACTION);
88 attributeNames.add(ATTR_OUTPUT_VALUES);
89
90 final Class<?> concreteClass = context.getComponentDef().getConcreteClass();
91 final BeanDesc beanDesc = BeanDescFactory.getBeanDesc(concreteClass);
92 for (int i = 0; i < beanDesc.getPropertyDescSize(); i++) {
93 PropertyDesc propertyDesc = beanDesc.getPropertyDesc(i);
94 if (propertyDesc.isReadable()) {
95 attributeNames.add(propertyDesc.getPropertyName());
96 }
97 }
98
99 Enumeration defaultAttributeNames = super.getAttributeNames();
100 while (defaultAttributeNames.hasMoreElements()) {
101 attributeNames.add((String) defaultAttributeNames.nextElement());
102 }
103 return new IteratorEnumeration(attributeNames.iterator());
104 }
105
106 class IteratorEnumeration<T> implements Enumeration<T> {
107
108 private final Iterator<T> iterator;
109
110 public IteratorEnumeration(Iterator<T> iterator) {
111 this.iterator = iterator;
112 }
113
114 public boolean hasMoreElements() {
115 return iterator.hasNext();
116 }
117
118 public T nextElement() {
119 return iterator.next();
120 }
121
122 }
123
124 }