001
014
015 package com.liferay.util.bridges.bsf;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019 import com.liferay.portal.kernel.util.FileUtil;
020 import com.liferay.portal.kernel.util.StringBundler;
021 import com.liferay.portal.kernel.util.StringPool;
022 import com.liferay.portal.kernel.util.StringUtil;
023
024 import java.io.IOException;
025 import java.io.InputStream;
026
027 import java.util.Map;
028
029 import javax.portlet.ActionRequest;
030 import javax.portlet.ActionResponse;
031 import javax.portlet.GenericPortlet;
032 import javax.portlet.PortletConfig;
033 import javax.portlet.PortletContext;
034 import javax.portlet.PortletException;
035 import javax.portlet.PortletPreferences;
036 import javax.portlet.PortletRequest;
037 import javax.portlet.PortletResponse;
038 import javax.portlet.RenderRequest;
039 import javax.portlet.RenderResponse;
040 import javax.portlet.ResourceRequest;
041 import javax.portlet.ResourceResponse;
042
043 import org.apache.bsf.BSFException;
044 import org.apache.bsf.BSFManager;
045
046
050 public abstract class BaseBSFPortlet extends GenericPortlet {
051
052 @Override
053 public void init() {
054 editFile = getInitParameter("edit-file");
055 helpFile = getInitParameter("help-file");
056 viewFile = getInitParameter("view-file");
057 actionFile = getInitParameter("action-file");
058 resourceFile = getInitParameter("resource-file");
059 globalFiles = StringUtil.split(getInitParameter("global-files"));
060
061 BSFManager.registerScriptingEngine(
062 getScriptingEngineLanguage(), getScriptingEngineClassName(),
063 new String[] {getScriptingEngineExtension()});
064
065 bsfManager = new BSFManager();
066 }
067
068 @Override
069 public void doDispatch(
070 RenderRequest renderRequest, RenderResponse renderResponse)
071 throws IOException, PortletException {
072
073 String file = renderRequest.getParameter(getFileParam());
074
075 if (file != null) {
076 include(file, renderRequest, renderResponse);
077 }
078 else {
079 super.doDispatch(renderRequest, renderResponse);
080 }
081 }
082
083 @Override
084 public void doEdit(
085 RenderRequest renderRequest, RenderResponse renderResponse)
086 throws IOException, PortletException {
087
088 if (renderRequest.getPreferences() == null) {
089 super.doEdit(renderRequest, renderResponse);
090 }
091 else {
092 include(editFile, renderRequest, renderResponse);
093 }
094 }
095
096 @Override
097 public void doHelp(
098 RenderRequest renderRequest, RenderResponse renderResponse)
099 throws IOException {
100
101 include(helpFile, renderRequest, renderResponse);
102 }
103
104 @Override
105 public void doView(
106 RenderRequest renderRequest, RenderResponse renderResponse)
107 throws IOException {
108
109 include(viewFile, renderRequest, renderResponse);
110 }
111
112 @Override
113 public void processAction(
114 ActionRequest actionRequest, ActionResponse actionResponse)
115 throws IOException {
116
117 include(actionFile, actionRequest, actionResponse);
118 }
119
120 @Override
121 public void serveResource(
122 ResourceRequest resourceRequest, ResourceResponse resourceResponse)
123 throws IOException {
124
125 include(resourceFile, resourceRequest, resourceResponse);
126 }
127
128 protected void declareBeans(
129 InputStream is, PortletRequest portletRequest,
130 PortletResponse portletResponse)
131 throws BSFException, IOException {
132
133 declareBeans(
134 new String(FileUtil.getBytes(is)), portletRequest, portletResponse);
135 }
136
137 protected void declareBeans(
138 String code, PortletRequest portletRequest,
139 PortletResponse portletResponse)
140 throws BSFException, IOException {
141
142 String script = getGlobalScript().concat(code);
143
144 PortletConfig portletConfig = getPortletConfig();
145 PortletContext portletContext = getPortletContext();
146 PortletPreferences preferences = portletRequest.getPreferences();
147 Map<String, String> userInfo =
148 (Map<String, String>)portletRequest.getAttribute(
149 PortletRequest.USER_INFO);
150
151 bsfManager.declareBean(
152 "portletConfig", portletConfig, PortletConfig.class);
153 bsfManager.declareBean(
154 "portletContext", portletContext, PortletContext.class);
155 bsfManager.declareBean(
156 "preferences", preferences, PortletPreferences.class);
157 bsfManager.declareBean("userInfo", userInfo, Map.class);
158
159 if (portletRequest instanceof ActionRequest) {
160 bsfManager.declareBean(
161 "actionRequest", portletRequest, ActionRequest.class);
162 }
163 else if (portletRequest instanceof RenderRequest) {
164 bsfManager.declareBean(
165 "renderRequest", portletRequest, RenderRequest.class);
166 }
167 else if (portletRequest instanceof ResourceRequest) {
168 bsfManager.declareBean(
169 "resourceRequest", portletRequest, ResourceRequest.class);
170 }
171
172 if (portletResponse instanceof ActionResponse) {
173 bsfManager.declareBean(
174 "actionResponse", portletResponse, ActionResponse.class);
175 }
176 else if (portletResponse instanceof RenderResponse) {
177 bsfManager.declareBean(
178 "renderResponse", portletResponse, RenderResponse.class);
179 }
180 else if (portletResponse instanceof ResourceResponse) {
181 bsfManager.declareBean(
182 "resourceResponse", portletResponse, ResourceResponse.class);
183 }
184
185 bsfManager.exec(getScriptingEngineLanguage(), "(java)", 1, 1, script);
186 }
187
188 protected String getGlobalScript() throws IOException {
189 if (globalFiles.length == 0) {
190 return StringPool.BLANK;
191 }
192
193 StringBundler sb = new StringBundler();
194
195 for (int i = 0; i < globalFiles.length; i++) {
196 InputStream is = getPortletContext().getResourceAsStream(
197 globalFiles[i]);
198
199 if (is == null) {
200 if (_log.isWarnEnabled()) {
201 _log.warn(
202 "Global file " + globalFiles[i] + " does not exist");
203 }
204 }
205
206 try {
207 if (is != null) {
208 sb.append(new String(FileUtil.getBytes(is)));
209 sb.append(StringPool.NEW_LINE);
210 }
211 }
212 finally {
213 is.close();
214 }
215 }
216
217 return sb.toString();
218 }
219
220 protected abstract String getFileParam();
221
222 protected abstract String getScriptingEngineClassName();
223
224 protected abstract String getScriptingEngineExtension();
225
226 protected abstract String getScriptingEngineLanguage();
227
228 protected void include(
229 String path, PortletRequest portletRequest,
230 PortletResponse portletResponse)
231 throws IOException {
232
233 InputStream is = getPortletContext().getResourceAsStream(path);
234
235 if (is == null) {
236 _log.error(
237 path + " is not a valid " + getScriptingEngineLanguage() +
238 " file");
239
240 return;
241 }
242
243 try {
244 declareBeans(is, portletRequest, portletResponse);
245 }
246 catch (BSFException bsfe) {
247 logBSFException(bsfe, path);
248 }
249 finally {
250 is.close();
251 }
252 }
253
254 protected void logBSFException(BSFException bsfe, String path) {
255 String message =
256 "The script at " + path + " or one of the global files has errors.";
257
258 Throwable t = bsfe.getTargetException();
259
260 _log.error(message, t);
261 }
262
263 protected String editFile;
264 protected String helpFile;
265 protected String viewFile;
266 protected String actionFile;
267 protected String resourceFile;
268 protected String[] globalFiles;
269 protected BSFManager bsfManager;
270
271 private static Log _log = LogFactoryUtil.getLog(BaseBSFPortlet.class);
272
273 }