package com.constellio.app.ui.pages.management.plugin;
import static com.constellio.app.services.extensions.plugins.pluginInfo.ConstellioPluginStatus.DISABLED;
import static com.constellio.app.services.extensions.plugins.pluginInfo.ConstellioPluginStatus.ENABLED;
import static com.constellio.app.services.extensions.plugins.pluginInfo.ConstellioPluginStatus.INVALID;
import static com.constellio.app.services.extensions.plugins.pluginInfo.ConstellioPluginStatus.READY_TO_INSTALL;
import java.io.File;
import java.util.Collection;
import java.util.List;
import net.xeoh.plugins.base.PluginManager;
import net.xeoh.plugins.base.impl.PluginManagerFactory;
import net.xeoh.plugins.base.util.PluginManagerUtil;
import org.apache.hadoop.util.StringUtils;
import com.constellio.app.services.appManagement.AppManagementServiceException;
import com.constellio.app.services.extensions.plugins.ConstellioPluginManager;
import com.constellio.app.services.extensions.plugins.ConstellioPluginManagerRuntimeException.ConstellioPluginManagerRuntimeException_NoSuchModule;
import com.constellio.app.services.extensions.plugins.PluginActivationFailureCause;
import com.constellio.app.services.extensions.plugins.pluginInfo.ConstellioPluginInfo;
import com.constellio.app.ui.pages.base.BasePresenter;
import com.constellio.app.ui.util.MessageUtils;
import com.constellio.model.entities.CorePermissions;
import com.constellio.model.entities.modules.ConstellioPlugin;
import com.constellio.model.entities.modules.Module;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.services.extensions.ConstellioModulesManager;
public class PluginManagementPresenter extends BasePresenter<PluginManagementView> {
transient ConstellioPluginManager pluginManager;
public PluginManagementPresenter(PluginManagementView view) {
super(view);
}
@Override
protected boolean hasPageAccess(String params, User user) {
return userServices().has(user).globalPermissionInAnyCollection(CorePermissions.MANAGE_SYSTEM_CONFIGURATION);
}
public String getDetectedPluginsNames(File file) {
PluginManager pm = PluginManagerFactory.createPluginManager();
file.renameTo(file = new File(file.getAbsolutePath() + ".jar"));
pm.addPluginsFrom(file.toURI());
PluginManagerUtil util = new PluginManagerUtil(pm);
Collection<ConstellioPlugin> plugins = util.getPlugins(ConstellioPlugin.class);
return StringUtils.join("\n", plugins);
}
public PluginActivationFailureCause installPlugin(File tempFile) {
PluginActivationFailureCause cause = pluginManager().prepareInstallablePlugin(tempFile);
if (cause == null) {
appLayerFactory.getSystemGlobalConfigsManager().setRestartRequired(true);
}
return cause;
}
boolean isRestartMessageVisible() {
return appLayerFactory.getSystemGlobalConfigsManager().isRestartRequired();
}
private ConstellioPluginManager pluginManager() {
if (pluginManager == null) {
pluginManager = appLayerFactory.getPluginManager();
}
return pluginManager;
}
public List<ConstellioPluginInfo> getAllPlugins() {
return pluginManager().getPlugins(DISABLED, ENABLED, READY_TO_INSTALL, INVALID);
}
public void enablePlugin(ConstellioPluginInfo info, boolean value) {
if (value) {
pluginManager().markPluginAsEnabled(info.getCode());
} else {
pluginManager().markPluginAsDisabled(info.getCode());
}
}
//TODO test me
public boolean isEnableOrDisablePossible(ConstellioPluginInfo info) {
if (!info.getPluginStatus().equals(ENABLED) && !info.getPluginStatus().equals(DISABLED)) {
return false;
} else {
ConstellioModulesManager modulesManager = appLayerFactory.getModulesManager();
try {
Module module = modulesManager.getInstalledModule(info.getCode());
if (module != null && modulesManager.isInstalled(module)) {
return false;
} else {
return true;
}
} catch (ConstellioPluginManagerRuntimeException_NoSuchModule e) {
return true;
}
}
}
public Boolean isEnabled(ConstellioPluginInfo info) {
return info.getPluginStatus().equals(ENABLED);
}
public void restartRequested() {
try {
appLayerFactory.newApplicationService().restart();
} catch (AppManagementServiceException e) {
view.showErrorMessage(MessageUtils.toMessage(e));
}
}
}