You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

PortletCommunicationManager.java 9.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. /*
  2. @ITMillApache2LicenseForJavaFiles@
  3. */
  4. package com.vaadin.terminal.gwt.server;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.OutputStream;
  8. import java.lang.reflect.Method;
  9. import javax.portlet.ActionRequest;
  10. import javax.portlet.ActionResponse;
  11. import javax.portlet.ClientDataRequest;
  12. import javax.portlet.MimeResponse;
  13. import javax.portlet.PortletRequest;
  14. import javax.portlet.PortletResponse;
  15. import javax.portlet.PortletSession;
  16. import javax.portlet.ResourceRequest;
  17. import javax.portlet.ResourceResponse;
  18. import javax.servlet.ServletException;
  19. import javax.servlet.http.HttpServletRequestWrapper;
  20. import com.vaadin.Application;
  21. import com.vaadin.external.org.apache.commons.fileupload.FileItemIterator;
  22. import com.vaadin.external.org.apache.commons.fileupload.FileUpload;
  23. import com.vaadin.external.org.apache.commons.fileupload.FileUploadException;
  24. import com.vaadin.external.org.apache.commons.fileupload.portlet.PortletFileUpload;
  25. import com.vaadin.terminal.DownloadStream;
  26. import com.vaadin.ui.Window;
  27. /**
  28. * TODO document me!
  29. *
  30. * @author peholmst
  31. *
  32. */
  33. @SuppressWarnings("serial")
  34. public class PortletCommunicationManager extends AbstractCommunicationManager {
  35. protected String dummyURL;
  36. private static class PortletRequestWrapper implements Request {
  37. private final PortletRequest request;
  38. public PortletRequestWrapper(PortletRequest request) {
  39. this.request = request;
  40. }
  41. public Object getAttribute(String name) {
  42. return request.getAttribute(name);
  43. }
  44. public int getContentLength() {
  45. return ((ClientDataRequest) request).getContentLength();
  46. }
  47. public InputStream getInputStream() throws IOException {
  48. return ((ClientDataRequest) request).getPortletInputStream();
  49. }
  50. public String getParameter(String name) {
  51. String value = request.getParameter(name);
  52. if (value == null) {
  53. // for GateIn portlet container simple-portal
  54. try {
  55. Method getRealReq = request.getClass().getMethod(
  56. "getRealRequest");
  57. HttpServletRequestWrapper origRequest = (HttpServletRequestWrapper) getRealReq
  58. .invoke(request);
  59. value = origRequest.getParameter(name);
  60. } catch (Exception e) {
  61. // do nothing - not on GateIn simple-portal
  62. }
  63. }
  64. return value;
  65. }
  66. public String getRequestID() {
  67. return "WindowID:" + request.getWindowID();
  68. }
  69. public Session getSession() {
  70. return new PortletSessionWrapper(request.getPortletSession());
  71. }
  72. public Object getWrappedRequest() {
  73. return request;
  74. }
  75. public boolean isRunningInPortlet() {
  76. return true;
  77. }
  78. public void setAttribute(String name, Object o) {
  79. request.setAttribute(name, o);
  80. }
  81. }
  82. private static class PortletResponseWrapper implements Response {
  83. private final PortletResponse response;
  84. public PortletResponseWrapper(PortletResponse response) {
  85. this.response = response;
  86. }
  87. public OutputStream getOutputStream() throws IOException {
  88. return ((MimeResponse) response).getPortletOutputStream();
  89. }
  90. public Object getWrappedResponse() {
  91. return response;
  92. }
  93. public void setContentType(String type) {
  94. ((MimeResponse) response).setContentType(type);
  95. }
  96. }
  97. private static class PortletSessionWrapper implements Session {
  98. private final PortletSession session;
  99. public PortletSessionWrapper(PortletSession session) {
  100. this.session = session;
  101. }
  102. public Object getAttribute(String name) {
  103. return session.getAttribute(name);
  104. }
  105. public int getMaxInactiveInterval() {
  106. return session.getMaxInactiveInterval();
  107. }
  108. public Object getWrappedSession() {
  109. return session;
  110. }
  111. public boolean isNew() {
  112. return session.isNew();
  113. }
  114. public void setAttribute(String name, Object o) {
  115. session.setAttribute(name, o);
  116. }
  117. }
  118. private static class AbstractApplicationPortletWrapper implements Callback {
  119. private final AbstractApplicationPortlet portlet;
  120. public AbstractApplicationPortletWrapper(
  121. AbstractApplicationPortlet portlet) {
  122. this.portlet = portlet;
  123. }
  124. public void criticalNotification(Request request, Response response,
  125. String cap, String msg, String details, String outOfSyncURL)
  126. throws IOException {
  127. portlet.criticalNotification(
  128. (PortletRequest) request.getWrappedRequest(),
  129. (MimeResponse) response.getWrappedResponse(), cap, msg,
  130. details, outOfSyncURL);
  131. }
  132. public String getRequestPathInfo(Request request) {
  133. if (request.getWrappedRequest() instanceof ResourceRequest) {
  134. return ((ResourceRequest) request.getWrappedRequest())
  135. .getResourceID();
  136. } else {
  137. // We do not use paths in portlet mode
  138. throw new UnsupportedOperationException(
  139. "PathInfo only available when using ResourceRequests");
  140. }
  141. }
  142. public InputStream getThemeResourceAsStream(String themeName,
  143. String resource) throws IOException {
  144. return portlet.getPortletContext().getResourceAsStream(
  145. "/" + AbstractApplicationPortlet.THEME_DIRECTORY_PATH
  146. + themeName + "/" + resource);
  147. }
  148. }
  149. public PortletCommunicationManager(Application application) {
  150. super(application);
  151. }
  152. @Override
  153. protected FileUpload createFileUpload() {
  154. return new PortletFileUpload();
  155. }
  156. @Override
  157. protected FileItemIterator getUploadItemIterator(FileUpload upload,
  158. Request request) throws IOException, FileUploadException {
  159. return ((PortletFileUpload) upload)
  160. .getItemIterator((ActionRequest) request.getWrappedRequest());
  161. }
  162. public void handleFileUpload(ActionRequest request, ActionResponse response)
  163. throws FileUploadException, IOException {
  164. doHandleFileUpload(new PortletRequestWrapper(request),
  165. new PortletResponseWrapper(response));
  166. }
  167. @Override
  168. protected void sendUploadResponse(Request request, Response response)
  169. throws IOException {
  170. if (response.getWrappedResponse() instanceof ActionResponse) {
  171. /*
  172. * If we do not redirect to some other page, the entire portal page
  173. * will be re-printed into the target of the upload request (an
  174. * IFRAME), which in turn will cause very strange side effects.
  175. */
  176. System.out.println("Redirecting to dummyURL: " + dummyURL);
  177. ((ActionResponse) response.getWrappedResponse())
  178. .sendRedirect(dummyURL == null ? "http://www.google.com"
  179. : dummyURL);
  180. } else {
  181. super.sendUploadResponse(request, response);
  182. }
  183. }
  184. public void handleUidlRequest(ResourceRequest request,
  185. ResourceResponse response,
  186. AbstractApplicationPortlet applicationPortlet, Window window)
  187. throws InvalidUIDLSecurityKeyException, IOException {
  188. doHandleUidlRequest(new PortletRequestWrapper(request),
  189. new PortletResponseWrapper(response),
  190. new AbstractApplicationPortletWrapper(applicationPortlet),
  191. window);
  192. }
  193. DownloadStream handleURI(Window window, ResourceRequest request,
  194. ResourceResponse response,
  195. AbstractApplicationPortlet applicationPortlet) {
  196. return handleURI(window, new PortletRequestWrapper(request),
  197. new PortletResponseWrapper(response),
  198. new AbstractApplicationPortletWrapper(applicationPortlet));
  199. }
  200. /**
  201. * Gets the existing application or creates a new one. Get a window within
  202. * an application based on the requested URI.
  203. *
  204. * @param request
  205. * the portlet Request.
  206. * @param applicationPortlet
  207. * @param application
  208. * the Application to query for window.
  209. * @param assumedWindow
  210. * if the window has been already resolved once, this parameter
  211. * must contain the window.
  212. * @return Window matching the given URI or null if not found.
  213. * @throws ServletException
  214. * if an exception has occurred that interferes with the
  215. * servlet's normal operation.
  216. */
  217. Window getApplicationWindow(PortletRequest request,
  218. AbstractApplicationPortlet applicationPortlet,
  219. Application application, Window assumedWindow) {
  220. return doGetApplicationWindow(new PortletRequestWrapper(request),
  221. new AbstractApplicationPortletWrapper(applicationPortlet),
  222. application, assumedWindow);
  223. }
  224. }