1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.pluto.core.impl;
21
22 import java.util.HashMap;
23 import java.util.Iterator;
24 import java.util.Map;
25
26 import javax.portlet.ActionResponse;
27 import javax.portlet.PortletMode;
28 import javax.portlet.PortletModeException;
29 import javax.portlet.WindowState;
30 import javax.portlet.WindowStateException;
31
32 import org.apache.pluto.core.InternalActionResponse;
33 import org.apache.pluto.om.window.PortletWindow;
34 import org.apache.pluto.services.information.DynamicInformationProvider;
35 import org.apache.pluto.services.information.InformationProviderAccess;
36 import org.apache.pluto.services.information.ResourceURLProvider;
37 import org.apache.pluto.util.StringUtils;
38
39 public class ActionResponseImpl extends PortletResponseImpl
40 implements ActionResponse, InternalActionResponse {
41
42 /***
43 * Is it still allowed to invoke the method sendRedirect() ?
44 */
45 boolean redirectAllowed = true;
46
47 private boolean redirected;
48 private String redirectLocation;
49
50 private Map renderParameters = new HashMap();
51 private WindowState windowState = null;
52 private PortletMode portletMode = null;
53
54 private DynamicInformationProvider provider;
55
56
57 public ActionResponseImpl(PortletWindow portletWindow,
58 javax.servlet.http.HttpServletRequest servletRequest,
59 javax.servlet.http.HttpServletResponse servletResponse)
60 {
61 super(portletWindow, servletRequest, servletResponse);
62
63 provider = InformationProviderAccess.getDynamicProvider(getHttpServletRequest());
64
65 }
66
67
68 public void setWindowState (WindowState windowState) throws WindowStateException
69 {
70 if (redirected) {
71 throw new IllegalStateException("it is not allowed to invoke setWindowState after sendRedirect has been called");
72 }
73
74 if (provider.isWindowStateAllowed(windowState)) {
75 this.windowState = windowState;
76 } else {
77 throw new WindowStateException("Can't set this WindowState",windowState);
78 }
79 redirectAllowed = false;
80 }
81
82 public void setPortletMode (PortletMode portletMode) throws PortletModeException
83 {
84 if (redirected) {
85 throw new IllegalStateException("it is not allowed to invoke setPortletMode after sendRedirect has been called");
86 }
87
88
89 boolean supported = provider.isPortletModeAllowed(portletMode);
90
91
92 if (supported)
93 {
94 supported = PortletModeHelper.isPortletModeAllowedByPortlet(getInternalPortletWindow(), portletMode);
95 }
96
97
98 if (supported) {
99 this.portletMode = portletMode;
100 } else
101 throw new PortletModeException("Can't set this PortletMode",portletMode);
102
103 redirectAllowed = false;
104
105 }
106
107 public void sendRedirect(String location) throws java.io.IOException
108 {
109 if (redirectAllowed) {
110 if (location != null) {
111 javax.servlet.http.HttpServletResponse redirectResponse = _getHttpServletResponse();
112 while (redirectResponse instanceof javax.servlet.http.HttpServletResponseWrapper) {
113 redirectResponse = (javax.servlet.http.HttpServletResponse)
114 ((javax.servlet.http.HttpServletResponseWrapper)redirectResponse).getResponse();
115 }
116 ResourceURLProvider provider = InformationProviderAccess.getDynamicProvider(getHttpServletRequest()).getResourceURLProvider(getInternalPortletWindow());
117 if (location.indexOf("://") != -1) {
118 provider.setAbsoluteURL(location);
119 } else {
120 provider.setFullPath(location);
121 }
122 location = redirectResponse.encodeRedirectURL(provider.toString());
123
124 redirectLocation = location;
125 redirected = true;
126 }
127 } else
128 throw new java.lang.IllegalStateException("Can't invoke sendRedirect() after certain methods have been called");
129
130 }
131
132 public void setRenderParameters(Map parameters)
133 {
134 if (redirected) {
135 throw new IllegalStateException("Can't invoke setRenderParameters() after sendRedirect() has been called");
136 }
137 if (parameters == null) {
138 throw new IllegalArgumentException("Render parameters must not be null.");
139 }
140 for (Iterator iter = parameters.entrySet().iterator(); iter.hasNext();) {
141 Map.Entry entry = (Map.Entry)iter.next();
142 if (!(entry.getKey() instanceof String)) {
143 throw new IllegalArgumentException("Key must not be null and of type java.lang.String.");
144 }
145 if (!(entry.getValue() instanceof String[])) {
146 throw new IllegalArgumentException("Value must not be null and of type java.lang.String[].");
147 }
148 }
149
150 renderParameters = StringUtils.copyParameters(parameters);
151
152 redirectAllowed = false;
153 }
154
155 public void setRenderParameter(String key, String value)
156 {
157 if (redirected) {
158 throw new IllegalStateException("Can't invoke setRenderParameter() after sendRedirect() has been called");
159 }
160
161 if ((key == null) || (value == null)) {
162 throw new IllegalArgumentException("Render parameter key or value must not be null.");
163 }
164
165 renderParameters.put(key, new String[] {value});
166
167 redirectAllowed = false;
168 }
169
170 public void setRenderParameter(String key, String[] values)
171 {
172 if (redirected) {
173 throw new IllegalStateException("Can't invoke setRenderParameter() after sendRedirect() has been called");
174 }
175
176 if (key == null || values == null || values.length == 0) {
177 throw new IllegalArgumentException("Render parameter key or value must not be null or values be an empty array.");
178 }
179
180 renderParameters.put(key, StringUtils.copy(values));
181
182 redirectAllowed = false;
183 }
184
185
186
187 public Map getRenderParameters()
188 {
189 return renderParameters;
190 }
191
192 public PortletMode getChangedPortletMode()
193 {
194 return this.portletMode;
195 }
196
197 public WindowState getChangedWindowState()
198 {
199 return this.windowState;
200 }
201
202 public String getRedirectLocation() {
203 return redirectLocation;
204 }
205
206 }