com.liferay.util.bridges.scripting.ScriptingPortlet.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.util.bridges.scripting.ScriptingPortlet.java

Source

/**
 * Copyright (c) 2000-2012 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.scripting;

import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.portlet.PortletResponseUtil;
import com.liferay.portal.kernel.scripting.ScriptingException;
import com.liferay.portal.kernel.scripting.ScriptingUtil;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.util.ContentTypes;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.HtmlUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.security.permission.ActionKeys;
import com.liferay.portal.security.permission.PermissionChecker;
import com.liferay.portal.service.permission.PortalPermissionUtil;
import com.liferay.portal.theme.ThemeDisplay;

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.PortletRequest;
import javax.portlet.PortletResponse;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;

/**
 * @author Jorge Ferrer
 * @author Brian Wing Shun Chan
 * @author Alberto Montero
 */
public class ScriptingPortlet extends GenericPortlet {

    @Override
    public void init() {
        actionFile = getInitParameter("action-file");
        editFile = getInitParameter("edit-file");
        helpFile = getInitParameter("help-file");
        resourceFile = getInitParameter("resource-file");
        viewFile = getInitParameter("view-file");

        language = getInitParameter("scripting-language");
        globalFiles = StringUtil.split(getInitParameter("global-files"));
    }

    @Override
    public void doDispatch(RenderRequest renderRequest, RenderResponse renderResponse)
            throws IOException, PortletException {

        String fileName = getFileName(renderRequest);

        if (fileName != null) {
            include(fileName, 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 processAction(ActionRequest actionRequest, ActionResponse actionResponse) throws IOException {

        include(actionFile, actionRequest, actionResponse);
    }

    @Override
    public void render(RenderRequest renderRequest, RenderResponse renderResponse)
            throws IOException, PortletException {

        try {
            doRender(renderRequest, renderResponse);
        } catch (IOException ioe) {
            throw ioe;
        } catch (PortletException pe) {
            throw pe;
        } catch (Exception e) {
            throw new PortletException(e);
        }
    }

    @Override
    public void serveResource(ResourceRequest resourceRequest, ResourceResponse resourceResponse)
            throws IOException {

        include(resourceFile, resourceRequest, resourceResponse);
    }

    protected void declareBeans(InputStream is, PortletRequest portletRequest, PortletResponse portletResponse)
            throws IOException, ScriptingException {

        String script = new String(FileUtil.getBytes(is));

        declareBeans(script, portletRequest, portletResponse);
    }

    protected void declareBeans(String script, PortletRequest portletRequest, PortletResponse portletResponse)
            throws IOException, ScriptingException {

        script = getGlobalScript() + script;

        PortletConfig portletConfig = getPortletConfig();
        PortletContext portletContext = getPortletContext();

        Map<String, Object> portletObjects = ScriptingUtil.getPortletObjects(portletConfig, portletContext,
                portletRequest, portletResponse);

        ScriptingUtil.exec(null, portletObjects, language, script);
    }

    protected void doRender(RenderRequest renderRequest, RenderResponse renderResponse) throws Exception {

        Object error = SessionErrors.get(renderRequest, _ERROR);

        if (error != null) {
            Exception e = (Exception) error;

            writeErrorMessage(renderRequest, renderResponse, e.getMessage());

            return;
        }

        super.render(renderRequest, renderResponse);

        error = SessionErrors.get(renderRequest, _ERROR);

        if (error != null) {
            Exception e = (Exception) error;

            writeErrorMessage(renderRequest, renderResponse, e.getMessage());
        }
    }

    protected String getFileName(RenderRequest renderRequest) {
        return renderRequest.getParameter("file");
    }

    protected String getGlobalScript() throws IOException {
        if (globalScript != null) {
            return globalScript;
        }

        if (globalFiles.length == 0) {
            globalScript = StringPool.BLANK;

            return globalScript;
        }

        StringBundler sb = new StringBundler();

        for (String globalFile : globalFiles) {
            InputStream is = getPortletContext().getResourceAsStream(globalFile);

            if (is == null) {
                if (_log.isWarnEnabled()) {
                    _log.warn("Global file " + globalFile + " does not exist");
                }
            }

            if (is != null) {
                String script = new String(FileUtil.getBytes(is));

                sb.append(script);
                sb.append(StringPool.NEW_LINE);
            }
        }

        globalScript = sb.toString();

        return globalScript;
    }

    protected void include(String path, PortletRequest portletRequest, PortletResponse portletResponse)
            throws IOException {

        InputStream is = getPortletContext().getResourceAsStream(path);

        if (is == null) {
            _log.error(path + " is not a valid " + language + " file");

            return;
        }

        try {
            declareBeans(is, portletRequest, portletResponse);
        } catch (ScriptingException se) {
            SessionErrors.add(portletRequest, _ERROR, se);
        } finally {
            is.close();
        }
    }

    protected void writeErrorMessage(RenderRequest renderRequest, RenderResponse renderResponse,
            String errorMessage) throws Exception {

        ThemeDisplay themeDisplay = (ThemeDisplay) renderRequest.getAttribute(WebKeys.THEME_DISPLAY);

        PermissionChecker permissionChecker = themeDisplay.getPermissionChecker();

        StringBundler sb = new StringBundler(6);

        sb.append("<div class=\"portlet-msg-error\">");
        sb.append(themeDisplay.translate("an-unexpected-error-occurred"));
        sb.append("</div>");

        if (PortalPermissionUtil.contains(permissionChecker, ActionKeys.CONFIGURATION)) {

            sb.append("<pre>");
            sb.append(HtmlUtil.escape(errorMessage));
            sb.append("</pre>");
        }

        renderResponse.setContentType(ContentTypes.TEXT_HTML);

        PortletResponseUtil.write(renderResponse, sb.toString());
    }

    private static final String _ERROR = ScriptingPortlet.class + ".ERROR";

    private static Log _log = LogFactoryUtil.getLog(ScriptingPortlet.class);

    protected String actionFile;
    protected String editFile;
    protected String helpFile;
    protected String[] globalFiles;
    protected String globalScript;
    protected String resourceFile;
    protected String language;
    protected String viewFile;

}