From 7f2fed63ea23b060f9350ec9eda31d151bd372d3 Mon Sep 17 00:00:00 2001
From: Philipp Spohr <spohr.philipp@web.de>
Date: Sun, 27 Aug 2017 23:50:52 +0200
Subject: [PATCH] Finished refactor ... a lot cleaner and flexible now

---
 .../ba/yoshikoWrapper/core/AlgorithmTask.java | 43 +++++++++---------
 .../graphModel/YoshikoCluster.java            | 15 +++++++
 .../graphModel/YoshikoResult.java             |  3 +-
 .../graphModel/YoshikoSolution.java           |  7 +--
 .../ba/yoshikoWrapper/gui/ClusterView.java    | 44 +++++++------------
 .../{SolutionsPanel.java => ResultPanel.java} | 20 ++-------
 .../ba/yoshikoWrapper/gui/SolutionTab.java    | 20 +++++----
 7 files changed, 72 insertions(+), 80 deletions(-)
 create mode 100644 src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoCluster.java
 rename src/main/java/de/hhu/ba/yoshikoWrapper/gui/{SolutionsPanel.java => ResultPanel.java} (83%)

diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/core/AlgorithmTask.java b/src/main/java/de/hhu/ba/yoshikoWrapper/core/AlgorithmTask.java
index d8a8a90..9ce0ad4 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/core/AlgorithmTask.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/core/AlgorithmTask.java
@@ -13,11 +13,10 @@ import org.cytoscape.work.AbstractTask;
 import org.cytoscape.work.TaskMonitor;
 import org.slf4j.Logger;
 
+import de.hhu.ba.yoshikoWrapper.graphModel.YoshikoCluster;
 import de.hhu.ba.yoshikoWrapper.graphModel.YoshikoResult;
 import de.hhu.ba.yoshikoWrapper.graphModel.YoshikoSolution;
-import de.hhu.ba.yoshikoWrapper.gui.ClusterView;
-import de.hhu.ba.yoshikoWrapper.gui.SolutionTab;
-import de.hhu.ba.yoshikoWrapper.gui.SolutionsPanel;
+import de.hhu.ba.yoshikoWrapper.gui.ResultPanel;
 import de.hhu.ba.yoshikoWrapper.logging.YoshikoLogger;
 import de.hhu.ba.yoshikoWrapper.swig.LibraryInterface;
 import de.hhu.ba.yoshikoWrapper.swig.SWIGTYPE_p_std__vectorT_int_t;
