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