View Javadoc

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   * @author baba
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 }