@@ -134,6 +133,7 @@ public class AlgorithmTask extends AbstractTask {
 		
 		yoshikoResult.editingCost = LibraryInterface.ClusterEditingSolutions_getTotalCost(result);
 		
+		//Loop over (multiple) solutions
 		for (long i=0;i<numberOfSolutions;i++) {
 			
 			taskMonitor.setStatusMessage("Processing solution "+(i+1)+" of "+numberOfSolutions);
@@ -145,39 +145,40 @@ public class AlgorithmTask extends AbstractTask {
 			
 			//Fetch number of clusters in the solution
 			long numberOfClusters = LibraryInterface.ClusterEditingSolutions_getNumberOfClusters(result, i);
-						
+			
+			//Loop over cluster
 			for (long k=0;k<numberOfClusters;k++) {
-				ClusterView cV = tab.addCluster(k);
-				cV.setTitle((k+1));
+				//Create java instance
+				YoshikoCluster cluster = new YoshikoCluster(k);
 				taskMonitor.setStatusMessage("Processing cluster "+(k+1)+" of "+numberOfClusters);
-				SWIGTYPE_p_std__vectorT_int_t cluster = LibraryInterface.ClusterEditingSolutions_getCluster(solution, i, k);
-				long sizeOfCluster = LibraryInterface.IntVector_size(cluster);
-				cV.setClusterSize(sizeOfCluster);
+				
+				SWIGTYPE_p_std__vectorT_int_t clusterVector = LibraryInterface.ClusterEditingSolutions_getCluster(result, i, k);
+				
+				long sizeOfCluster = LibraryInterface.IntVector_size(clusterVector);
 				for (int l=0;l<sizeOfCluster;l++) { //Unsafe mismatch int long
 					taskMonitor.setStatusMessage("Processing entry "+(l+1)+ " of "+sizeOfCluster);
-					int nodeID = LibraryInterface.IntVector_get(cluster, l);
+					int nodeID = LibraryInterface.IntVector_get(clusterVector, l);
 					CyNode node = nodeMap.indexOf(nodeID); //<<< Another int/long conversion
-					cV.addNode(node);
-					if (node == null) {
-						logger.error("FATAL ERROR: Node was not previously mapped!");
-						return;
-					}
-					net.getRow(node).set(columnName, ""+(k+1));
+					cluster.nodes.add(node);
+					
+					net.getRow(node).set(columnName, ""+(k+1)); //Add Cluster ID in table (Remove in final version?)
 				}
+				solution.cluster.add(cluster);
 			}
 			yoshikoResult.solutions.add(solution);
 		}
 
+		//At this point the C++ objects can be freed, in case that the algorithm terminates beforehand they need to be cleaned-up elsewhere
 		LibraryInterface.delete_LibraryInput(input);
-		LibraryInterface.delete_ClusterEditingSolutions(solution);
+		LibraryInterface.delete_ClusterEditingSolutions(result);
 		
 		//Provide some useful info
-		if (LibraryInterface.ClusterEditingSolutions_isTimedOut(solution)) {
+		if (LibraryInterface.ClusterEditingSolutions_isTimedOut(result)) {
 			throw new Exception(LocalizationManager.get("timedOutMessage"));
 		}
 		
 		//Generate solutionsPanel
-		SolutionsPanel solutionsPanel = new SolutionsPanel(processedSolution);
+		ResultPanel solutionsPanel = new ResultPanel(yoshikoResult);
 
 		//Show solution panel
 		CyCore.registrar.registerService(solutionsPanel,CytoPanelComponent.class, new Properties());
@@ -195,8 +196,8 @@ public class AlgorithmTask extends AbstractTask {
 		if (input != null) {
 			LibraryInterface.delete_LibraryInput(input);
 		}
-		if (solution != null) {
-			LibraryInterface.delete_ClusterEditingSolutions(solution);
+		if (result != null) {
+			LibraryInterface.delete_ClusterEditingSolutions(result);
 		}
 		super.cancel();
 	}
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoCluster.java b/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoCluster.java
new file mode 100644
index 0000000..50d4a29
--- /dev/null
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoCluster.java
@@ -0,0 +1,15 @@
+package de.hhu.ba.yoshikoWrapper.graphModel;
+
+import java.util.ArrayList;
+
+import org.cytoscape.model.CyNode;
+
+public class YoshikoCluster {
+	public long id;
+	public ArrayList<CyNode> nodes;
+	
+	public YoshikoCluster(long id) {
+		this.id = id;
+		this.nodes = new ArrayList<CyNode>();
+	}
+}
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoResult.java b/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoResult.java
index e17301f..455518d 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoResult.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoResult.java
@@ -1,7 +1,6 @@
 package de.hhu.ba.yoshikoWrapper.graphModel;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 
 
 /**Basic data class that represents a CES instance internally. By using this class the C++ resources can be freed upon retrieval.
@@ -15,7 +14,7 @@ public class YoshikoResult {
 
 	
 	public YoshikoResult() {
-		solutions = new ArrayList<YoshikoSolution>;
+		solutions = new ArrayList<YoshikoSolution>();
 	}	
 
 }
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoSolution.java b/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoSolution.java
index 487d7fb..2ff9493 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoSolution.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/graphModel/YoshikoSolution.java
@@ -2,16 +2,13 @@ package de.hhu.ba.yoshikoWrapper.graphModel;
 
 import java.util.ArrayList;
 
-import org.cytoscape.model.CyNetwork;
-
-
 public class YoshikoSolution {
 	
-	public ArrayList<CyNetwork> cluster;
+	public ArrayList<YoshikoCluster> cluster;
 	public int id;
 	
 	public YoshikoSolution() {
-		cluster = new ArrayList<CyNetwork>();
+		cluster = new ArrayList<YoshikoCluster>();
 	}
 	
 }
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ClusterView.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ClusterView.java
index cbbf46d..629289c 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ClusterView.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ClusterView.java
@@ -3,7 +3,6 @@ package de.hhu.ba.yoshikoWrapper.gui;
 import java.awt.Color;
 import java.awt.event.MouseEvent;
 import java.awt.event.MouseListener;
-import java.util.ArrayList;
 import java.util.List;
 
 import javax.swing.BorderFactory;
@@ -19,6 +18,7 @@ import org.cytoscape.view.model.CyNetworkView;
 
 import de.hhu.ba.yoshikoWrapper.core.CyCore;
 import de.hhu.ba.yoshikoWrapper.core.LocalizationManager;
+import de.hhu.ba.yoshikoWrapper.graphModel.YoshikoCluster;
 
 @SuppressWarnings("serial")
 public class ClusterView extends ComfortPanel {
@@ -38,14 +38,16 @@ public class ClusterView extends ComfortPanel {
 	/**Simple array list containing references to the nodes that are represented by this cluster view
 	 * 
 	 */
-	private ArrayList<CyNode> nodes;
+	private YoshikoCluster cluster;
 	
-	public ClusterView() {
+	public ClusterView(YoshikoCluster c) {
+		
+		this.cluster = c;
 		//Swing init
 		this.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS));
 		
-		title = new JLabel("CLUSTERTITLE");
-		clusterSize = new JLabel("CLUSTERLABEL");
+		title = new JLabel(LocalizationManager.get("cluster")+" "+(c.id+1));
+		clusterSize = new JLabel(LocalizationManager.get("clusterSize")+" "+c.nodes.size());
 		
 		this.clusterSubNet = CyCore.networkFactory.createNetwork();
 		this.clusterView = CyCore.networkViewFactory.createNetworkView(this.clusterSubNet); 
@@ -53,32 +55,20 @@ public class ClusterView extends ComfortPanel {
 		this.addAll(title,clusterSize);
 		this.add(Box.createVerticalStrut(4));
 		
+		//Loop over nodes in the cluster and add them to the view
+		for (CyNode n : c.nodes) {
+			this.add(
+					new JLabel(
+						CyCore.cy.getCurrentNetwork().getRow(n).get("name", String.class)
+					)
+				);
+		}
+		
 		this.addMouseListener(mouseListener);
 		
 		this.setBorder(regularBorder);
-		//Other init
-		nodes = new ArrayList<CyNode>();
-	}
-	
-	public void addNode(CyNode node) {
-		this.add(
-			new JLabel(
-				CyCore.cy.getCurrentNetwork().getRow(node).get("name", String.class)
-			)
-		);
-		//Add symbolic link
-		nodes.add(node);
-	}
-	
-	public void setTitle(long x) {
-		this.title.setText(LocalizationManager.get("cluster")+" "+x);
-	}
 
-	public void setClusterSize(long x) {
-		this.clusterSize.setText(LocalizationManager.get("clusterSize")+" "+x);
 	}
-
-
 	
 	private MouseListener mouseListener = new MouseListener() {
 
@@ -94,7 +84,7 @@ public class ClusterView extends ComfortPanel {
 				r.set("selected", false);
 			}
 			//Select nodes corresponding to the cluster
-			for (CyNode n : nodes) {
+			for (CyNode n : cluster.nodes) {
 				CyCore.cy.getCurrentNetwork().getRow(n).set("selected", true);
 			}
 		}
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/SolutionsPanel.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ResultPanel.java
similarity index 83%
rename from src/main/java/de/hhu/ba/yoshikoWrapper/gui/SolutionsPanel.java
rename to src/main/java/de/hhu/ba/yoshikoWrapper/gui/ResultPanel.java
index b67040b..b9a0754 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/SolutionsPanel.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ResultPanel.java
@@ -23,16 +23,15 @@ import de.hhu.ba.yoshikoWrapper.graphModel.YoshikoSolution;
  * Conforms to CY 3.5 by being a CytoPanelComponent which is the norm for "result" panels
  */
 @SuppressWarnings("serial")//Will never be serialized
-public class SolutionsPanel extends ComfortPanel implements CytoPanelComponent{
+public class ResultPanel extends ComfortPanel implements CytoPanelComponent{
 	
 	private final JTabbedPane solutionTabs;
 	private final JLabel costLabel;
 	private final JButton destroyButton;
-	private final JButton metaGraphButton;
 	
 	private final YoshikoResult result;
 		
-	public SolutionsPanel(YoshikoResult result) {
+	public ResultPanel(YoshikoResult result) {
 				
 		this.result = result;
 		
@@ -41,7 +40,7 @@ public class SolutionsPanel extends ComfortPanel implements CytoPanelComponent{
 		//Init subcomponents
 		solutionTabs = new JTabbedPane();
 		for (YoshikoSolution s : result.solutions) {
-			SolutionTab tab = addSolutionTab(s);
+			addSolutionTab(s);
 		}
 
 		costLabel = new JLabel();
@@ -57,16 +56,6 @@ public class SolutionsPanel extends ComfortPanel implements CytoPanelComponent{
 			
 		});
 		
-		metaGraphButton = new JButton(LocalizationManager.get("createMetaGraph"));
-		metaGraphButton.addActionListener(new ActionListener() {
-
-			@Override
-			public void actionPerformed(ActionEvent e) {
-				deleteSolution();
-			}
-			
-		});
-		
 		addAll(costLabel,solutionTabs,destroyButton);
 	}
 	
@@ -86,13 +75,12 @@ public class SolutionsPanel extends ComfortPanel implements CytoPanelComponent{
 		super.setVisible(false);
 	}
 	
-	public SolutionTab addSolutionTab(YoshikoSolution s) {
+	private void addSolutionTab(YoshikoSolution s) {
 		SolutionTab tab = new SolutionTab(s);
 		solutionTabs.add(
 				LocalizationManager.get("solution")+" "+(s.id+1),
 				tab
 		);
-		return tab;
 	}
 
 	public void setCost(double modificationCost) {
diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/SolutionTab.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/SolutionTab.java
index c1b82b1..3bad6d6 100644
--- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/SolutionTab.java
+++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/SolutionTab.java
@@ -4,10 +4,12 @@ import java.awt.Dimension;
 
 import javax.swing.Box;
 import javax.swing.BoxLayout;
+import javax.swing.JButton;
 import javax.swing.JLabel;
 import javax.swing.JScrollPane;
 
 import de.hhu.ba.yoshikoWrapper.core.LocalizationManager;
+import de.hhu.ba.yoshikoWrapper.graphModel.YoshikoCluster;
 import de.hhu.ba.yoshikoWrapper.graphModel.YoshikoSolution;
 
 @SuppressWarnings("serial")
@@ -16,6 +18,7 @@ public class SolutionTab extends ComfortPanel {
 	private final JScrollPane scrollPane;
 	private final ComfortPanel scrollPaneContent;
 	private final JLabel clusterCount;
+	private final JButton createMetaGraph;
 	
 	private final YoshikoSolution solution;
 	
@@ -27,20 +30,19 @@ public class SolutionTab extends ComfortPanel {
 		//init swing components
 		scrollPaneContent = new ComfortPanel();
 		scrollPaneContent.setLayout(new BoxLayout(scrollPaneContent,BoxLayout.Y_AXIS));
+		for (YoshikoCluster c: solution.cluster) {
+			ClusterView clusterView = new ClusterView(c);
+			scrollPaneContent.add(clusterView);
+			scrollPaneContent.add(Box.createVerticalStrut(8));
+		}
 		scrollPane = new JScrollPane(scrollPaneContent);
 
 		scrollPane.setPreferredSize(new Dimension(150,400));
 		
-		clusterCount = new JLabel(LocalizationManager.get("clusterFound")+s.cluster.size());
+		clusterCount = new JLabel(LocalizationManager.get("clusterFound")+" "+s.cluster.size());
+		
+		createMetaGraph = new JButton(LocalizationManager.get("createMetaGraph"));
 		this.addAll(clusterCount,scrollPane);
 	}
 	
-
-	public ClusterView addCluster(long k) {
-		ClusterView clusterView = new ClusterView();
-		scrollPaneContent.add(clusterView);
-		scrollPaneContent.add(Box.createVerticalStrut(8));
-		return clusterView;
-	}
-	
 }
-- 
GitLab