use of com.qcadoo.plugin.api.Plugin in project qcadoo by qcadoo.
the class PluginAccessorTest method shouldSaveExistingPlugin.
@Test
public void shouldSaveExistingPlugin() throws Exception {
// given
InternalPlugin plugin1 = mock(InternalPlugin.class, "plugin1");
given(plugin1.getIdentifier()).willReturn("identifier1");
InternalPlugin plugin2 = mock(InternalPlugin.class);
given(plugin2.getIdentifier()).willReturn("identifier1");
QcadooPluginPlugin pluginsPlugin2 = mock(QcadooPluginPlugin.class);
given(pluginsPlugin2.getIdentifier()).willReturn("identifier1");
given(pluginsPlugin2.getState()).willReturn("ENABLED");
given(pluginsPlugin2.getVersion()).willReturn("0.0.0");
given(pluginDescriptorParser.loadPlugins()).willReturn(Sets.newHashSet(plugin1));
given(pluginDao.list()).willReturn(Sets.<QcadooPluginPlugin>newHashSet(pluginsPlugin2));
pluginAccessor.init();
// when
pluginAccessor.savePlugin(plugin2);
// then
assertEquals(1, pluginAccessor.getPlugins().size());
assertThat(pluginAccessor.getPlugins(), hasItems((Plugin) plugin2));
}
use of com.qcadoo.plugin.api.Plugin in project qcadoo by qcadoo.
the class PluginAccessorTest method shouldSaveNewPlugin.
@Test
public void shouldSaveNewPlugin() throws Exception {
// given
InternalPlugin plugin1 = mock(InternalPlugin.class, "plugin1");
given(plugin1.getIdentifier()).willReturn("identifier1");
QcadooPluginPlugin pluginsPlugin1 = mock(QcadooPluginPlugin.class);
given(pluginsPlugin1.getIdentifier()).willReturn("identifier1");
given(pluginsPlugin1.getState()).willReturn("ENABLED");
given(pluginsPlugin1.getVersion()).willReturn("0.0.0");
InternalPlugin plugin2 = mock(InternalPlugin.class);
given(plugin2.getIdentifier()).willReturn("identifier2");
given(pluginDescriptorParser.loadPlugins()).willReturn(Sets.newHashSet(plugin1));
given(pluginDao.list()).willReturn(Sets.<QcadooPluginPlugin>newHashSet(pluginsPlugin1));
pluginAccessor.init();
// when
pluginAccessor.savePlugin(plugin2);
// then
assertThat(pluginAccessor.getPlugins(), hasItems((Plugin) plugin1, (Plugin) plugin2));
}
use of com.qcadoo.plugin.api.Plugin in project qcadoo by qcadoo.
the class PluginAccessorTest method shouldListAllPlugins.
@Test
public void shouldListAllPlugins() throws Exception {
// given
InternalPlugin plugin1 = mock(InternalPlugin.class, "plugin1");
QcadooPluginPlugin pluginsPlugin1 = mock(QcadooPluginPlugin.class, "plugin1");
given(plugin1.getIdentifier()).willReturn("identifier1");
given(pluginsPlugin1.getIdentifier()).willReturn("identifier1");
given(pluginsPlugin1.getVersion()).willReturn("0.0.0");
given(plugin1.compareVersion(new Version(pluginsPlugin1.getVersion()))).willReturn(0);
given(plugin1.hasState(PluginState.ENABLED)).willReturn(false);
given(pluginsPlugin1.getState()).willReturn("DISABLED");
QcadooPluginPlugin pluginsPlugin21 = mock(QcadooPluginPlugin.class, "plugin21");
given(pluginsPlugin21.getIdentifier()).willReturn("identifier21");
given(pluginsPlugin21.getState()).willReturn("ENABLED");
InternalPlugin plugin22 = mock(InternalPlugin.class, "plugin22");
given(plugin22.getIdentifier()).willReturn("identifier21");
given(plugin22.hasState(PluginState.ENABLED)).willReturn(true);
given(pluginsPlugin21.getVersion()).willReturn("0.0.0");
given(plugin22.compareVersion(new Version(pluginsPlugin21.getVersion()))).willReturn(1);
InternalPlugin plugin3 = mock(InternalPlugin.class, "plugin3");
QcadooPluginPlugin pluginsPlugin3 = mock(QcadooPluginPlugin.class, "plugin3");
given(plugin3.getIdentifier()).willReturn("identifier3");
given(pluginsPlugin3.getIdentifier()).willReturn("identifier3");
given(pluginsPlugin3.getVersion()).willReturn("0.0.0");
given(plugin3.hasState(PluginState.ENABLED)).willReturn(true);
given(plugin3.isSystemPlugin()).willReturn(true);
given(pluginsPlugin3.getState()).willReturn("ENABLED");
InternalPlugin plugin4 = mock(InternalPlugin.class, "plugin4");
given(plugin4.getIdentifier()).willReturn("identifier4");
given(plugin4.hasState(PluginState.ENABLED)).willReturn(false);
Set<InternalPlugin> pluginsFromDescriptor = Sets.newHashSet(plugin1, plugin22, plugin3, plugin4);
Set<QcadooPluginPlugin> pluginsFromDatabase = Sets.newHashSet(pluginsPlugin1, pluginsPlugin21, pluginsPlugin3);
given(pluginDescriptorParser.loadPlugins()).willReturn(pluginsFromDescriptor);
given(pluginDao.list()).willReturn(pluginsFromDatabase);
// when
pluginAccessor.init();
// then
verify(plugin1).changeStateTo(PluginState.DISABLED);
verify(plugin22).changeStateTo(PluginState.ENABLED);
verify(plugin3).changeStateTo(PluginState.ENABLED);
verify(plugin4).changeStateTo(PluginState.ENABLING);
assertThat(pluginAccessor.getPlugins(), hasItems((Plugin) plugin1, (Plugin) plugin22, (Plugin) plugin3, (Plugin) plugin4));
assertThat(pluginAccessor.getEnabledPlugins(), hasItems((Plugin) plugin22, (Plugin) plugin3));
assertThat(pluginAccessor.getEnabledPlugins(), not(hasItem((Plugin) plugin1)));
assertThat(pluginAccessor.getEnabledPlugins(), not(hasItem((Plugin) plugin4)));
assertThat(pluginAccessor.getSystemPlugins(), hasItem((Plugin) plugin3));
assertEquals(plugin1, pluginAccessor.getPlugin("identifier1"));
assertEquals(plugin22, pluginAccessor.getPlugin("identifier21"));
assertEquals(plugin3, pluginAccessor.getPlugin("identifier3"));
assertEquals(plugin4, pluginAccessor.getPlugin("identifier4"));
assertNull(pluginAccessor.getEnabledPlugin("identifier1"));
assertEquals(plugin22, pluginAccessor.getEnabledPlugin("identifier21"));
assertEquals(plugin3, pluginAccessor.getEnabledPlugin("identifier3"));
assertNull(pluginAccessor.getEnabledPlugin("identifier4"));
}
use of com.qcadoo.plugin.api.Plugin in project qcadoo by qcadoo.
the class DefaultModuleFactoryAccessor method init.
@Override
public void init(final List<Plugin> pluginsToInitialize) {
for (ModuleFactory<?> moduleFactory : moduleFactoryRegistry.values()) {
moduleFactory.preInit();
for (Plugin plugin : pluginsToInitialize) {
for (Module module : ((InternalPlugin) plugin).getModules(moduleFactory)) {
module.init();
}
}
moduleFactory.postInit();
}
List<ModuleFactory<?>> factories = new ArrayList<ModuleFactory<?>>(moduleFactoryRegistry.values());
List<Plugin> plugins = new ArrayList<Plugin>(pluginsToInitialize);
for (ModuleFactory<?> moduleFactory : factories) {
for (final Plugin plugin : plugins) {
List<Module> modules = ((InternalPlugin) plugin).getModules(moduleFactory);
for (final Module module : modules) {
if (plugin.hasState(PluginState.ENABLED)) {
module.enableOnStartup();
MultiTenantUtil.doInMultiTenantContext(new MultiTenantCallback() {
@Override
public void invoke() {
module.multiTenantEnableOnStartup();
}
});
}
}
}
}
Collections.reverse(factories);
Collections.reverse(plugins);
for (ModuleFactory<?> moduleFactory : factories) {
for (final Plugin plugin : plugins) {
List<Module> modules = ((InternalPlugin) plugin).getModules(moduleFactory);
Collections.reverse(modules);
for (final Module module : modules) {
if (!plugin.hasState(PluginState.ENABLED) && !plugin.hasState(PluginState.ENABLING)) {
module.disableOnStartup();
MultiTenantUtil.doInMultiTenantContext(new MultiTenantCallback() {
@Override
public void invoke() {
module.multiTenantDisableOnStartup();
}
});
}
}
}
}
}
use of com.qcadoo.plugin.api.Plugin in project qcadoo by qcadoo.
the class DefaultPluginDependencyManager method getDependenciesToEnable.
private PluginDependencyResult getDependenciesToEnable(final List<Plugin> plugins, final Set<String> marked, final DirectedGraph<String, DefaultEdge> graph, final PluginStatusResolver pluginStatusResolver) {
Set<PluginDependencyInformation> disabledDependencies = new HashSet<PluginDependencyInformation>();
Set<PluginDependencyInformation> unsatisfiedDependencies = new HashSet<PluginDependencyInformation>();
Set<String> argumentPluginIdentifiersSet = getArgumentIdentifiersSet(plugins);
for (Plugin plugin : plugins) {
if (marked.contains(plugin.getIdentifier())) {
continue;
}
marked.add(plugin.getIdentifier());
graph.addVertex(plugin.getIdentifier());
for (PluginDependencyInformation dependencyInfo : plugin.getRequiredPlugins()) {
Plugin requiredPlugin = pluginAccessor.getPlugin(dependencyInfo.getIdentifier());
if (requiredPlugin == null) {
if (!argumentPluginIdentifiersSet.contains(dependencyInfo.getIdentifier())) {
unsatisfiedDependencies.add(dependencyInfo);
}
continue;
}
graph.addVertex(dependencyInfo.getIdentifier());
graph.addEdge(plugin.getIdentifier(), dependencyInfo.getIdentifier());
if (!isPluginDisabled(requiredPlugin, pluginStatusResolver)) {
continue;
}
if (dependencyInfo.contains(requiredPlugin.getVersion())) {
disabledDependencies.add(dependencyInfo);
PluginDependencyResult nextLevelDependencioesResult = getDependenciesToEnable(Collections.singletonList(requiredPlugin), marked, graph, pluginStatusResolver);
if (!nextLevelDependencioesResult.getUnsatisfiedDependencies().isEmpty() || nextLevelDependencioesResult.isCyclic()) {
return nextLevelDependencioesResult;
}
disabledDependencies.addAll(nextLevelDependencioesResult.getDependenciesToEnable());
} else {
unsatisfiedDependencies.add(dependencyInfo);
}
}
}
if (!unsatisfiedDependencies.isEmpty()) {
return PluginDependencyResultImpl.unsatisfiedDependencies(unsatisfiedDependencies);
}
if (disabledDependencies.isEmpty()) {
return PluginDependencyResultImpl.satisfiedDependencies();
}
Iterator<PluginDependencyInformation> dependencyInfoIterator = disabledDependencies.iterator();
while (dependencyInfoIterator.hasNext()) {
if (argumentPluginIdentifiersSet.contains(dependencyInfoIterator.next().getIdentifier())) {
dependencyInfoIterator.remove();
}
}
return PluginDependencyResultImpl.dependenciesToEnable(disabledDependencies);
}
Aggregations