com.liferay.marketplace.appmanager.portlet.AppManagerPortlet.java Source code

Java tutorial

Introduction

Here is the source code for com.liferay.marketplace.appmanager.portlet.AppManagerPortlet.java

Source

/**
 * 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.marketplace.appmanager.portlet;

import com.liferay.marketplace.service.AppServiceUtil;
import com.liferay.portal.kernel.deploy.DeployManagerUtil;
import com.liferay.portal.kernel.servlet.ServletContextPool;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.servlet.SessionMessages;
import com.liferay.portal.kernel.upload.UploadException;
import com.liferay.portal.kernel.upload.UploadPortletRequest;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.CharPool;
import com.liferay.portal.kernel.util.Constants;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.Http;
import com.liferay.portal.kernel.util.HttpUtil;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.PrefsPropsUtil;
import com.liferay.portal.kernel.util.PropsKeys;
import com.liferay.portal.kernel.util.PropsUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.model.LayoutTemplate;
import com.liferay.portal.model.Plugin;
import com.liferay.portal.model.PluginSetting;
import com.liferay.portal.model.Portlet;
import com.liferay.portal.model.Theme;
import com.liferay.portal.service.PluginSettingLocalServiceUtil;
import com.liferay.portal.service.PluginSettingServiceUtil;
import com.liferay.portal.service.PortletServiceUtil;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portal.util.PortalUtil;
import com.liferay.portal.kernel.portlet.bridges.mvc.MVCPortlet;

import java.io.File;
import java.io.IOException;

import java.net.MalformedURLException;
import java.net.URL;

import java.util.Arrays;
import java.util.List;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletResponse;

/**
 * @author Ryan Park
 */
public class AppManagerPortlet extends MVCPortlet {

