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