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