1   /**
2    * Copyright (c) 2000-2009 Liferay, Inc. All rights reserved.
3    *
4    * The contents of this file are subject to the terms of the Liferay Enterprise
5    * Subscription License ("License"). You may not use this file except in
6    * compliance with the License. You can obtain a copy of the License by
7    * contacting Liferay, Inc. See the License for the specific language governing
8    * permissions and limitations under the License, including but not limited to
9    * distribution rights of the Software.
10   *
11   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
12   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
14   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
15   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
16   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
17   * SOFTWARE.
18   */
19  
20  package com.liferay.util.bridges.php;
21  
22  import com.liferay.portal.kernel.log.Log;
23  import com.liferay.portal.kernel.log.LogFactoryUtil;
24  import com.liferay.portal.kernel.servlet.PortletServletObjectsFactory;
25  import com.liferay.portal.kernel.servlet.ServletObjectsFactory;
26  import com.liferay.portal.kernel.servlet.StringServletResponse;
27  import com.liferay.portal.kernel.util.GetterUtil;
28  import com.liferay.util.servlet.DynamicServletConfig;
29  
30  import java.io.IOException;
31  import java.io.PrintWriter;
32  
33  import java.util.Enumeration;
34  import java.util.HashMap;
35  import java.util.Map;
36  
37  import javax.portlet.ActionRequest;
38  import javax.portlet.ActionResponse;
39  import javax.portlet.GenericPortlet;
40  import javax.portlet.PortletConfig;
41  import javax.portlet.PortletException;
42  import javax.portlet.PortletURL;
43  import javax.portlet.RenderRequest;
44  import javax.portlet.RenderResponse;
45  
46  import javax.servlet.ServletConfig;
47  import javax.servlet.http.HttpServlet;
48  import javax.servlet.http.HttpServletRequest;
49  import javax.servlet.http.HttpServletResponse;
50  
51  import org.apache.portals.bridges.common.ScriptPostProcess;
52  
53  /**
54   * <a href="PHPPortlet.java.html"><b><i>View Source</i></b></a>
55   *
56   * @author Jorge Ferrer
57   *
58   */
59  public class PHPPortlet extends GenericPortlet {
60  
61      public void init(PortletConfig portletConfig) throws PortletException {
62          super.init(portletConfig);
63  
64          editUri = getInitParameter("edit-uri");
65          helpUri = getInitParameter("help-uri");
66          viewUri = getInitParameter("view-uri");
67  
68          addPortletParams = GetterUtil.getBoolean(
69              portletConfig.getInitParameter("add-portlet-params"), true);
70  
71          String servletObjectsFactoryName = GetterUtil.getString(
72              getInitParameter("servlet-objects-factory"),
73              PortletServletObjectsFactory.class.getName());
74  
75          try {
76              Class<?> servletObjectsFactoryClass = Class.forName(
77                  servletObjectsFactoryName);
78  
79              servletObjectsFactory =
80                  (ServletObjectsFactory)servletObjectsFactoryClass.newInstance();
81          }
82          catch (Exception e) {
83              throw new PortletException(
84                  "Unable to instantiate factory" + servletObjectsFactoryName, e);
85          }
86      }
87  
88      public void doDispatch(
89              RenderRequest renderRequest, RenderResponse renderResponse)
90          throws IOException, PortletException {
91  
92          String phpUri = renderRequest.getParameter(_PHP_URI_PARAM);
93  
94          if (phpUri != null) {
95              processPHP(phpUri, renderRequest, renderResponse);
96          }
97          else {
98              super.doDispatch(renderRequest, renderResponse);
99          }
100     }
101 
102     public void doEdit(
103             RenderRequest renderRequest, RenderResponse renderResponse)
104         throws IOException, PortletException {
105 
106         if (renderRequest.getPreferences() == null) {
107             super.doEdit(renderRequest, renderResponse);
108         }
109         else {
110             processPHP(editUri, renderRequest, renderResponse);
111         }
112     }
113 
114     public void doHelp(
115         RenderRequest renderRequest, RenderResponse renderResponse) {
116 
117         processPHP(helpUri, renderRequest, renderResponse);
118     }
119 
120     public void doView(
121         RenderRequest renderRequest, RenderResponse renderResponse) {
122 
123         processPHP(viewUri, renderRequest, renderResponse);
124     }
125 
126     public void processAction(
127             ActionRequest actionRequest, ActionResponse actionResponse) {
128         String phpURI = actionRequest.getParameter(_PHP_URI_PARAM);
129 
130         if (phpURI != null) {
131             actionResponse.setRenderParameter(_PHP_URI_PARAM, phpURI);
132         }
133     }
134 
135     public void destroy() {
136         if (quercusServlet != null) {
137             quercusServlet.destroy();
138         }
139     }
140 
141     protected synchronized void initQuercus(ServletConfig servletConfig)
142         throws PortletException {
143 
144         if (quercusServlet == null) {
145             try {
146                 quercusServlet = (HttpServlet)Class.forName(
147                     _QUERCUS_SERVLET).newInstance();
148 
149                 Map<String, String> params = new HashMap<String, String>();
150 
151                 Enumeration<String> enu = servletConfig.getInitParameterNames();
152 
153                 while (enu.hasMoreElements()) {
154                     String name = enu.nextElement();
155 
156                     if (!name.equals("portlet-class")) {
157                         params.put(name, servletConfig.getInitParameter(name));
158                     }
159                 }
160 
161                 servletConfig = new DynamicServletConfig(servletConfig, params);
162 
163                 quercusServlet.init(servletConfig);
164             }
165             catch (Exception e) {
166                 throw new PortletException(e);
167             }
168         }
169     }
170 
171     protected void processPHP(
172         String phpURI, RenderRequest renderRequest,
173         RenderResponse renderResponse) {
174 
175         try {
176             ServletConfig servletConfig =
177                 servletObjectsFactory.getServletConfig(
178                     getPortletConfig(), renderRequest);
179 
180             initQuercus(servletConfig);
181 
182             HttpServletRequest request =
183                 servletObjectsFactory.getServletRequest(renderRequest);
184             HttpServletResponse response =
185                 servletObjectsFactory.getServletResponse(
186                     renderRequest, renderResponse);
187 
188             PHPServletRequest phpRequest = new PHPServletRequest(
189                 request, servletConfig, renderRequest, renderResponse,
190                 getPortletConfig(), phpURI, addPortletParams);
191 
192             StringServletResponse stringResponse = new StringServletResponse(
193                 response);
194 
195             quercusServlet.service(phpRequest, stringResponse);
196 
197             String result = stringResponse.getString();
198 
199             if (stringResponse.getContentType().startsWith("text/")) {
200                 result = rewriteURLs(result, renderResponse.createRenderURL());
201             }
202 
203             renderResponse.setContentType(stringResponse.getContentType());
204 
205             PrintWriter writer = renderResponse.getWriter();
206 
207             writer.write(result.toCharArray());
208         }
209         catch (Exception e) {
210             _log.error("Error processing PHP", e);
211         }
212     }
213 
214     protected String rewriteURLs(String page, PortletURL portletURL) {
215         ScriptPostProcess processor = new ScriptPostProcess();
216 
217         processor.setInitalPage(new StringBuffer(page));
218         processor.postProcessPage(portletURL, _PHP_URI_PARAM);
219 
220         return processor.getFinalizedPage();
221     }
222 
223     private static final String _PHP_URI_PARAM = "phpURI";
224 
225     private static final String _QUERCUS_SERVLET =
226         "com.caucho.quercus.servlet.QuercusServlet";
227 
228     private static Log _log = LogFactoryUtil.getLog(PHPPortlet.class);
229 
230     protected String editUri;
231     protected String helpUri;
232     protected String viewUri;
233     protected boolean addPortletParams;
234     protected ServletObjectsFactory servletObjectsFactory;
235     protected HttpServlet quercusServlet;
236 
237 }