Skip to content

Commit

Permalink
Plugins that are loaded after Tomighty's startup must have their menu…
Browse files Browse the repository at this point in the history
… items added to the tray menu. To make that possible, a PluginLoaded message is now being published after a plugin is loaded. The actual PluginsLoaded message (that is published once after all plugins are loaded) was removed.
  • Loading branch information
ccidral committed May 13, 2012
1 parent c93284c commit 790570c
Show file tree
Hide file tree
Showing 8 changed files with 76 additions and 60 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.tomighty.bus.messages.plugin;

import org.tomighty.plugin.Plugin;

public class PluginLoaded {

private final Plugin plugin;

public PluginLoaded(Plugin plugin) {
this.plugin = plugin;
}

public Plugin getPlugin() {
return plugin;
}

}
2 changes: 0 additions & 2 deletions tomighty-swing/src/main/java/org/tomighty/Tomighty.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@
import org.slf4j.LoggerFactory;
import org.tomighty.bus.Bus;
import org.tomighty.bus.Subscriber;
import org.tomighty.bus.messages.PluginsLoaded;
import org.tomighty.bus.messages.ui.ChangeUiState;
import org.tomighty.bus.messages.ui.TrayClick;
import org.tomighty.bus.messages.ui.UiStateChanged;
Expand Down Expand Up @@ -74,7 +73,6 @@ public void initialize() {
public void run() {
render(InitialState.class);
pluginManager.loadPluginsFrom(directories.plugins());
bus.publish(new PluginsLoaded());
}

private void render(Class<? extends UiState> stateClass) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.tomighty.bus.Bus;
import org.tomighty.bus.messages.plugin.PluginLoaded;
import org.tomighty.io.Directory;
import org.tomighty.plugin.*;

Expand All @@ -33,13 +35,15 @@ public class DefaultPluginManager implements PluginManager {

private PluginLoader pluginLoader;
private PluginPackFactory pluginPackFactory;
private final Bus bus;

private Set<Plugin> loadedPlugins;

@Inject
public DefaultPluginManager(PluginLoader pluginLoader, PluginPackFactory pluginPackFactory) {
public DefaultPluginManager(PluginLoader pluginLoader, PluginPackFactory pluginPackFactory, Bus bus) {
this.pluginLoader = pluginLoader;
this.pluginPackFactory = pluginPackFactory;
this.bus = bus;

loadedPlugins = new HashSet<Plugin>();
}
Expand All @@ -48,11 +52,12 @@ public DefaultPluginManager(PluginLoader pluginLoader, PluginPackFactory pluginP
public void loadPluginsFrom(Directory directory) {
for (Directory subdirectory : directory.subdirs()) {
PluginPack pluginPack = pluginPackFactory.createFrom(subdirectory);
Plugin plugin = pluginLoader.load(pluginPack);

Plugin loadedPlugin = pluginLoader.load(pluginPack);
loadedPlugins.add(plugin);
log.info("Loaded {} with Version {}", plugin.getPluginName(), plugin.getPluginVersion());

loadedPlugins.add(loadedPlugin);
log.info("Loaded {} with Version {}", loadedPlugin.getPluginName(), loadedPlugin.getPluginVersion());
bus.publish(new PluginLoaded(plugin));
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@
import com.google.inject.Injector;
import org.tomighty.bus.Bus;
import org.tomighty.bus.Subscriber;
import org.tomighty.bus.messages.PluginsLoaded;
import org.tomighty.bus.messages.plugin.PluginLoaded;
import org.tomighty.i18n.Messages;
import org.tomighty.plugin.Plugin;
import org.tomighty.plugin.PluginManager;
import org.tomighty.ui.tray.PluginsMenu;

import javax.annotation.PostConstruct;
Expand All @@ -20,7 +19,6 @@ public class DefaultPluginsMenu implements PluginsMenu {

@Inject private Messages messages;
@Inject private Injector injector;
@Inject private PluginManager pluginManager;
@Inject private Bus bus;

@PostConstruct
Expand All @@ -31,7 +29,7 @@ public void createMenu() {

@PostConstruct
public void addMenuItemsForLoadedPlugins() {
bus.subscribe(new AddMenuItemsForLoadedPlugins(), PluginsLoaded.class);
bus.subscribe(new AddMenuItemForLoadedPlugin(), PluginLoaded.class);
}

@Override
Expand All @@ -45,12 +43,13 @@ private MenuItem menuItem(String text, Class<? extends ActionListener> actionLis
return item;
}

private class AddMenuItemsForLoadedPlugins implements Subscriber<PluginsLoaded> {
private class AddMenuItemForLoadedPlugin implements Subscriber<PluginLoaded> {
@Override
public void receive(final PluginsLoaded message) {
for (Plugin plugin : pluginManager.getLoadedPlugins())
if(plugin.getMenuItem() != null)
menu.add(plugin.getMenuItem());
public void receive(PluginLoaded message) {
Plugin plugin = message.getPlugin();

if(plugin.getMenuItem() != null)
menu.add(plugin.getMenuItem());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ public synchronized void publish(Object message) {
notifyAll();
}

public List<Object> getPublishedMessages() {
return publishedMessages;
}

public synchronized List<Object> waitUntilNumberOfMessagesReach(int numberOfMessages) {
while(publishedMessages.size() < numberOfMessages)
waitQuietly();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,47 +18,62 @@

import org.junit.Before;
import org.junit.Test;
import org.tomighty.bus.messages.plugin.PluginLoaded;
import org.tomighty.io.Directory;
import org.tomighty.mock.bus.MockBus;
import org.tomighty.plugin.impl.DefaultPluginManager;

import java.util.List;

import static java.util.Arrays.asList;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertSame;
import static org.mockito.Mockito.*;

public class LoadAllPluginsFromDirectoryTest {

private PluginManager pluginManager;
private PluginLoader pluginLoader;
private PluginPackFactory pluginPackFactory;
private Directory directory;
private Plugin plugin1;
private Plugin plugin2;
private MockBus bus;

@Before
public void setUp() {
pluginPackFactory = mock(PluginPackFactory.class);
pluginLoader = mock(PluginLoader.class);
pluginManager = new DefaultPluginManager(pluginLoader, pluginPackFactory);
}

@Test
public void loadTwoPlugins() throws Exception {
directory = mock(Directory.class);
plugin1 = mock(Plugin.class);
plugin2 = mock(Plugin.class);

Plugin plugin = mock(Plugin.class);
Directory pluginDirectory1 = mock(Directory.class);
Directory pluginDirectory2 = mock(Directory.class);
when(directory.subdirs()).thenReturn(asList(pluginDirectory1, pluginDirectory2));

PluginPack foo = mock(PluginPack.class);
PluginPack bar = mock(PluginPack.class);
PluginPackFactory pluginPackFactory = mock(PluginPackFactory.class);
PluginPack pluginPack1 = mock(PluginPack.class);
PluginPack pluginPack2 = mock(PluginPack.class);
when(pluginPackFactory.createFrom(pluginDirectory1)).thenReturn(pluginPack1);
when(pluginPackFactory.createFrom(pluginDirectory2)).thenReturn(pluginPack2);

Directory directory = mock(Directory.class);
Directory fooDirectory = mock(Directory.class);
Directory barDirectory = mock(Directory.class);
PluginLoader pluginLoader = mock(PluginLoader.class);
when(pluginLoader.load(pluginPack1)).thenReturn(plugin1);
when(pluginLoader.load(pluginPack2)).thenReturn(plugin2);

when(directory.subdirs()).thenReturn(asList(fooDirectory, barDirectory));
when(pluginPackFactory.createFrom(fooDirectory)).thenReturn(foo);
when(pluginPackFactory.createFrom(barDirectory)).thenReturn(bar);
bus = new MockBus();
pluginManager = new DefaultPluginManager(pluginLoader, pluginPackFactory, bus);
}

when(pluginLoader.load(any(PluginPack.class))).thenReturn(plugin);
@Test
public void loadTwoPlugins() throws Exception {
pluginManager.loadPluginsFrom(directory);

List<Object> publishedMessages = bus.getPublishedMessages();

assertEquals("Two messages were published, one for each loaded plugin", 2, publishedMessages.size());

verify(pluginLoader).load(foo);
verify(pluginLoader).load(bar);
PluginLoaded pluginLoaded1 = (PluginLoaded) publishedMessages.get(0);
PluginLoaded pluginLoaded2 = (PluginLoaded) publishedMessages.get(1);
assertSame("First message contains plugin #1", plugin1, pluginLoaded1.getPlugin());
assertSame("Second message contains plugin #2", plugin2, pluginLoaded2.getPlugin());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

import org.junit.Before;
import org.junit.Test;
import org.tomighty.bus.Bus;
import org.tomighty.io.Directory;
import org.tomighty.io.FileSystemDirectory;
import org.tomighty.plugin.*;
Expand Down Expand Up @@ -68,7 +69,7 @@ public void setUp() throws Exception {
PluginLoader loaderMock = mock(PluginLoader.class);
when(loaderMock.load(any(PluginPack.class))).thenReturn(new PluginStub());

defaultPluginManager = new DefaultPluginManager(loaderMock, pluginPackFactoryMock);
defaultPluginManager = new DefaultPluginManager(loaderMock, pluginPackFactoryMock, mock(Bus.class));
defaultPluginManager.loadPluginsFrom(directoryMock);

}
Expand Down

0 comments on commit 790570c

Please sign in to comment.