/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. */ package com.liferay.util.bridges.bsf; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.util.FileUtil; import com.liferay.portal.kernel.util.StringBundler; import com.liferay.portal.kernel.util.StringPool; import com.liferay.portal.kernel.util.StringUtil; import java.io.IOException; import java.io.InputStream; import java.util.Map; import javax.portlet.ActionRequest; import javax.portlet.ActionResponse; import javax.portlet.GenericPortlet; import javax.portlet.PortletConfig; import javax.portlet.PortletContext; import javax.portlet.PortletException; import javax.portlet.PortletPreferences; import javax.portlet.PortletRequest; import javax.portlet.PortletResponse; import javax.portlet.RenderRequest; import javax.portlet.RenderResponse; import javax.portlet.ResourceRequest; import javax.portlet.ResourceResponse; import org.apache.bsf.BSFException; import org.apache.bsf.BSFManager; /** * @author Jorge Ferrer * @author Brian Wing Shun Chan */ public abstract class BaseBSFPortlet extends GenericPortlet { @Override public void doDispatch( RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException { String file = renderRequest.getParameter(getFileParam()); if (file != null) { include(file, renderRequest, renderResponse); } else { super.doDispatch(renderRequest, renderResponse); } } @Override public void doEdit( RenderRequest renderRequest, RenderResponse renderResponse) throws IOException, PortletException { if (renderRequest.getPreferences() == null) { super.doEdit(renderRequest, renderResponse); } else { include(editFile, renderRequest, renderResponse); } } @Override public void doHelp( RenderRequest renderRequest, RenderResponse renderResponse) throws IOException { include(helpFile, renderRequest, renderResponse); } @Override public void doView( RenderRequest renderRequest, RenderResponse renderResponse) throws IOException { include(viewFile, renderRequest, renderResponse); } @Override public void init() { editFile = getInitParameter("edit-file"); helpFile = getInitParameter("help-file"); viewFile = getInitParameter("view-file"); actionFile = getInitParameter("action-file"); resourceFile = getInitParameter("resource-file"); globalFiles = StringUtil.split(getInitParameter("global-files")); BSFManager.registerScriptingEngine( getScriptingEngineLanguage(), getScriptingEngineClassName(), new String[] {getScriptingEngineExtension()}); bsfManager = new BSFManager(); } @Override public void processAction( ActionRequest actionRequest, ActionResponse actionResponse) throws IOException { include(actionFile, actionRequest, actionResponse); } @Override public void serveResource( ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws IOException { include(resourceFile, resourceRequest, resourceResponse); } protected void declareBeans( InputStream is, PortletRequest portletRequest, PortletResponse portletResponse) throws BSFException, IOException { declareBeans( new String(FileUtil.getBytes(is)), portletRequest, portletResponse); } protected void declareBeans( String code, PortletRequest portletRequest, PortletResponse portletResponse) throws BSFException, IOException { String script = getGlobalScript().concat(code); PortletConfig portletConfig = getPortletConfig(); PortletContext portletContext = getPortletContext(); PortletPreferences preferences = portletRequest.getPreferences(); Map<String, String> userInfo = (Map<String, String>)portletRequest.getAttribute( PortletRequest.USER_INFO); bsfManager.declareBean( "portletConfig", portletConfig, PortletConfig.class); bsfManager.declareBean( "portletContext", portletContext, PortletContext.class); bsfManager.declareBean( "preferences", preferences, PortletPreferences.class); bsfManager.declareBean("userInfo", userInfo, Map.class); if (portletRequest instanceof ActionRequest) { bsfManager.declareBean( "actionRequest", portletRequest, ActionRequest.class); } else if (portletRequest instanceof RenderRequest) { bsfManager.declareBean( "renderRequest", portletRequest, RenderRequest.class); } else if (portletRequest instanceof ResourceRequest) { bsfManager.declareBean( "resourceRequest", portletRequest, ResourceRequest.class); } if (portletResponse instanceof ActionResponse) { bsfManager.declareBean( "actionResponse", portletResponse, ActionResponse.class); } else if (portletResponse instanceof RenderResponse) { bsfManager.declareBean( "renderResponse", portletResponse, RenderResponse.class); } else if (portletResponse instanceof ResourceResponse) { bsfManager.declareBean( "resourceResponse", portletResponse, ResourceResponse.class); } bsfManager.exec(getScriptingEngineLanguage(), "(java)", 1, 1, script); } protected abstract String getFileParam(); protected String getGlobalScript() throws IOException { if (globalFiles.length == 0) { return StringPool.BLANK; } StringBundler sb = new StringBundler(); for (int i = 0; i < globalFiles.length; i++) { PortletContext portletContext = getPortletContext(); InputStream inputStream = portletContext.getResourceAsStream( globalFiles[i]); if (inputStream == null) { if (_log.isWarnEnabled()) { _log.warn( "Global file " + globalFiles[i] + " does not exist"); } } if (inputStream != null) { sb.append(new String(FileUtil.getBytes(inputStream))); sb.append(StringPool.NEW_LINE); } } return sb.toString(); } protected abstract String getScriptingEngineClassName(); protected abstract String getScriptingEngineExtension(); protected abstract String getScriptingEngineLanguage(); protected void include( String path, PortletRequest portletRequest, PortletResponse portletResponse) throws IOException { PortletContext portletContext = getPortletContext(); InputStream inputStream = portletContext.getResourceAsStream(path); if (inputStream == null) { _log.error( path + " is not a valid " + getScriptingEngineLanguage() + " file"); return; } try { declareBeans(inputStream, portletRequest, portletResponse); } catch (BSFException bsfe) { logBSFException(bsfe, path); } finally { inputStream.close(); } } protected void logBSFException(BSFException bsfe, String path) { String message = "The script at " + path + " or one of the global files has errors."; Throwable t = bsfe.getTargetException(); _log.error(message, t); } protected String actionFile; protected BSFManager bsfManager; protected String editFile; protected String[] globalFiles; protected String helpFile; protected String resourceFile; protected String viewFile; private static final Log _log = LogFactoryUtil.getLog(BaseBSFPortlet.class); }