    public void installApp(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception {

        UploadPortletRequest uploadPortletRequest = PortalUtil.getUploadPortletRequest(actionRequest);

        String installMethod = ParamUtil.getString(uploadPortletRequest, "installMethod");

        if (installMethod.equals("local")) {
            String fileName = GetterUtil.getString(uploadPortletRequest.getFileName("file"));

            File file = uploadPortletRequest.getFile("file");

            byte[] bytes = FileUtil.getBytes(file);

            if (ArrayUtil.isEmpty(bytes)) {
                SessionErrors.add(actionRequest, UploadException.class.getName());
            } else {
                String deployDir = PrefsPropsUtil.getString(PropsKeys.AUTO_DEPLOY_DEPLOY_DIR);

                FileUtil.copyFile(file.toString(), deployDir + StringPool.SLASH + fileName);

                SessionMessages.add(actionRequest, "pluginUploaded");
            }
        } else {
            try {
                String url = ParamUtil.getString(uploadPortletRequest, "url");

                URL urlObj = new URL(url);

                String host = urlObj.getHost();

                if (host.endsWith("sf.net") || host.endsWith("sourceforge.net")) {

                    doInstallSourceForgeApp(urlObj.getPath(), uploadPortletRequest, actionRequest);
                } else {
                    doInstallRemoteApp(url, uploadPortletRequest, actionRequest, true);
                }
            } catch (MalformedURLException murle) {
                SessionErrors.add(actionRequest, "invalidUrl", murle);
            }
        }

        String redirect = ParamUtil.getString(uploadPortletRequest, "redirect");

        actionResponse.sendRedirect(redirect);
    }

    public void uninstallApp(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception {

        long remoteAppId = ParamUtil.getLong(actionRequest, "remoteAppId");

        if (remoteAppId > 0) {
            AppServiceUtil.uninstallApp(remoteAppId);
        } else {
            String[] contextNames = StringUtil.split(ParamUtil.getString(actionRequest, "contextNames"));

            for (String contextName : contextNames) {
                DeployManagerUtil.undeploy(contextName);
            }
        }

        SessionMessages.add(actionRequest, "triggeredPortletUndeploy");
    }

    public void updatePluginSetting(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception {

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

        String pluginId = ParamUtil.getString(actionRequest, "pluginId");
        String pluginType = ParamUtil.getString(actionRequest, "pluginType");

        String[] roles = StringUtil.split(ParamUtil.getString(actionRequest, "roles"), CharPool.NEW_LINE);

        Arrays.sort(roles);

        boolean active = ParamUtil.getBoolean(actionRequest, "active");

        if (pluginType.equals(Plugin.TYPE_PORTLET)) {
            PortletServiceUtil.updatePortlet(themeDisplay.getCompanyId(), pluginId, StringPool.BLANK, active);
        } else {
            if (roles.length == 0) {
                PluginSetting pluginSetting = PluginSettingLocalServiceUtil
                        .getPluginSetting(themeDisplay.getCompanyId(), pluginId, pluginType);

                roles = StringUtil.split(pluginSetting.getRoles());
            }

            PluginSettingServiceUtil.updatePluginSetting(themeDisplay.getCompanyId(), pluginId, pluginType,
                    StringUtil.merge(roles), active);
        }
    }

    public void updatePluginSettings(ActionRequest actionRequest, ActionResponse actionResponse) throws Exception {

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

        String[] contextNames = StringUtil.split(ParamUtil.getString(actionRequest, "contextNames"));

        boolean active = ParamUtil.getBoolean(actionRequest, "active");

        for (String contextName : contextNames) {
            ServletContext servletContext = ServletContextPool.get(contextName);

            List<LayoutTemplate> layoutTemplates = (List<LayoutTemplate>) servletContext
                    .getAttribute(WebKeys.PLUGIN_LAYOUT_TEMPLATES);

            if (layoutTemplates != null) {
                for (LayoutTemplate layoutTemplate : layoutTemplates) {
                    PluginSetting pluginSetting = PluginSettingLocalServiceUtil.getPluginSetting(
                            themeDisplay.getCompanyId(), layoutTemplate.getLayoutTemplateId(),
                            Plugin.TYPE_LAYOUT_TEMPLATE);

                    PluginSettingServiceUtil.updatePluginSetting(themeDisplay.getCompanyId(),
                            layoutTemplate.getLayoutTemplateId(), Plugin.TYPE_LAYOUT_TEMPLATE,
                            pluginSetting.getRoles(), active);
                }
            }

            List<Portlet> portlets = (List<Portlet>) servletContext.getAttribute(WebKeys.PLUGIN_PORTLETS);

            if (portlets != null) {
                for (Portlet portlet : portlets) {
                    PortletServiceUtil.updatePortlet(themeDisplay.getCompanyId(), portlet.getPortletId(),
                            StringPool.BLANK, active);
                }
            }

            List<Theme> themes = (List<Theme>) servletContext.getAttribute(WebKeys.PLUGIN_THEMES);

            if (themes != null) {
                for (Theme theme : themes) {
                    PluginSetting pluginSetting = PluginSettingLocalServiceUtil
                            .getPluginSetting(themeDisplay.getCompanyId(), theme.getThemeId(), Plugin.TYPE_THEME);

                    PluginSettingServiceUtil.updatePluginSetting(themeDisplay.getCompanyId(), theme.getThemeId(),
                            Plugin.TYPE_THEME, pluginSetting.getRoles(), active);
                }
            }
        }
    }

    protected int doInstallRemoteApp(String url, UploadPortletRequest uploadPortletRequest,
            ActionRequest actionRequest, boolean failOnError) throws Exception {

        int responseCode = HttpServletResponse.SC_OK;

        String deploymentContext = ParamUtil.getString(uploadPortletRequest, "deploymentContext");

        try {
            String fileName = null;

            if (Validator.isNotNull(deploymentContext)) {
                fileName = DEPLOY_TO_PREFIX + deploymentContext + ".war";
            } else {
                fileName = url.substring(url.lastIndexOf(CharPool.SLASH) + 1);

                int pos = fileName.lastIndexOf(CharPool.PERIOD);

                if (pos != -1) {
                    deploymentContext = fileName.substring(0, pos);
                }
            }

            Http.Options options = new Http.Options();

            options.setFollowRedirects(false);
            options.setLocation(url);
            options.setPortletRequest(actionRequest);
            options.setPost(false);

            String progressId = ParamUtil.getString(uploadPortletRequest, Constants.PROGRESS_ID);

            options.setProgressId(progressId);

            byte[] bytes = HttpUtil.URLtoByteArray(options);

            Http.Response response = options.getResponse();

            responseCode = response.getResponseCode();

            if ((responseCode == HttpServletResponse.SC_OK) && (bytes.length > 0)) {

                String deployDir = PrefsPropsUtil.getString(PropsKeys.AUTO_DEPLOY_DEPLOY_DIR);

                String destination = deployDir + StringPool.SLASH + fileName;

                File destinationFile = new File(destination);

                FileUtil.write(destinationFile, bytes);

                SessionMessages.add(actionRequest, "pluginDownloaded");
            } else {
                if (failOnError) {
                    SessionErrors.add(actionRequest, UploadException.class.getName());
                }

                responseCode = HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
            }
        } catch (MalformedURLException murle) {
            SessionErrors.add(actionRequest, "invalidUrl", murle);
        } catch (IOException ioe) {
            SessionErrors.add(actionRequest, "errorConnectingToUrl", ioe);
        }

        return responseCode;
    }

    protected void doInstallSourceForgeApp(String path, UploadPortletRequest uploadPortletRequest,
            ActionRequest actionRequest) throws Exception {

        String[] sourceForgeMirrors = PropsUtil.getArray(PropsKeys.SOURCE_FORGE_MIRRORS);

        for (int i = 0; i < sourceForgeMirrors.length; i++) {
            try {
                String url = sourceForgeMirrors[i] + path;

                boolean failOnError = false;

                if ((i + 1) == sourceForgeMirrors.length) {
                    failOnError = true;
                }

                int responseCode = doInstallRemoteApp(url, uploadPortletRequest, actionRequest, failOnError);

                if (responseCode == HttpServletResponse.SC_OK) {
                    return;
                }
            } catch (MalformedURLException murle) {
                SessionErrors.add(actionRequest, "invalidUrl", murle);
            }
        }
    }

    private final String DEPLOY_TO_PREFIX = "DEPLOY_TO__";

}