001
014
015 package com.liferay.util.bridges.scripting;
016
017 import com.liferay.portal.kernel.log.Log;
018 import com.liferay.portal.kernel.log.LogFactoryUtil;
019 import com.liferay.portal.kernel.scripting.ScriptingException;
020 import com.liferay.portal.kernel.scripting.ScriptingUtil;
021 import com.liferay.portal.kernel.servlet.SessionErrors;
022 import com.liferay.portal.kernel.util.ContentTypes;
023 import com.liferay.portal.kernel.util.FileUtil;
024 import com.liferay.portal.kernel.util.HtmlUtil;
025 import com.liferay.portal.kernel.util.StringBundler;
026 import com.liferay.portal.kernel.util.StringPool;
027 import com.liferay.portal.kernel.util.StringUtil;
028 import com.liferay.portal.kernel.util.WebKeys;
029 import com.liferay.portal.security.permission.ActionKeys;
030 import com.liferay.portal.security.permission.PermissionChecker;
031 import com.liferay.portal.service.permission.PortalPermissionUtil;
032 import com.liferay.portal.theme.ThemeDisplay;
033 import com.liferay.util.servlet.PortletResponseUtil;
034
035 import java.io.IOException;
036 import java.io.InputStream;
037
038 import java.util.Map;
039
040 import javax.portlet.ActionRequest;
041 import javax.portlet.ActionResponse;
042 import javax.portlet.GenericPortlet;
043 import javax.portlet.PortletConfig;
044 import javax.portlet.PortletContext;
045 import javax.portlet.PortletException;
046 import javax.portlet.PortletRequest;
047 import javax.portlet.PortletResponse;
048 import javax.portlet.RenderRequest;
049 import javax.portlet.RenderResponse;
050 import javax.portlet.ResourceRequest;
051 import javax.portlet.ResourceResponse;
052
053
058 public class ScriptingPortlet extends GenericPortlet {
059
060 @Override
061 public void init() {
062 actionFile = getInitParameter("action-file");
063 editFile = getInitParameter("edit-file");
064 helpFile = getInitParameter("help-file");
065 resourceFile = getInitParameter("resource-file");
066 viewFile = getInitParameter("view-file");
067
068 language = getInitParameter("scripting-language");
069 globalFiles = StringUtil.split(getInitParameter("global-files"));
070 }
071
072 @Override
073 public void doDispatch(
074 RenderRequest renderRequest, RenderResponse renderResponse)
075 throws IOException, PortletException {
076
077 String fileName = getFileName(renderRequest);
078
079 if (fileName != null) {
080 include(fileName, renderRequest, renderResponse);
081 }
082 else {
083 super.doDispatch(renderRequest, renderResponse);
084 }
085 }
086
087 @Override
088 public void doEdit(
089 RenderRequest renderRequest, RenderResponse renderResponse)
090 throws IOException, PortletException {
091
092 if (renderRequest.getPreferences() == null) {
093 super.doEdit(renderRequest, renderResponse);
094 }
095 else {
096 include(editFile, renderRequest, renderResponse);
097 }
098 }
099
100 @Override
101 public void doHelp(
102 RenderRequest renderRequest, RenderResponse renderResponse)
103 throws IOException {
104
105 include(helpFile, renderRequest, renderResponse);
106 }
107
108 @Override
109 public void doView(
110 RenderRequest renderRequest, RenderResponse renderResponse)
111 throws IOException {
112
113 include(viewFile, renderRequest, renderResponse);
114 }
115
116 @Override
117 public void processAction(
118 ActionRequest actionRequest, ActionResponse actionResponse)
119 throws IOException {
120
121 include(actionFile, actionRequest, actionResponse);
122 }
123
124 @Override
125 public void render(
126 RenderRequest renderRequest, RenderResponse renderResponse)
127 throws IOException, PortletException {
128
129 try {
130 doRender(renderRequest, renderResponse);
131 }
132 catch (IOException ioe) {
133 throw ioe;
134 }
135 catch (PortletException pe) {
136 throw pe;
137 }
138 catch (Exception e) {
139 throw new PortletException(e);
140 }
141 }
142
143 @Override
144 public void serveResource(
145 ResourceRequest resourceRequest, ResourceResponse resourceResponse)
146 throws IOException {
147
148 include(resourceFile, resourceRequest, resourceResponse);
149 }
150
151 protected void declareBeans(
152 InputStream is, PortletRequest portletRequest,
153 PortletResponse portletResponse)
154 throws IOException, ScriptingException {
155
156 String script = new String(FileUtil.getBytes(is));
157
158 declareBeans(script, portletRequest, portletResponse);
159 }
160
161 protected void declareBeans(
162 String script, PortletRequest portletRequest,
163 PortletResponse portletResponse)
164 throws IOException, ScriptingException {
165
166 script = getGlobalScript() + script;
167
168 PortletConfig portletConfig = getPortletConfig();
169 PortletContext portletContext = getPortletContext();
170
171 Map<String, Object> portletObjects = ScriptingUtil.getPortletObjects(
172 portletConfig, portletContext, portletRequest, portletResponse);
173
174 ScriptingUtil.exec(null, portletObjects, language, script);
175 }
176
177 protected void doRender(
178 RenderRequest renderRequest, RenderResponse renderResponse)
179 throws Exception {
180
181 Object error = SessionErrors.get(renderRequest, _ERROR);
182
183 if (error != null) {
184 Exception e = (Exception)error;
185
186 writeErrorMessage(renderRequest, renderResponse, e.getMessage());
187
188 return;
189 }
190
191 super.render(renderRequest, renderResponse);
192
193 error = SessionErrors.get(renderRequest, _ERROR);
194
195 if (error != null) {
196 Exception e = (Exception)error;
197
198 writeErrorMessage(renderRequest, renderResponse, e.getMessage());
199 }
200 }
201
202 protected String getFileName(RenderRequest renderRequest) {
203 return renderRequest.getParameter("file");
204 }
205
206 protected String getGlobalScript() throws IOException {
207 if (globalScript != null) {
208 return globalScript;
209 }
210
211 if (globalFiles.length == 0) {
212 globalScript = StringPool.BLANK;
213
214 return globalScript;
215 }
216
217 StringBundler sb = new StringBundler();
218
219 for (String globalFile : globalFiles) {
220 InputStream is = getPortletContext().getResourceAsStream(
221 globalFile);
222
223 if (is == null) {
224 if (_log.isWarnEnabled()) {
225 _log.warn("Global file " + globalFile + " does not exist");
226 }
227 }
228
229 try {
230 if (is != null) {
231 String script = new String(FileUtil.getBytes(is));
232
233 sb.append(script);
234 sb.append(StringPool.NEW_LINE);
235 }
236 }
237 finally {
238 is.close();
239 }
240 }
241
242 globalScript = sb.toString();
243
244 return globalScript;
245 }
246
247 protected void include(
248 String path, PortletRequest portletRequest,
249 PortletResponse portletResponse)
250 throws IOException {
251
252 InputStream is = getPortletContext().getResourceAsStream(path);
253
254 if (is == null) {
255 _log.error(path + " is not a valid " + language + " file");
256
257 return;
258 }
259
260 try {
261 declareBeans(is, portletRequest, portletResponse);
262 }
263 catch (ScriptingException se) {
264 SessionErrors.add(portletRequest, _ERROR, se);
265 }
266 finally {
267 is.close();
268 }
269 }
270
271 protected void writeErrorMessage(
272 RenderRequest renderRequest, RenderResponse renderResponse,
273 String errorMessage)
274 throws Exception {
275
276 ThemeDisplay themeDisplay = (ThemeDisplay)renderRequest.getAttribute(
277 WebKeys.THEME_DISPLAY);
278
279 PermissionChecker permissionChecker =
280 themeDisplay.getPermissionChecker();
281
282 StringBundler sb = new StringBundler(6);
283
284 sb.append("<div class=\"portlet-msg-error\">");
285 sb.append(themeDisplay.translate("an-unexpected-error-occurred"));
286 sb.append("</div>");
287
288 if (PortalPermissionUtil.contains(
289 permissionChecker, ActionKeys.CONFIGURATION)) {
290
291 sb.append("<pre>");
292 sb.append(HtmlUtil.escape(errorMessage));
293 sb.append("</pre>");
294 }
295
296 renderResponse.setContentType(ContentTypes.TEXT_HTML);
297
298 PortletResponseUtil.write(renderResponse, sb.toString());
299 }
300
301 private static final String _ERROR = ScriptingPortlet.class + ".ERROR";
302
303 private static Log _log = LogFactoryUtil.getLog(ScriptingPortlet.class);
304
305 protected String actionFile;
306 protected String editFile;
307 protected String helpFile;
308 protected String[] globalFiles;
309 protected String globalScript;
310 protected String resourceFile;
311 protected String language;
312 protected String viewFile;
313
314 }