1
22
23 package com.liferay.util.bridges.php;
24
25 import com.liferay.portal.kernel.servlet.ServletObjectsFactory;
26 import com.liferay.portal.kernel.servlet.StringServletResponse;
27 import com.liferay.util.servlet.DynamicServletConfig;
28
29 import java.io.IOException;
30 import java.io.PrintWriter;
31
32 import java.util.Enumeration;
33 import java.util.HashMap;
34 import java.util.Map;
35
36 import javax.portlet.ActionRequest;
37 import javax.portlet.ActionResponse;
38 import javax.portlet.GenericPortlet;
39 import javax.portlet.PortletException;
40 import javax.portlet.PortletURL;
41 import javax.portlet.RenderRequest;
42 import javax.portlet.RenderResponse;
43
44 import javax.servlet.ServletConfig;
45 import javax.servlet.http.HttpServlet;
46 import javax.servlet.http.HttpServletRequest;
47 import javax.servlet.http.HttpServletResponse;
48
49 import org.apache.commons.logging.Log;
50 import org.apache.commons.logging.LogFactory;
51 import org.apache.portals.bridges.common.ScriptPostProcess;
52
53
59 public class PHPPortlet extends GenericPortlet {
60
61 public void init() throws PortletException {
62 editUri = getInitParameter("edit-uri");
63 helpUri = getInitParameter("help-uri");
64 viewUri = getInitParameter("view-uri");
65
66 String servletObjectsFactoryName = getInitParameter(
67 "servlet-objects-factory");
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);
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 processor = new ScriptPostProcess();
210
211 processor.setInitalPage(new StringBuffer(page));
212 processor.postProcessPage(portletURL, _PHP_URI_PARAM);
213
214 return processor.getFinalizedPage();
215 }
216
217 private static final String _PHP_URI_PARAM = "phpURI";
218
219 private static final String _QUERCUS_SERVLET =
220 "com.caucho.quercus.servlet.QuercusServlet";
221
222 private static Log _log = LogFactory.getLog(PHPPortlet.class);
223
224 protected String editUri;
225 protected String helpUri;
226 protected String viewUri;
227 protected ServletObjectsFactory servletObjectsFactory;
228 protected HttpServlet quercusServlet;
229
230 }