/**
* ***************************************************************************
* Copyright (c) 2010 Qcadoo Limited
* Project: Qcadoo Framework
* Version: 1.4
*
* This file is part of Qcadoo.
*
* Qcadoo is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation; either version 3 of the License,
* or (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
* ***************************************************************************
*/
package com.qcadoo.plugins.plugins.internal;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.qcadoo.plugin.api.PluginDependencyInformation;
import com.qcadoo.plugin.api.PluginOperationResult;
import com.qcadoo.plugin.api.artifact.PluginArtifact;
@Service
public class PluginManagmentPerformer {
private static final String L_WRONG_STATUS = "Wrong status";
@Autowired
private PluginManagmentConnector pluginManagmentConnector;
public String performInstall(final PluginArtifact artifact) {
PluginOperationResult result = pluginManagmentConnector.performInstall(artifact);
String url = null;
switch (result.getStatus()) {
case SUCCESS:
url = createSuccessPageUrl("install.success");
break;
case SUCCESS_WITH_RESTART:
url = createRestartPageUrl(createSuccessPageUrl("install.success"));
break;
case SUCCESS_WITH_MISSING_DEPENDENCIES:
url = createSuccessPageUrl("install.successWithMissingDependencies", result.getPluginDependencyResult()
.getUnsatisfiedDependencies());
break;
case DEPENDENCIES_CYCLES_EXISTS:
url = createErrorPageUrl("install.cyclingDependency");
break;
case CANNOT_UPLOAD_PLUGIN:
url = createErrorPageUrl("install.cannotUploadPlugin");
break;
case CORRUPTED_PLUGIN:
url = createErrorPageUrl("install.corruptedPlugin");
break;
case SYSTEM_PLUGIN_UPDATING:
url = createErrorPageUrl("install.systemPlugin");
break;
case CANNOT_DOWNGRADE_PLUGIN:
url = createErrorPageUrl("install.incorrectVersion");
break;
case CANNOT_INSTALL_PLUGIN_FILE:
url = createErrorPageUrl("install.cannotInstallPlugin");
break;
case DEPENDENCIES_TO_ENABLE:
url = createErrorPageUrl("install.dependenciesToEnable", result.getPluginDependencyResult()
.getDependenciesToEnable());
break;
case UNSATISFIED_DEPENDENCIES:
url = createErrorPageUrl("install.unsatisfiedDependencies", result.getPluginDependencyResult()
.getUnsatisfiedDependencies());
break;
case UNSATISFIED_DEPENDENCIES_AFTER_UPDATE:
url = createErrorPageUrl("install.unsatisfiedDependenciesAfterUpdate", result.getPluginDependencyResult()
.getDependenciesToDisableUnsatisfiedAfterUpdate());
break;
default:
throw new IllegalStateException(L_WRONG_STATUS);
}
return url;
}
public String performEnable(final List<String> pluginIdentifiers) {
PluginOperationResult result = pluginManagmentConnector.performEnable(pluginIdentifiers);
String url = null;
switch (result.getStatus()) {
case SUCCESS:
url = createSuccessPageUrl("enable.success");
break;
case SUCCESS_WITH_RESTART:
url = createRestartPageUrl(createSuccessPageUrl("enable.success"));
break;
case UNSATISFIED_DEPENDENCIES:
url = createErrorPageUrl("enable.unsatisfiedDependencies", result.getPluginDependencyResult()
.getUnsatisfiedDependencies());
break;
case DEPENDENCIES_TO_ENABLE:
url = createConfirmPageUrl("enable.dependenciesToEnable", "enable.dependenciesToEnableCancelLabel",
"enable.dependenciesToEnableAcceptLabel", "performEnablingMultiplePlugins", result
.getPluginDependencyResult().getDependenciesToEnable(), pluginIdentifiers);
break;
case CANNOT_INSTALL_PLUGIN_FILE:
url = createErrorPageUrl("enable.cannotInstall");
break;
case PLUGIN_ENABLING_ENCOUNTERED_ERRORS:
url = createErrorPageUrl("enable.encounteredErrors");
break;
default:
throw new IllegalStateException(L_WRONG_STATUS);
}
return url;
}
public String performDisable(final List<String> pluginIdentifiers) {
PluginOperationResult result = pluginManagmentConnector.performDisable(pluginIdentifiers);
String url = null;
switch (result.getStatus()) {
case SUCCESS:
url = createSuccessPageUrl("disable.success");
break;
case SYSTEM_PLUGIN_DISABLING:
url = createErrorPageUrl("disable.systemPlugin");
break;
case DEPENDENCIES_TO_DISABLE:
url = createConfirmPageUrl("disable.dependenciesToDisable", "disable.dependenciesToDisableCancelLabel",
"disable.dependenciesToDisableAcceptLabel", "performDisablingMultiplePlugins", result
.getPluginDependencyResult().getDependenciesToDisable(), pluginIdentifiers);
break;
default:
throw new IllegalStateException(L_WRONG_STATUS);
}
return url;
}
public String performRemove(final List<String> pluginIdentifiers) {
PluginOperationResult result = pluginManagmentConnector.performRemove(pluginIdentifiers);
String url = null;
switch (result.getStatus()) {
case SUCCESS:
url = createSuccessPageUrl("uninstall.success");
break;
case SUCCESS_WITH_RESTART:
url = createRestartPageUrl(createSuccessPageUrl("uninstall.success"));
break;
case SYSTEM_PLUGIN_UNINSTALLING:
url = createErrorPageUrl("uninstall.systemPlugin");
break;
case DEPENDENCIES_TO_UNINSTALL:
url = createConfirmPageUrl("uninstall.dependenciesToUninstall", "uninstall.dependenciesToUninstallCancelLabel",
"uninstall.dependenciesToUninstallAcceptLabel", "performUninstallingMultiplePlugins", result
.getPluginDependencyResult().getDependenciesToUninstall(), pluginIdentifiers);
break;
default:
throw new IllegalStateException(L_WRONG_STATUS);
}
return url;
}
public void performRestart() {
pluginManagmentConnector.performRestart();
}
private String createSuccessPageUrl(final String statusKey) {
return createSuccessPageUrl(statusKey, null);
}
private String createSuccessPageUrl(final String statusKey, final Set<PluginDependencyInformation> dependencies) {
StringBuilder url = new StringBuilder("../pluginPages/infoPage.html?type=success&status=");
url.append(statusKey);
addDependenciesToUrl(url, dependencies);
return url.toString();
}
private String createErrorPageUrl(final String statusKey) {
return createErrorPageUrl(statusKey, null);
}
private String createErrorPageUrl(final String statusKey, final Set<PluginDependencyInformation> dependencies) {
StringBuilder url = new StringBuilder("../pluginPages/infoPage.html?type=error&status=");
url.append(statusKey);
addDependenciesToUrl(url, dependencies);
return url.toString();
}
private String createConfirmPageUrl(final String statusKey, final String cancelLabel, final String acceptLabel,
final String acceptRedirect, final Set<PluginDependencyInformation> dependencies, final List<String> pluginIdentifiers) {
StringBuilder redirectUrl = new StringBuilder(acceptRedirect);
redirectUrl.append(".html?");
for (String pluginIdentifier : pluginIdentifiers) {
if (redirectUrl.charAt(redirectUrl.length() - 1) != '?') {
redirectUrl.append("&");
}
redirectUrl.append("plugin=");
redirectUrl.append(pluginIdentifier);
}
for (PluginDependencyInformation dependency : dependencies) {
redirectUrl.append("&plugin=");
redirectUrl.append(dependency.getIdentifier());
}
StringBuilder url = new StringBuilder("../pluginPages/infoPage.html?type=confirm&status=");
url.append(statusKey);
url.append("&cancelLabel=");
url.append(cancelLabel);
url.append("&acceptLabel=");
url.append(acceptLabel);
url.append("&acceptRedirect=");
try {
url.append(URLEncoder.encode(redirectUrl.toString(), "ISO-8859-1"));
} catch (UnsupportedEncodingException e) {
throw new IllegalStateException("Error while generating redirect url", e);
}
addDependenciesToUrl(url, dependencies);
return url.toString();
}
private String createRestartPageUrl(final String redirectAfterSuccessPage) {
StringBuilder url = new StringBuilder("../pluginPages/restartPage.html?redirect=");
try {
url.append(URLEncoder.encode(redirectAfterSuccessPage, "ISO-8859-1"));
} catch (UnsupportedEncodingException e) {
throw new IllegalStateException("Error while generating redirect url", e);
}
return url.toString();
}
private void addDependenciesToUrl(final StringBuilder url, final Set<PluginDependencyInformation> dependencies) {
if (dependencies != null) {
for (PluginDependencyInformation dependencyInfo : dependencies) {
url.append("&dep_");
url.append(dependencyInfo.getIdentifier());
url.append("=");
if (dependencyInfo.getVersionOfDependency() == null
|| "0.0.0".equals(dependencyInfo.getVersionOfDependency().toString())) {
url.append("none");
} else {
url.append(dependencyInfo.getVersionOfDependency().toString());
}
}
}
}
}