1
22
23 package com.liferay.util.bridges.wai;
24
25 import com.liferay.portal.kernel.log.Log;
26 import com.liferay.portal.kernel.log.LogFactoryUtil;
27 import com.liferay.portal.kernel.servlet.PortletServlet;
28 import com.liferay.portal.kernel.util.GetterUtil;
29 import com.liferay.portal.kernel.util.HttpUtil;
30 import com.liferay.portal.kernel.util.ParamUtil;
31 import com.liferay.portal.kernel.util.StringPool;
32
33 import java.io.IOException;
34
35 import java.util.HashMap;
36 import java.util.Map;
37
38 import javax.portlet.ActionRequest;
39 import javax.portlet.ActionResponse;
40 import javax.portlet.GenericPortlet;
41 import javax.portlet.PortletConfig;
42 import javax.portlet.PortletException;
43 import javax.portlet.PortletURL;
44 import javax.portlet.RenderRequest;
45 import javax.portlet.RenderResponse;
46 import javax.portlet.WindowState;
47
48 import javax.servlet.RequestDispatcher;
49 import javax.servlet.ServletException;
50 import javax.servlet.http.HttpServletRequest;
51 import javax.servlet.http.HttpServletResponse;
52
53
58 public class WAIPortlet extends GenericPortlet {
59
60 public static final String CONNECTOR_IFRAME = "iframe";
61
62 public static final String CONNECTOR_INCLUDE = "include";
63
64 public void init(PortletConfig portletConfig) throws PortletException {
65 super.init(portletConfig);
66
67 _connector = GetterUtil.getString(
68 portletConfig.getInitParameter("wai.connector"), CONNECTOR_IFRAME);
69 }
70
71 public void processAction(
72 ActionRequest actionRequest, ActionResponse actionResponse) {
73 }
74
75 public void render(
76 RenderRequest renderRequest, RenderResponse renderResponse)
77 throws IOException, PortletException {
78
79 if (_connector.equals(CONNECTOR_IFRAME) ||
80 renderRequest.getWindowState().equals(WindowState.MAXIMIZED)) {
81
82 invokeApplication(renderRequest, renderResponse);
83 }
84 else {
85 renderNormalWindowState(renderRequest, renderResponse);
86 }
87 }
88
89 protected void forward(
90 HttpServletRequest request, HttpServletResponse response,
91 String path)
92 throws PortletException {
93
94 RequestDispatcher requestDispatcher =
95 request.getRequestDispatcher(path);
96
97 try {
98 requestDispatcher.forward(request, response);
99 }
100 catch (IOException ioe) {
101 _log.error(ioe, ioe);
102 }
103 catch (ServletException se) {
104 throw new PortletException(se);
105 }
106 }
107
108 protected void invokeApplication(
109 RenderRequest renderRequest, RenderResponse renderResponse)
110 throws IOException, PortletException {
111
112 HttpServletRequest request =
113 (HttpServletRequest)renderRequest.getAttribute(
114 PortletServlet.PORTLET_SERVLET_REQUEST);
115 HttpServletResponse response =
116 (HttpServletResponse)renderRequest.getAttribute(
117 PortletServlet.PORTLET_SERVLET_RESPONSE);
118
119 String portletName = getPortletConfig().getPortletName();
120
121 String friendlyURL = (String)request.getAttribute("FRIENDLY_URL");
122
123 int pos = friendlyURL.indexOf(_MAPPING);
124
125 StringBuilder contextPath = new StringBuilder();
126
127 contextPath.append(friendlyURL.substring(0, pos + _MAPPING.length()));
128 contextPath.append(StringPool.SLASH);
129 contextPath.append(portletName);
130
131 pos = friendlyURL.indexOf(portletName);
132
133 String pathInfo = friendlyURL.substring(pos + portletName.length());
134
135 Map<String, String[]> params = new HashMap<String, String[]>(
136 request.getParameterMap());
137
138 params.remove(_APP_URL);
139
140 String queryString = HttpUtil.parameterMapToString(params, false);
141
142 String appUrl = ParamUtil.getString(
143 renderRequest, _APP_URL, StringPool.SLASH);
144
145 if (_connector.equals(CONNECTOR_IFRAME)) {
146 request.setAttribute(
147 _APP_URL, renderRequest.getContextPath() + appUrl);
148
149 String iframeExtraHeight = GetterUtil.getString(
150 getPortletConfig().getInitParameter(
151 "wai.connector.iframe.height.extra"),
152 "40");
153
154 renderRequest.setAttribute(
155 "wai.connector.iframe.height.extra", iframeExtraHeight);
156
157 forward(request, response, _JSP_IFRAME);
158 }
159 else if (_connector.equals(CONNECTOR_INCLUDE)) {
160 HttpServletRequest waiRequest = new WAIHttpServletRequest(
161 request, contextPath.toString(), pathInfo, queryString, params);
162
163 RequestDispatcher requestDispatcher = request.getRequestDispatcher(
164 appUrl);
165
166 try {
167 requestDispatcher.forward(waiRequest, response);
168 }
169 catch (ServletException se) {
170 throw new PortletException(se);
171 }
172 }
173 }
174
175 protected void renderNormalWindowState(
176 RenderRequest renderRequest, RenderResponse renderResponse)
177 throws PortletException {
178
179 HttpServletRequest request =
180 (HttpServletRequest)renderRequest.getAttribute(
181 PortletServlet.PORTLET_SERVLET_REQUEST);
182 HttpServletResponse response =
183 (HttpServletResponse)renderRequest.getAttribute(
184 PortletServlet.PORTLET_SERVLET_RESPONSE);
185
186 PortletURL renderURL = renderResponse.createRenderURL();
187
188 renderURL.setWindowState(WindowState.MAXIMIZED);
189
190 renderRequest.setAttribute("renderURL", renderURL.toString());
191
192 forward(request, response, _JSP_NORMAL_WINDOW_STATE);
193 }
194
195 private static final String _MAPPING = "waiapp";
196
197 private static final String _APP_URL = "appURL";
198
199 private static final String _JSP_DIR = "/WEB-INF/jsp/liferay/wai";
200
201 private static final String _JSP_IFRAME = _JSP_DIR + "/iframe.jsp";
202
203 private static final String _JSP_NORMAL_WINDOW_STATE =
204 _JSP_DIR + "/normal_window_state.jsp";
205
206 private static Log _log = LogFactoryUtil.getLog(WAIPortlet.class);
207
208 private String _connector;
209
210 }