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