001 // Copyright 2005 The Apache Software Foundation
002 //
003 // Licensed under the Apache License, Version 2.0 (the "License");
004 // you may not use this file except in compliance with the License.
005 // You may obtain a copy of the License at
006 //
007 // http://www.apache.org/licenses/LICENSE-2.0
008 //
009 // Unless required by applicable law or agreed to in writing, software
010 // distributed under the License is distributed on an "AS IS" BASIS,
011 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
012 // See the License for the specific language governing permissions and
013 // limitations under the License.
014
015 package org.apache.tapestry.web;
016
017 import org.apache.hivemind.ApplicationRuntimeException;
018 import org.apache.hivemind.HiveMind;
019 import org.apache.hivemind.util.Defense;
020 import org.apache.tapestry.describe.DescriptionReceiver;
021
022 import javax.servlet.RequestDispatcher;
023 import javax.servlet.ServletException;
024 import javax.servlet.http.HttpServletRequest;
025 import javax.servlet.http.HttpServletResponse;
026 import javax.servlet.http.HttpSession;
027 import java.io.IOException;
028 import java.security.Principal;
029 import java.util.List;
030 import java.util.Locale;
031
032 /**
033 * Adapter from {@link javax.servlet.http.HttpServletRequest} to
034 * {@link org.apache.tapestry.web.WebRequest}.
035 *
036 * @author Howard M. Lewis Ship
037 * @since 4.0
038 */
039 public class ServletWebRequest implements WebRequest
040 {
041 private final HttpServletRequest _servletRequest;
042
043 private final HttpServletResponse _servletResponse;
044
045 private WebSession _webSession;
046
047 public ServletWebRequest(HttpServletRequest request, HttpServletResponse response)
048 {
049 Defense.notNull(request, "request");
050 Defense.notNull(response, "response");
051
052 _servletRequest = request;
053 _servletResponse = response;
054 }
055
056 public List getParameterNames()
057 {
058 return WebUtils.toSortedList(_servletRequest.getParameterNames());
059 }
060
061 public String getParameterValue(String parameterName)
062 {
063 return _servletRequest.getParameter(parameterName);
064 }
065
066 public String[] getParameterValues(String parameterName)
067 {
068 return _servletRequest.getParameterValues(parameterName);
069 }
070
071 public String getContextPath()
072 {
073 return _servletRequest.getContextPath();
074 }
075
076 public WebSession getSession(boolean create)
077 {
078 if (_webSession != null)
079 return _webSession;
080
081 HttpSession session = _servletRequest.getSession(create);
082
083 if (session != null)
084 _webSession = new ServletWebSession(session);
085
086 return _webSession;
087 }
088
089 public List getAttributeNames()
090 {
091 return WebUtils.toSortedList(_servletRequest.getAttributeNames());
092 }
093
094 public Object getAttribute(String name)
095 {
096 return _servletRequest.getAttribute(name);
097 }
098
099 public void setAttribute(String name, Object attribute)
100 {
101 if (attribute == null)
102 _servletRequest.removeAttribute(name);
103 else
104 _servletRequest.setAttribute(name, attribute);
105 }
106
107 public String getScheme()
108 {
109 return _servletRequest.getScheme();
110 }
111
112 public String getServerName()
113 {
114 return _servletRequest.getServerName();
115 }
116
117 public int getServerPort()
118 {
119 return _servletRequest.getServerPort();
120 }
121
122 public String getRequestURI()
123 {
124 return _servletRequest.getRequestURI();
125 }
126
127 public void forward(String URL)
128 {
129 if (HiveMind.isBlank(URL))
130 {
131 performForward("/");
132 return;
133 }
134
135 boolean internal = !(URL.startsWith("/") || URL.indexOf("://") > 0);
136
137 if (internal)
138 performForward("/" + URL);
139 else
140 sendRedirect(URL);
141 }
142
143 private void sendRedirect(String URL)
144 {
145 String finalURL = _servletResponse.encodeRedirectURL(URL);
146
147 try
148 {
149 _servletResponse.sendRedirect(finalURL);
150 }
151 catch (IOException ex)
152 {
153 throw new ApplicationRuntimeException(WebMessages.unableToRedirect(URL, ex), ex);
154 }
155
156 }
157
158 private void performForward(String URL)
159 {
160 RequestDispatcher dispatcher = _servletRequest.getRequestDispatcher(URL);
161
162 if (dispatcher == null)
163 throw new ApplicationRuntimeException(WebMessages.unableToFindDispatcher(URL));
164
165 try
166 {
167 dispatcher.forward(_servletRequest, _servletResponse);
168 }
169 catch (ServletException ex)
170 {
171 throw new ApplicationRuntimeException(WebMessages.unableToForward(URL, ex), ex);
172 }
173 catch (IOException ex)
174 {
175 throw new ApplicationRuntimeException(WebMessages.unableToForward(URL, ex), ex);
176 }
177 }
178
179 /**
180 * Returns {@link HttpServletRequest#getServletPath()}.
181 */
182 public String getActivationPath()
183 {
184 return _servletRequest.getServletPath();
185 }
186
187 public String getPathInfo()
188 {
189 return _servletRequest.getPathInfo();
190 }
191
192 public Locale getLocale()
193 {
194 return _servletRequest.getLocale();
195 }
196
197 public void describeTo(DescriptionReceiver receiver)
198 {
199 receiver.describeAlternate(_servletRequest);
200 }
201
202 public String getHeader(String name)
203 {
204 return _servletRequest.getHeader(name);
205 }
206
207 public long getDateHeader(String name)
208 {
209 return _servletRequest.getDateHeader(name);
210 }
211
212 public int getIntHeader(String name)
213 {
214 return _servletRequest.getIntHeader(name);
215 }
216
217 public String getRemoteUser()
218 {
219 return _servletRequest.getRemoteUser();
220 }
221
222 public Principal getUserPrincipal()
223 {
224 return _servletRequest.getUserPrincipal();
225 }
226
227 public boolean isUserInRole(String role)
228 {
229 return _servletRequest.isUserInRole(role);
230 }
231
232 public boolean isSecure()
233 {
234 return _servletRequest.isSecure();
235 }
236 }