View Javadoc

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