1
19
20 package com.liferay.util.bridges.php;
21
22 import com.liferay.portal.kernel.log.Log;
23 import com.liferay.portal.kernel.log.LogFactoryUtil;
24 import com.liferay.portal.kernel.servlet.PortletServletObjectsFactory;
25 import com.liferay.portal.kernel.servlet.ServletObjectsFactory;
26 import com.liferay.portal.kernel.servlet.StringServletResponse;
27 import com.liferay.portal.kernel.util.GetterUtil;
28 import com.liferay.util.servlet.DynamicServletConfig;
29
30 import java.io.IOException;
31 import java.io.PrintWriter;
32
33 import java.util.Enumeration;
34 import java.util.HashMap;
35 import java.util.Map;
36
37 import javax.portlet.ActionRequest;
38 import javax.portlet.ActionResponse;
39 import javax.portlet.GenericPortlet;
40 import javax.portlet.PortletConfig;
41 import javax.portlet.PortletException;
42 import javax.portlet.PortletURL;
43 import javax.portlet.RenderRequest;
44 import javax.portlet.RenderResponse;
45
46 import javax.servlet.ServletConfig;
47 import javax.servlet.http.HttpServlet;
48 import javax.servlet.http.HttpServletRequest;
49 import javax.servlet.http.HttpServletResponse;
50
51 import org.apache.portals.bridges.common.ScriptPostProcess;
52
53
59 public class PHPPortlet extends GenericPortlet {
60
61 public void init(PortletConfig portletConfig) throws PortletException {
62 super.init(portletConfig);
63
64 editUri = getInitParameter("edit-uri");
65 helpUri = getInitParameter("help-uri");
66 viewUri = getInitParameter("view-uri");
67
68 addPortletParams = GetterUtil.getBoolean(
69 portletConfig.getInitParameter("add-portlet-params"), true);
70
71 String servletObjectsFactoryName = GetterUtil.getString(
72 getInitParameter("servlet-objects-factory"),
73 PortletServletObjectsFactory.class.getName());
74
75 try {
76 Class<?> servletObjectsFactoryClass = Class.forName(
77 servletObjectsFactoryName);
78
79 servletObjectsFactory =
80 (ServletObjectsFactory)servletObjectsFactoryClass.newInstance();
81 }
82 catch (Exception e) {
83 throw new PortletException(
84 "Unable to instantiate factory" + servletObjectsFactoryName, e);
85 }
86 }
87
88 public void doDispatch(
89 RenderRequest renderRequest, RenderResponse renderResponse)
90 throws IOException, PortletException {
91
92 String phpUri = renderRequest.getParameter(_PHP_URI_PARAM);
93
94 if (phpUri != null) {
95 processPHP(phpUri, renderRequest, renderResponse);
96 }
97 else {
98 super.doDispatch(renderRequest, renderResponse);
99 }
100 }
101
102 public void doEdit(
103 RenderRequest renderRequest, RenderResponse renderResponse)
104 throws IOException, PortletException {
105
106 if (renderRequest.getPreferences() == null) {
107 super.doEdit(renderRequest, renderResponse);
108 }
109 else {
110 processPHP(editUri, renderRequest, renderResponse);
111 }
112 }
113
114 public void doHelp(
115 RenderRequest renderRequest, RenderResponse renderResponse) {
116
117 processPHP(helpUri, renderRequest, renderResponse);
118 }
119
120 public void doView(
121 RenderRequest renderRequest, RenderResponse renderResponse) {
122
123 processPHP(viewUri, renderRequest, renderResponse);
124 }
125
126 public void processAction(
127 ActionRequest actionRequest, ActionResponse actionResponse) {
128 String phpURI = actionRequest.getParameter(_PHP_URI_PARAM);
129
130 if (phpURI != null) {
131 actionResponse.setRenderParameter(_PHP_URI_PARAM, phpURI);
132 }
133 }
134
135 public void destroy() {
136 if (quercusServlet != null) {
137 quercusServlet.destroy();
138 }
139 }
140
141 protected synchronized void initQuercus(ServletConfig servletConfig)
142 throws PortletException {
143
144 if (quercusServlet == null) {
145 try {
146 quercusServlet = (HttpServlet)Class.forName(
147 _QUERCUS_SERVLET).newInstance();
148
149 Map<String, String> params = new HashMap<String, String>();
150
151 Enumeration<String> enu = servletConfig.getInitParameterNames();
152
153 while (enu.hasMoreElements()) {
154 String name = enu.nextElement();
155
156 if (!name.equals("portlet-class")) {
157 params.put(name, servletConfig.getInitParameter(name));
158 }
159 }
160
161 servletConfig = new DynamicServletConfig(servletConfig, params);
162
163 quercusServlet.init(servletConfig);
164 }
165 catch (Exception e) {
166 throw new PortletException(e);
167 }
168 }
169 }
170
171 protected void processPHP(
172 String phpURI, RenderRequest renderRequest,
173 RenderResponse renderResponse) {
174
175 try {
176 ServletConfig servletConfig =
177 servletObjectsFactory.getServletConfig(
178 getPortletConfig(), renderRequest);
179
180 initQuercus(servletConfig);
181
182 HttpServletRequest request =
183 servletObjectsFactory.getServletRequest(renderRequest);
184 HttpServletResponse response =
185 servletObjectsFactory.getServletResponse(
186 renderRequest, renderResponse);
187
188 PHPServletRequest phpRequest = new PHPServletRequest(
189 request, servletConfig, renderRequest, renderResponse,
190 getPortletConfig(), phpURI, addPortletParams);
191
192 StringServletResponse stringResponse = new StringServletResponse(
193 response);
194
195 quercusServlet.service(phpRequest, stringResponse);
196
197 String result = stringResponse.getString();
198
199 if (stringResponse.getContentType().startsWith("text/")) {
200 result = rewriteURLs(result, renderResponse.createRenderURL());
201 }
202
203 renderResponse.setContentType(stringResponse.getContentType());
204
205 PrintWriter writer = renderResponse.getWriter();
206
207 writer.write(result.toCharArray());
208 }
209 catch (Exception e) {
210 _log.error("Error processing PHP", e);
211 }
212 }
213
214 protected String rewriteURLs(String page, PortletURL portletURL) {
215 ScriptPostProcess processor = new ScriptPostProcess();
216
217 processor.setInitalPage(new StringBuffer(page));
218 processor.postProcessPage(portletURL, _PHP_URI_PARAM);
219
220 return processor.getFinalizedPage();
221 }
222
223 private static final String _PHP_URI_PARAM = "phpURI";
224
225 private static final String _QUERCUS_SERVLET =
226 "com.caucho.quercus.servlet.QuercusServlet";
227
228 private static Log _log = LogFactoryUtil.getLog(PHPPortlet.class);
229
230 protected String editUri;
231 protected String helpUri;
232 protected String viewUri;
233 protected boolean addPortletParams;
234 protected ServletObjectsFactory servletObjectsFactory;
235 protected HttpServlet quercusServlet;
236
237 }