use of com.qcadoo.plugin.api.Plugin in project qcadoo by qcadoo.
the class DefaultPluginManager method disablePlugin.
@Override
public PluginOperationResult disablePlugin(final String... keys) {
List<Plugin> plugins = new ArrayList<>();
for (String key : keys) {
Plugin plugin = pluginAccessor.getPlugin(key);
if (plugin.isSystemPlugin()) {
return PluginOperationResultImpl.systemPluginDisabling();
}
if (plugin.hasState(PluginState.ENABLED)) {
plugins.add(plugin);
}
}
if (plugins.isEmpty()) {
return PluginOperationResultImpl.success();
}
PluginDependencyResult pluginDependencyResult = pluginDependencyManager.getDependenciesToDisable(plugins, pluginStatusResolver);
if (!pluginDependencyResult.isDependenciesSatisfied() && !pluginDependencyResult.getDependenciesToDisable().isEmpty()) {
return PluginOperationResultImpl.dependenciesToDisable(pluginDependencyResult);
}
plugins = pluginDependencyManager.sortPluginsInDependencyOrder(plugins);
Collections.reverse(plugins);
for (Plugin plugin : plugins) {
((InternalPlugin) plugin).changeStateTo(PluginState.DISABLED);
pluginDao.save(plugin);
pluginAccessor.savePlugin(plugin);
}
return PluginOperationResultImpl.success();
}
use of com.qcadoo.plugin.api.Plugin in project qcadoo by qcadoo.
the class DefaultPluginAccessor method onApplicationEvent.
@Override
public void onApplicationEvent(final ContextRefreshedEvent event) {
if (!alreadyInitialized) {
synchronized (this) {
if (!alreadyInitialized) {
init();
alreadyInitialized = true;
}
}
}
if (event != null && event.getSource() instanceof XmlWebApplicationContext) {
XmlWebApplicationContext eventSource = (XmlWebApplicationContext) event.getSource();
if (eventSource.getParent() != null) {
return;
}
}
long time = System.currentTimeMillis();
List<Plugin> sortedPlugins = pluginDependencyManager.sortPluginsInDependencyOrder(plugins.values(), plugins);
moduleFactoryAccessor.init(sortedPlugins);
for (Plugin plugin : sortedPlugins) {
if (plugin.hasState(PluginState.ENABLING)) {
((InternalPlugin) plugin).changeStateTo(PluginState.ENABLED);
pluginDao.save(plugin);
}
}
LOG.info("Plugin Framework started in " + (System.currentTimeMillis() - time) + "ms");
}
use of com.qcadoo.plugin.api.Plugin in project qcadoo by qcadoo.
the class DefaultPluginAccessor method init.
public void init() {
LOG.info("Plugin Framework initialization");
long time = System.currentTimeMillis();
pluginStateResolver.setPluginAccessor(this);
Set<InternalPlugin> enabledPluginsFromDescriptor = pluginDescriptorParser.loadPlugins();
Set<QcadooPluginPlugin> pluginsFromDatabase = pluginDao.list();
for (InternalPlugin plugin : enabledPluginsFromDescriptor) {
QcadooPluginPlugin existingPlugin = null;
for (QcadooPluginPlugin databasePlugin : pluginsFromDatabase) {
if (plugin.getIdentifier().equals(databasePlugin.getIdentifier())) {
existingPlugin = databasePlugin;
break;
}
}
if (existingPlugin == null) {
plugin.changeStateTo(PluginState.ENABLING);
} else {
plugin.changeStateTo(PluginState.valueOf(existingPlugin.getState()));
}
if (existingPlugin == null || plugin.compareVersion(new Version(existingPlugin.getVersion())) > 0) {
pluginDao.save(plugin);
} else if (plugin.compareVersion(new Version(existingPlugin.getVersion())) < 0) {
throw new IllegalStateException("Unsupported operation: downgrade, for plugin: " + plugin.getIdentifier());
}
LOG.info("Registering plugin " + plugin);
plugins.put(plugin.getIdentifier(), plugin);
}
for (QcadooPluginPlugin databasePlugin : pluginsFromDatabase) {
if (databasePlugin.getState().equals(PluginState.TEMPORARY.toString())) {
continue;
}
Plugin existingPlugin = null;
for (Plugin plugin : enabledPluginsFromDescriptor) {
if (databasePlugin.getIdentifier().equals(plugin.getIdentifier())) {
existingPlugin = plugin;
break;
}
}
if (existingPlugin == null) {
pluginDao.delete(databasePlugin);
}
}
Set<InternalPlugin> temporaryPlugins = pluginDescriptorParser.getTemporaryPlugins();
for (InternalPlugin plugin : temporaryPlugins) {
plugins.put(plugin.getIdentifier(), plugin);
}
LOG.info("Plugin Framework initialized in " + (System.currentTimeMillis() - time) + "ms");
}
use of com.qcadoo.plugin.api.Plugin in project qcadoo by qcadoo.
the class DefaultPluginManager method getEnabledPluginsList.
@Override
public List<Plugin> getEnabledPluginsList() {
List<Plugin> pluginIdentifierList = new ArrayList<Plugin>();
Set<QcadooPluginPlugin> pluginList = pluginDao.list();
for (QcadooPluginPlugin qcadooPlugin : pluginList) {
Plugin plugin = pluginAccessor.getEnabledPlugin(qcadooPlugin.getIdentifier());
if (plugin != null) {
pluginIdentifierList.add(plugin);
}
}
return pluginIdentifierList;
}
use of com.qcadoo.plugin.api.Plugin in project qcadoo by qcadoo.
the class DefaultPluginManager method installPlugin.
@Override
public PluginOperationResult installPlugin(final PluginArtifact pluginArtifact) {
File pluginFile = null;
try {
pluginFile = pluginFileManager.uploadPlugin(pluginArtifact);
} catch (PluginException e) {
return PluginOperationResultImpl.cannotUploadPlugin();
}
Plugin plugin = null;
try {
plugin = pluginDescriptorParser.parse(pluginFile);
} catch (PluginException e) {
LOG.error(e.getMessage());
pluginFileManager.uninstallPlugin(pluginFile.getName());
return PluginOperationResultImpl.corruptedPlugin();
}
if (plugin.isSystemPlugin()) {
pluginFileManager.uninstallPlugin(plugin.getFilename());
return PluginOperationResultImpl.systemPluginUpdating();
}
boolean shouldRestart = false;
PluginDependencyResult pluginDependencyResult = pluginDependencyManager.getDependenciesToEnable(newArrayList(plugin), pluginStatusResolver);
if (pluginDependencyResult.isCyclic()) {
pluginFileManager.uninstallPlugin(plugin.getFilename());
return PluginOperationResultImpl.dependenciesCyclesExists();
}
Plugin existingPlugin = pluginAccessor.getPlugin(plugin.getIdentifier());
if (existingPlugin == null) {
((InternalPlugin) plugin).changeStateTo(PluginState.TEMPORARY);
pluginDao.save(plugin);
pluginAccessor.savePlugin(plugin);
if (!pluginDependencyResult.isDependenciesSatisfied() && !pluginDependencyResult.getUnsatisfiedDependencies().isEmpty()) {
return PluginOperationResultImpl.successWithMissingDependencies(pluginDependencyResult);
}
return PluginOperationResultImpl.success();
} else {
if (existingPlugin.getVersion().compareTo(plugin.getVersion()) >= 0) {
pluginFileManager.uninstallPlugin(plugin.getFilename());
return PluginOperationResultImpl.cannotDowngradePlugin();
}
if (existingPlugin.hasState(PluginState.TEMPORARY)) {
if (!pluginDependencyResult.isDependenciesSatisfied() && !pluginDependencyResult.getUnsatisfiedDependencies().isEmpty()) {
pluginFileManager.uninstallPlugin(existingPlugin.getFilename());
((InternalPlugin) plugin).changeStateTo(existingPlugin.getState());
pluginDao.save(plugin);
pluginAccessor.savePlugin(plugin);
return PluginOperationResultImpl.successWithMissingDependencies(pluginDependencyResult);
}
((InternalPlugin) plugin).changeStateTo(existingPlugin.getState());
} else if (existingPlugin.hasState(PluginState.DISABLED)) {
if (!pluginDependencyResult.isDependenciesSatisfied() && !pluginDependencyResult.getUnsatisfiedDependencies().isEmpty()) {
pluginFileManager.uninstallPlugin(plugin.getFilename());
return PluginOperationResultImpl.unsatisfiedDependencies(pluginDependencyResult);
}
if (!pluginFileManager.installPlugin(plugin.getFilename())) {
pluginFileManager.uninstallPlugin(plugin.getFilename());
return PluginOperationResultImpl.cannotInstallPlugin();
}
shouldRestart = true;
((InternalPlugin) plugin).changeStateTo(existingPlugin.getState());
} else if (existingPlugin.hasState(PluginState.ENABLED)) {
if (!pluginDependencyResult.isDependenciesSatisfied()) {
if (!pluginDependencyResult.getUnsatisfiedDependencies().isEmpty()) {
pluginFileManager.uninstallPlugin(plugin.getFilename());
return PluginOperationResultImpl.unsatisfiedDependencies(pluginDependencyResult);
}
if (!pluginDependencyResult.getDependenciesToEnable().isEmpty()) {
pluginFileManager.uninstallPlugin(plugin.getFilename());
return PluginOperationResultImpl.dependenciesToEnable(pluginDependencyResult);
}
}
if (!pluginFileManager.installPlugin(plugin.getFilename())) {
pluginFileManager.uninstallPlugin(plugin.getFilename());
return PluginOperationResultImpl.cannotInstallPlugin();
}
shouldRestart = true;
PluginDependencyResult installPluginDependencyResult = pluginDependencyManager.getDependenciesToUpdate(existingPlugin, plugin, pluginStatusResolver);
if (!installPluginDependencyResult.getDependenciesToDisableUnsatisfiedAfterUpdate().isEmpty()) {
pluginFileManager.uninstallPlugin(plugin.getFilename());
return PluginOperationResultImpl.unsatisfiedDependenciesAfterUpdate(installPluginDependencyResult);
}
List<Plugin> dependencyPlugins = new ArrayList<Plugin>();
for (PluginDependencyInformation pluginDependencyInformation : installPluginDependencyResult.getDependenciesToDisable()) {
dependencyPlugins.add(pluginAccessor.getPlugin(pluginDependencyInformation.getIdentifier()));
}
dependencyPlugins = pluginDependencyManager.sortPluginsInDependencyOrder(dependencyPlugins);
Collections.reverse(dependencyPlugins);
for (Plugin dependencyPlugin : dependencyPlugins) {
((InternalPlugin) dependencyPlugin).changeStateTo(PluginState.DISABLED);
}
((InternalPlugin) existingPlugin).changeStateTo(PluginState.DISABLED);
((InternalPlugin) plugin).changeStateTo(PluginState.ENABLING);
Collections.reverse(dependencyPlugins);
for (Plugin dependencyPlugin : dependencyPlugins) {
((InternalPlugin) dependencyPlugin).changeStateTo(PluginState.ENABLING);
pluginDao.save(dependencyPlugin);
}
}
pluginFileManager.uninstallPlugin(existingPlugin.getFilename());
pluginDao.save(plugin);
pluginAccessor.savePlugin(plugin);
if (shouldRestart) {
return PluginOperationResultImpl.successWithRestart();
} else {
return PluginOperationResultImpl.success();
}
}
}
Aggregations