diff --git a/src/main/java/fucoin/configurations/GephiConfiguration.java b/src/main/java/fucoin/configurations/GephiConfiguration.java index 3fb495c2ebf20eacf1216a8e5ffa60f5ee8dbf4b..b35ef6ad76b13aaf0ae73f54dde54b69e1174aa4 100644 --- a/src/main/java/fucoin/configurations/GephiConfiguration.java +++ b/src/main/java/fucoin/configurations/GephiConfiguration.java @@ -8,12 +8,14 @@ import fucoin.actions.transaction.ActionGetAmount; import fucoin.actions.transaction.ActionGetAmountAnswer; import fucoin.configurations.internal.ConfigurationName; import fucoin.configurations.internal.GephiLoader; +import fucoin.gui.gephi.GephiFileSelector; import fucoin.gui.gephi.GraphWindow; import org.gephi.graph.api.Graph; import scala.concurrent.Future; import scala.concurrent.duration.Duration; -import java.io.FileNotFoundException; +import java.io.File; +import java.io.IOException; import java.net.URISyntaxException; @ConfigurationName("Gephi Test Configuration") @@ -26,11 +28,14 @@ public class GephiConfiguration extends AbstractConfiguration { initSupervisor(); GephiLoader gephiLoader = new GephiLoader(); + GephiFileSelector fileSelector = new GephiFileSelector(); Graph g; + File selectedTopology; try { - g = gephiLoader.loadFileFromResources("/topology2.gexf"); - } catch (URISyntaxException | FileNotFoundException e) { + selectedTopology = fileSelector.selectTopology(); + g = gephiLoader.loadFile(selectedTopology); + } catch (URISyntaxException | IOException e) { e.printStackTrace(); return; } @@ -38,6 +43,9 @@ public class GephiConfiguration extends AbstractConfiguration { createOverlayNetwork(g); GraphWindow graphWindow = new GraphWindow(); + graphWindow.setDisplayedFilename(selectedTopology.getName()); + graphWindow.setVisible(true); + graphWindow.addNodeClickHandler((node, event) -> { ActorRef wallet = walletByName(node.getLabel()); @@ -51,6 +59,5 @@ public class GephiConfiguration extends AbstractConfiguration { }, context().dispatcher()); }); - graphWindow.setVisible(true); } } diff --git a/src/main/java/fucoin/configurations/internal/GephiLoader.java b/src/main/java/fucoin/configurations/internal/GephiLoader.java index 67f1644888680de97269415c4b6d0bd31988e008..b88f56f707473f2c03cca38f1f6ff0ed0c7e6b51 100644 --- a/src/main/java/fucoin/configurations/internal/GephiLoader.java +++ b/src/main/java/fucoin/configurations/internal/GephiLoader.java @@ -2,7 +2,6 @@ package fucoin.configurations.internal; import org.gephi.graph.api.Graph; import org.gephi.graph.api.GraphController; -import org.gephi.graph.api.Node; import org.gephi.io.importer.api.Container; import org.gephi.io.importer.api.ImportController; import org.gephi.io.processor.plugin.DefaultProcessor; @@ -12,22 +11,28 @@ import org.openide.util.Lookup; import java.io.File; import java.io.FileNotFoundException; -import java.net.URI; import java.net.URISyntaxException; -import java.util.Collection; -/** - * @author davidbohn - */ public class GephiLoader { - Workspace workspace; + private Workspace workspace; + /** + * Load a graph file that is in the resources directory of the application + * + * @throws URISyntaxException + * @throws FileNotFoundException + */ public Graph loadFileFromResources(String path) throws URISyntaxException, FileNotFoundException { - return loadFile(getClass().getResource(path).toURI()); + return loadFile(new File(getClass().getResource(path).toURI())); } - public Graph loadFile(URI filename) throws FileNotFoundException { + /** + * Initialize the Gephi toolkit and load the provided file + * + * @throws FileNotFoundException + */ + public Graph loadFile(File file) throws FileNotFoundException { ProjectController pc = Lookup.getDefault().lookup(ProjectController.class); pc.newProject(); @@ -35,7 +40,6 @@ public class GephiLoader { Container container; ImportController importController = Lookup.getDefault().lookup(ImportController.class); - File file = new File(filename); container = importController.importFile(file); diff --git a/src/main/java/fucoin/gui/gephi/GephiFileSelector.java b/src/main/java/fucoin/gui/gephi/GephiFileSelector.java new file mode 100644 index 0000000000000000000000000000000000000000..d4196a616dbd70baaa0eb30f73df6dadbd9720c9 --- /dev/null +++ b/src/main/java/fucoin/gui/gephi/GephiFileSelector.java @@ -0,0 +1,47 @@ +package fucoin.gui.gephi; + +import javax.swing.*; +import javax.swing.filechooser.FileNameExtensionFilter; +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; +import java.util.stream.Collectors; + +public class GephiFileSelector { + + /** + * Display a file selector to select a gephi graph file + * @return the selected file or the first graph in the resources directory if none selected + * @throws IOException + * @throws URISyntaxException + */ + public File selectTopology() throws IOException, URISyntaxException { + JFileChooser fileChooser = new JFileChooser(new File(getClass().getResource("/").toURI())); + fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + FileNameExtensionFilter fileNameExtensionFilter = new FileNameExtensionFilter("Graph Files", "gexf"); + fileChooser.setFileFilter(fileNameExtensionFilter); + int result = fileChooser.showOpenDialog(null); + + if (result == JFileChooser.APPROVE_OPTION) { + return fileChooser.getSelectedFile(); + } + + return getBundledTopologies().get(0); + } + + /** + * Get a list of all bundled topology files (i.e. that are stored in the resources) + * @throws URISyntaxException + * @throws IOException + */ + public List<File> getBundledTopologies() throws URISyntaxException, IOException { + return Files.list(Paths.get(getClass().getResource("/").toURI())) + .filter(Files::isRegularFile) + .filter(path -> path.toString().toLowerCase().endsWith(".gexf")) + .map(Path::toFile).collect(Collectors.toList()); + } +} diff --git a/src/main/java/fucoin/gui/gephi/GraphWindow.java b/src/main/java/fucoin/gui/gephi/GraphWindow.java index f32bd9a85b3eceb5385f423b57f4bc43d087b324..f69d9c9c96ef887a131ed05dc2afb4651ad7cee5 100644 --- a/src/main/java/fucoin/gui/gephi/GraphWindow.java +++ b/src/main/java/fucoin/gui/gephi/GraphWindow.java @@ -20,10 +20,12 @@ public class GraphWindow extends JFrame implements NodeMouseListener { private JLabel infobarText; + private final String baseWindowTitle = "Network Overlay Graph"; + public GraphWindow() { super(); - setTitle("Network Overlay Graph"); + setTitle(baseWindowTitle); setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); @@ -79,6 +81,10 @@ public class GraphWindow extends JFrame implements NodeMouseListener { this.setSize(800, 600); } + public void setDisplayedFilename(String filename) { + setTitle(baseWindowTitle + " - " + filename); + } + public static boolean isRetina() { GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); final GraphicsDevice device = env.getDefaultScreenDevice(); diff --git a/src/main/java/fucoin/gui/gephi/ItemBuilderTemplate.java b/src/main/java/fucoin/gui/gephi/ItemBuilderTemplate.java index defce3ebbf5c04bd35fd01a24e00c89c3353f5fd..d54941d98e7424b40b94ccf4c76cf52b8aed0016 100644 --- a/src/main/java/fucoin/gui/gephi/ItemBuilderTemplate.java +++ b/src/main/java/fucoin/gui/gephi/ItemBuilderTemplate.java @@ -1,13 +1,10 @@ package fucoin.gui.gephi; -import org.gephi.graph.api.Edge; import org.gephi.graph.api.Graph; -import org.gephi.graph.api.Node; import org.gephi.preview.api.Item; import org.gephi.preview.spi.ItemBuilder; import org.openide.util.lookup.ServiceProvider; -import java.util.Arrays; @ServiceProvider(service = ItemBuilder.class) public class ItemBuilderTemplate implements ItemBuilder {