1
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
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 }