1   /**
2    * Copyright (c) 2000-2010 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   *
12   *
13   */
14  
15  package com.liferay.util.bridges.bsf;
16  
17  import com.liferay.portal.kernel.log.Log;
18  import com.liferay.portal.kernel.log.LogFactoryUtil;
19  import com.liferay.portal.kernel.util.FileUtil;
20  import com.liferay.portal.kernel.util.StringBundler;
21  import com.liferay.portal.kernel.util.StringPool;
22  import com.liferay.portal.kernel.util.StringUtil;
23  
24  import java.io.IOException;
25  import java.io.InputStream;
26  
27  import java.util.Map;
28  
29  import javax.portlet.ActionRequest;
30  import javax.portlet.ActionResponse;
31  import javax.portlet.GenericPortlet;
32  import javax.portlet.PortletConfig;
33  import javax.portlet.PortletContext;
34  import javax.portlet.PortletException;
35  import javax.portlet.PortletPreferences;
36  import javax.portlet.PortletRequest;
37  import javax.portlet.PortletResponse;
38  import javax.portlet.RenderRequest;
39  import javax.portlet.RenderResponse;
40  import javax.portlet.ResourceRequest;
41  import javax.portlet.ResourceResponse;
42  
43  import org.apache.bsf.BSFException;
44  import org.apache.bsf.BSFManager;
45  
46  /**
47   * <a href="BaseBSFPortlet.java.html"><b><i>View Source</i></b></a>
48   *
49   * @author Jorge Ferrer
50   * @author Brian Wing Shun Chan
51   */
52  public abstract class BaseBSFPortlet extends GenericPortlet {
53  
54      public void init() {
55          editFile = getInitParameter("edit-file");
56          helpFile = getInitParameter("help-file");
57          viewFile = getInitParameter("view-file");
58          actionFile = getInitParameter("action-file");
59          resourceFile = getInitParameter("resource-file");
60          globalFiles = StringUtil.split(getInitParameter("global-files"));
61  
62          BSFManager.registerScriptingEngine(
63              getScriptingEngineLanguage(), getScriptingEngineClassName(),
64              new String[] {getScriptingEngineExtension()});
65  
66          bsfManager = new BSFManager();
67      }
68  
69      public void doDispatch(
70              RenderRequest renderRequest, RenderResponse renderResponse)
71          throws IOException, PortletException {
72  
73          String file = renderRequest.getParameter(getFileParam());
74  
75          if (file != null) {
76              include(file, renderRequest, renderResponse);
77          }
78          else {
79              super.doDispatch(renderRequest, renderResponse);
80          }
81      }
82  
83      public void doEdit(
84              RenderRequest renderRequest, RenderResponse renderResponse)
85          throws IOException, PortletException {
86  
87          if (renderRequest.getPreferences() == null) {
88              super.doEdit(renderRequest, renderResponse);
89          }
90          else {
91              include(editFile, renderRequest, renderResponse);
92          }
93      }
94  
95      public void doHelp(
96              RenderRequest renderRequest, RenderResponse renderResponse)
97          throws IOException {
98  
99          include(helpFile, renderRequest, renderResponse);
100     }
101 
102     public void doView(
103             RenderRequest renderRequest, RenderResponse renderResponse)
104         throws IOException {
105 
106         include(viewFile, renderRequest, renderResponse);
107     }
108 
109     public void processAction(
110             ActionRequest actionRequest, ActionResponse actionResponse)
111         throws IOException {
112 
113         include(actionFile, actionRequest, actionResponse);
114     }
115 
116     public void serveResource(
117             ResourceRequest resourceRequest, ResourceResponse resourceResponse)
118         throws IOException {
119 
120         include(resourceFile, resourceRequest, resourceResponse);
121     }
122 
123     protected void declareBeans(
124             InputStream is, PortletRequest portletRequest,
125             PortletResponse portletResponse)
126         throws BSFException, IOException {
127 
128         declareBeans(
129             new String(FileUtil.getBytes(is)), portletRequest, portletResponse);
130     }
131 
132     protected void declareBeans(
133             String code, PortletRequest portletRequest,
134             PortletResponse portletResponse)
135         throws BSFException, IOException {
136 
137         String script = getGlobalScript().concat(code);
138 
139         PortletConfig portletConfig = getPortletConfig();
140         PortletContext portletContext = getPortletContext();
141         PortletPreferences preferences = portletRequest.getPreferences();
142         Map<String, String> userInfo =
143             (Map<String, String>)portletRequest.getAttribute(
144                 PortletRequest.USER_INFO);
145 
146         bsfManager.declareBean(
147             "portletConfig", portletConfig, PortletConfig.class);
148         bsfManager.declareBean(
149             "portletContext", portletContext, PortletContext.class);
150         bsfManager.declareBean(
151             "preferences", preferences, PortletPreferences.class);
152         bsfManager.declareBean("userInfo", userInfo, Map.class);
153 
154         if (portletRequest instanceof ActionRequest) {
155             bsfManager.declareBean(
156                 "actionRequest", portletRequest, ActionRequest.class);
157         }
158         else if (portletRequest instanceof RenderRequest) {
159             bsfManager.declareBean(
160                 "renderRequest", portletRequest, RenderRequest.class);
161         }
162         else if (portletRequest instanceof ResourceRequest) {
163             bsfManager.declareBean(
164                 "resourceRequest", portletRequest, ResourceRequest.class);
165         }
166 
167         if (portletResponse instanceof ActionResponse) {
168             bsfManager.declareBean(
169                 "actionResponse", portletResponse, ActionResponse.class);
170         }
171         else if (portletResponse instanceof RenderResponse) {
172             bsfManager.declareBean(
173                 "renderResponse", portletResponse, RenderResponse.class);
174         }
175         else if (portletResponse instanceof ResourceResponse) {
176             bsfManager.declareBean(
177                 "resourceResponse", portletResponse, ResourceResponse.class);
178         }
179 
180         bsfManager.exec(getScriptingEngineLanguage(), "(java)", 1, 1, script);
181     }
182 
183     protected String getGlobalScript() throws IOException {
184         if (globalFiles.length == 0) {
185             return StringPool.BLANK;
186         }
187 
188         StringBundler sb = new StringBundler();
189 
190         for (int i = 0; i < globalFiles.length; i++) {
191             InputStream is = getPortletContext().getResourceAsStream(
192                 globalFiles[i]);
193 
194             if (is == null) {
195                 if (_log.isWarnEnabled()) {
196                     _log.warn(
197                         "Global file " + globalFiles[i] + " does not exist");
198                 }
199             }
200 
201             try {
202                 if (is != null) {
203                     sb.append(new String(FileUtil.getBytes(is)));
204                     sb.append(StringPool.NEW_LINE);
205                 }
206             }
207             finally {
208                 is.close();
209             }
210         }
211 
212         return sb.toString();
213     }
214 
215     protected abstract String getFileParam();
216 
217     protected abstract String getScriptingEngineClassName();
218 
219     protected abstract String getScriptingEngineExtension();
220 
221     protected abstract String getScriptingEngineLanguage();
222 
223     protected void include(
224             String path, PortletRequest portletRequest,
225             PortletResponse portletResponse)
226         throws IOException {
227 
228         InputStream is = getPortletContext().getResourceAsStream(path);
229 
230         if (is == null) {
231             _log.error(
232                 path + " is not a valid " + getScriptingEngineLanguage() +
233                     " file");
234 
235             return;
236         }
237 
238         try {
239             declareBeans(is, portletRequest, portletResponse);
240         }
241         catch (BSFException bsfe) {
242             logBSFException(bsfe, path);
243         }
244         finally {
245             is.close();
246         }
247     }
248 
249     protected void logBSFException(BSFException bsfe, String path) {
250         String message =
251             "The script at " + path + " or one of the global files has errors.";
252 
253         Throwable t = bsfe.getTargetException();
254 
255         _log.error(message, t);
256     }
257 
258     protected String editFile;
259     protected String helpFile;
260     protected String viewFile;
261     protected String actionFile;
262     protected String resourceFile;
263     protected String[] globalFiles;
264     protected BSFManager bsfManager;
265 
266     private static Log _log = LogFactoryUtil.getLog(BaseBSFPortlet.class);
267 
268 }