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