diff --git a/core/src/main/groovy/com/muwire/core/Core.groovy b/core/src/main/groovy/com/muwire/core/Core.groovy index b984c019..58b7fd62 100644 --- a/core/src/main/groovy/com/muwire/core/Core.groovy +++ b/core/src/main/groovy/com/muwire/core/Core.groovy @@ -84,6 +84,7 @@ public class Core { private final DownloadManager downloadManager private final DirectoryWatcher directoryWatcher final FileManager fileManager + final UploadManager uploadManager private final Router router @@ -256,7 +257,7 @@ public class Core { eventBus.register(UIDownloadResumedEvent.class, downloadManager) log.info("initializing upload manager") - UploadManager uploadManager = new UploadManager(eventBus, fileManager, meshManager, downloadManager) + uploadManager = new UploadManager(eventBus, fileManager, meshManager, downloadManager) log.info("initializing connection establisher") connectionEstablisher = new ConnectionEstablisher(eventBus, i2pConnector, props, connectionManager, hostCache) diff --git a/gui/griffon-app/conf/Config.groovy b/gui/griffon-app/conf/Config.groovy index 4d539f15..16ae3915 100644 --- a/gui/griffon-app/conf/Config.groovy +++ b/gui/griffon-app/conf/Config.groovy @@ -26,4 +26,14 @@ mvcGroups { view = 'com.muwire.gui.OptionsView' controller = 'com.muwire.gui.OptionsController' } + "mu-wire-status" { + model = 'com.muwire.gui.MuWireStatusModel' + view = 'com.muwire.gui.MuWireStatusView' + controller = 'com.muwire.gui.MuWireStatusController' + } + 'i-2-p-status' { + model = 'com.muwire.gui.I2PStatusModel' + view = 'com.muwire.gui.I2PStatusView' + controller = 'com.muwire.gui.I2PStatusController' + } } diff --git a/gui/griffon-app/controllers/com/muwire/gui/I2PStatusController.groovy b/gui/griffon-app/controllers/com/muwire/gui/I2PStatusController.groovy new file mode 100644 index 00000000..d20ec0ed --- /dev/null +++ b/gui/griffon-app/controllers/com/muwire/gui/I2PStatusController.groovy @@ -0,0 +1,18 @@ +package com.muwire.gui + +import griffon.core.artifact.GriffonController +import griffon.core.controller.ControllerAction +import griffon.inject.MVCMember +import griffon.metadata.ArtifactProviderFor +import javax.annotation.Nonnull + +@ArtifactProviderFor(GriffonController) +class I2PStatusController { + @MVCMember @Nonnull + I2PStatusModel model + + @ControllerAction + void click() { + model.clickCount++ + } +} \ No newline at end of file diff --git a/gui/griffon-app/controllers/com/muwire/gui/MuWireStatusController.groovy b/gui/griffon-app/controllers/com/muwire/gui/MuWireStatusController.groovy new file mode 100644 index 00000000..9aa4457a --- /dev/null +++ b/gui/griffon-app/controllers/com/muwire/gui/MuWireStatusController.groovy @@ -0,0 +1,45 @@ +package com.muwire.gui + +import griffon.core.artifact.GriffonController +import griffon.core.controller.ControllerAction +import griffon.inject.MVCMember +import griffon.metadata.ArtifactProviderFor +import javax.annotation.Nonnull + +import com.muwire.core.Core + +@ArtifactProviderFor(GriffonController) +class MuWireStatusController { + @MVCMember @Nonnull + MuWireStatusModel model + @MVCMember @Nonnull + MuWireStatusView view + + @ControllerAction + void refresh() { + Core core = application.context.get("core") + + int incoming = 0 + int outgoing = 0 + core.connectionManager.getConnections().each { + if (it.incoming) + incoming++ + else + outgoing++ + } + model.incomingConnections = incoming + model.outgoingConnections = outgoing + + model.knownHosts = core.hostCache.hosts.size() + + model.sharedFiles = core.fileManager.fileToSharedFile.size() + + model.downloads = core.downloadManager.downloaders.size() + } + + @ControllerAction + void close() { + view.dialog.setVisible(false) + mvcGroup.destroy() + } +} \ No newline at end of file diff --git a/gui/griffon-app/models/com/muwire/gui/I2PStatusModel.groovy b/gui/griffon-app/models/com/muwire/gui/I2PStatusModel.groovy new file mode 100644 index 00000000..3012fc37 --- /dev/null +++ b/gui/griffon-app/models/com/muwire/gui/I2PStatusModel.groovy @@ -0,0 +1,10 @@ +package com.muwire.gui + +import griffon.core.artifact.GriffonModel +import griffon.transform.Observable +import griffon.metadata.ArtifactProviderFor + +@ArtifactProviderFor(GriffonModel) +class I2PStatusModel { + @Observable int clickCount = 0 +} \ No newline at end of file diff --git a/gui/griffon-app/models/com/muwire/gui/MuWireStatusModel.groovy b/gui/griffon-app/models/com/muwire/gui/MuWireStatusModel.groovy new file mode 100644 index 00000000..0e77eb8b --- /dev/null +++ b/gui/griffon-app/models/com/muwire/gui/MuWireStatusModel.groovy @@ -0,0 +1,25 @@ +package com.muwire.gui + +import javax.annotation.Nonnull + +import griffon.core.artifact.GriffonModel +import griffon.inject.MVCMember +import griffon.transform.Observable +import griffon.metadata.ArtifactProviderFor + +@ArtifactProviderFor(GriffonModel) +class MuWireStatusModel { + + @MVCMember @Nonnull + MuWireStatusController controller + + @Observable int incomingConnections + @Observable int outgoingConnections + @Observable int knownHosts + @Observable int sharedFiles + @Observable int downloads + + void mvcGroupInit(Map args) { + controller.refresh() + } +} \ No newline at end of file diff --git a/gui/griffon-app/views/com/muwire/gui/I2PStatusView.groovy b/gui/griffon-app/views/com/muwire/gui/I2PStatusView.groovy new file mode 100644 index 00000000..6094dc47 --- /dev/null +++ b/gui/griffon-app/views/com/muwire/gui/I2PStatusView.groovy @@ -0,0 +1,31 @@ +package com.muwire.gui + +import griffon.core.artifact.GriffonView +import griffon.inject.MVCMember +import griffon.metadata.ArtifactProviderFor +import javax.swing.SwingConstants +import javax.annotation.Nonnull + +@ArtifactProviderFor(GriffonView) +class I2PStatusView { + @MVCMember @Nonnull + FactoryBuilderSupport builder + @MVCMember @Nonnull + I2PStatusModel model + + void initUI() { + builder.with { + application(size: [320, 160], id: 'i-2-p-status', + title: application.configuration['application.title'], + iconImage: imageIcon('/griffon-icon-48x48.png').image, + iconImages: [imageIcon('/griffon-icon-48x48.png').image, + imageIcon('/griffon-icon-32x32.png').image, + imageIcon('/griffon-icon-16x16.png').image]) { + gridLayout(rows: 2, cols: 1) + label(id: 'clickLabel', text: bind { model.clickCount }, + horizontalAlignment: SwingConstants.CENTER) + button(id: 'clickButton', clickAction) + } + } + } +} \ No newline at end of file diff --git a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy index ae79ac39..4b057e3f 100644 --- a/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/MainFrameView.groovy @@ -71,6 +71,9 @@ class MainFrameView { menu (text : "Options") { menuItem("Configuration", actionPerformed : {mvcGroup.createMVCGroup("Options")}) } + menu (text : "Status") { + menuItem("MuWire", actionPerformed : {mvcGroup.createMVCGroup("mu-wire-status")}) + } } borderLayout() panel (border: etchedBorder(), constraints : BorderLayout.NORTH) { diff --git a/gui/griffon-app/views/com/muwire/gui/MuWireStatusView.groovy b/gui/griffon-app/views/com/muwire/gui/MuWireStatusView.groovy new file mode 100644 index 00000000..9460ae2c --- /dev/null +++ b/gui/griffon-app/views/com/muwire/gui/MuWireStatusView.groovy @@ -0,0 +1,74 @@ +package com.muwire.gui + +import griffon.core.artifact.GriffonView +import griffon.inject.MVCMember +import griffon.metadata.ArtifactProviderFor + +import javax.swing.JDialog +import javax.swing.JPanel +import javax.swing.SwingConstants + +import com.muwire.core.Core + +import java.awt.BorderLayout +import java.awt.event.WindowAdapter +import java.awt.event.WindowEvent + +import javax.annotation.Nonnull + +@ArtifactProviderFor(GriffonView) +class MuWireStatusView { + @MVCMember @Nonnull + FactoryBuilderSupport builder + @MVCMember @Nonnull + MuWireStatusModel model + + def mainFrame + def dialog + def panel + def buttonsPanel + + void initUI() { + mainFrame = application.windowManager.findWindow("main-frame") + Core core = application.context.get("core") + + dialog = new JDialog(mainFrame, "MuWire Status", true) + + panel = builder.panel { + gridBagLayout() + label(text : "Incoming connections", constraints : gbc(gridx:0, gridy:0)) + label(text : bind {model.incomingConnections}, constraints : gbc(gridx:1, gridy:0)) + label(text : "Outgoing connections", constraints : gbc(gridx:0, gridy:1)) + label(text : bind {model.outgoingConnections}, constraints : gbc(gridx:1, gridy:1)) + label(text : "Known hosts", constraints : gbc(gridx:0, gridy:2)) + label(text : bind {model.knownHosts}, constraints : gbc(gridx:1, gridy:2)) + label(text : "Shared files", constraints : gbc(gridx:0, gridy:3)) + label(text : bind {model.sharedFiles}, constraints : gbc(gridx:1, gridy:3)) + label(text : "Downloads", constraints : gbc(gridx:0, gridy:4)) + label(text : bind {model.downloads}, constraints : gbc(gridx:1, gridy:4)) + } + buttonsPanel = builder.panel { + gridBagLayout() + button(text : "Refresh", constraints: gbc(gridx: 0, gridy: 0), refreshAction) + button(text : "Close", constraints : gbc(gridx : 1, gridy :0), closeAction) + } + } + + void mvcGroupInit(Map args) { + JPanel statusPanel = new JPanel() + statusPanel.setLayout(new BorderLayout()) + statusPanel.add(panel, BorderLayout.CENTER) + statusPanel.add(buttonsPanel, BorderLayout.SOUTH) + + dialog.getContentPane().add(statusPanel) + dialog.pack() + dialog.setLocationRelativeTo(mainFrame) + dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE) + dialog.addWindowListener(new WindowAdapter() { + public void windowClosed(WindowEvent e) { + mvcGroup.destroy() + } + }) + dialog.show() + } +} \ No newline at end of file diff --git a/gui/src/integration-test/groovy/com/muwire/gui/I2PStatusIntegrationTest.groovy b/gui/src/integration-test/groovy/com/muwire/gui/I2PStatusIntegrationTest.groovy new file mode 100644 index 00000000..24fc45a9 --- /dev/null +++ b/gui/src/integration-test/groovy/com/muwire/gui/I2PStatusIntegrationTest.groovy @@ -0,0 +1,25 @@ +package com.muwire.gui + +import griffon.core.test.GriffonFestRule +import org.fest.swing.fixture.FrameFixture +import org.junit.Rule +import org.junit.Test + +import static org.junit.Assert.fail + +class I2PStatusIntegrationTest { + static { + System.setProperty('griffon.swing.edt.violations.check', 'true') + System.setProperty('griffon.swing.edt.hang.monitor', 'true') + } + + @Rule + public final GriffonFestRule fest = new GriffonFestRule() + + private FrameFixture window + + @Test + void smokeTest() { + fail('Not implemented yet!') + } +} diff --git a/gui/src/integration-test/groovy/com/muwire/gui/MuWireStatusIntegrationTest.groovy b/gui/src/integration-test/groovy/com/muwire/gui/MuWireStatusIntegrationTest.groovy new file mode 100644 index 00000000..f3dfde31 --- /dev/null +++ b/gui/src/integration-test/groovy/com/muwire/gui/MuWireStatusIntegrationTest.groovy @@ -0,0 +1,25 @@ +package com.muwire.gui + +import griffon.core.test.GriffonFestRule +import org.fest.swing.fixture.FrameFixture +import org.junit.Rule +import org.junit.Test + +import static org.junit.Assert.fail + +class MuWireStatusIntegrationTest { + static { + System.setProperty('griffon.swing.edt.violations.check', 'true') + System.setProperty('griffon.swing.edt.hang.monitor', 'true') + } + + @Rule + public final GriffonFestRule fest = new GriffonFestRule() + + private FrameFixture window + + @Test + void smokeTest() { + fail('Not implemented yet!') + } +} diff --git a/gui/src/test/groovy/com/muwire/gui/I2PStatusControllerTest.groovy b/gui/src/test/groovy/com/muwire/gui/I2PStatusControllerTest.groovy new file mode 100644 index 00000000..8bead08c --- /dev/null +++ b/gui/src/test/groovy/com/muwire/gui/I2PStatusControllerTest.groovy @@ -0,0 +1,21 @@ +package com.muwire.gui + +import griffon.core.test.GriffonUnitRule +import griffon.core.test.TestFor +import org.junit.Rule +import org.junit.Test + +import static org.junit.Assert.fail + +@TestFor(I2PStatusController) +class I2PStatusControllerTest { + private I2PStatusController controller + + @Rule + public final GriffonUnitRule griffon = new GriffonUnitRule() + + @Test + void smokeTest() { + fail('Not yet implemented!') + } +} \ No newline at end of file diff --git a/gui/src/test/groovy/com/muwire/gui/MuWireStatusControllerTest.groovy b/gui/src/test/groovy/com/muwire/gui/MuWireStatusControllerTest.groovy new file mode 100644 index 00000000..2cd13bb2 --- /dev/null +++ b/gui/src/test/groovy/com/muwire/gui/MuWireStatusControllerTest.groovy @@ -0,0 +1,21 @@ +package com.muwire.gui + +import griffon.core.test.GriffonUnitRule +import griffon.core.test.TestFor +import org.junit.Rule +import org.junit.Test + +import static org.junit.Assert.fail + +@TestFor(MuWireStatusController) +class MuWireStatusControllerTest { + private MuWireStatusController controller + + @Rule + public final GriffonUnitRule griffon = new GriffonUnitRule() + + @Test + void smokeTest() { + fail('Not yet implemented!') + } +} \ No newline at end of file