From b82e37319334c63c9577d7bb87843b4f303b96ac Mon Sep 17 00:00:00 2001 From: Philipp Spohr <spohr.philipp@web.de> Date: Fri, 18 Aug 2017 13:21:25 +0200 Subject: [PATCH] Using Cytoscapes internal "task" system although it's clunky to conform to a "standard cy app" --- .../de/hhu/ba/yoshikoWrapper/CyActivator.java | 18 ++--- .../core/{Core.java => AlgorithmTask.java} | 66 +++++++++++-------- .../de/hhu/ba/yoshikoWrapper/core/CyCore.java | 9 +++ .../ba/yoshikoWrapper/gui/ColumnMapper.java | 10 +-- .../hhu/ba/yoshikoWrapper/gui/MainPanel.java | 23 +++++-- src/main/resources/YoshikoStrings.properties | 3 +- 6 files changed, 78 insertions(+), 51 deletions(-) rename src/main/java/de/hhu/ba/yoshikoWrapper/core/{Core.java => AlgorithmTask.java} (68%) create mode 100644 src/main/java/de/hhu/ba/yoshikoWrapper/core/CyCore.java diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/CyActivator.java b/src/main/java/de/hhu/ba/yoshikoWrapper/CyActivator.java index 507a0bf..82ae5ea 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/CyActivator.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/CyActivator.java @@ -3,22 +3,20 @@ package de.hhu.ba.yoshikoWrapper; import java.util.Properties; import org.cytoscape.application.CyApplicationManager; -import org.cytoscape.application.swing.CyAction; -import org.cytoscape.application.swing.CySwingApplication; import org.cytoscape.application.swing.CytoPanelComponent; import org.cytoscape.service.util.AbstractCyActivator; +import org.cytoscape.work.swing.DialogTaskManager; import org.osgi.framework.BundleContext; import de.hhu.ba.yoshikoWrapper.core.ConfigurationManager; -import de.hhu.ba.yoshikoWrapper.core.Core; +import de.hhu.ba.yoshikoWrapper.core.CyCore; import de.hhu.ba.yoshikoWrapper.core.YoshikoLoader; import de.hhu.ba.yoshikoWrapper.gui.MainPanel; -import de.hhu.ba.yoshikoWrapper.gui.MainPanelAction; import de.hhu.ba.yoshikoWrapper.gui.SolutionsPanel; public class CyActivator extends AbstractCyActivator { - + public CyActivator() { super(); } @@ -38,14 +36,12 @@ public class CyActivator extends AbstractCyActivator { YoshikoLoader.loadLibrary(cm.getProperties().getProperty("pathToYoshiko")); } - CyApplicationManager cyApplicationManager = getService(context, CyApplicationManager.class); - Core.setApplicationManager(cyApplicationManager); - - CySwingApplication cytoscapeDesktopService = getService(context,CySwingApplication.class); - + //Create symbolic links to give other classes access + CyCore.cy = getService(context, CyApplicationManager.class); + CyCore.dialogTaskManager = getService(context, DialogTaskManager.class); //main panel and result panel - MainPanel mainPanel = new MainPanel(); SolutionsPanel solutionsPanel = new SolutionsPanel(); + MainPanel mainPanel = new MainPanel(solutionsPanel); registerService(context,mainPanel,CytoPanelComponent.class, new Properties()); registerService(context,solutionsPanel,CytoPanelComponent.class, new Properties()); } diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/core/Core.java b/src/main/java/de/hhu/ba/yoshikoWrapper/core/AlgorithmTask.java similarity index 68% rename from src/main/java/de/hhu/ba/yoshikoWrapper/core/Core.java rename to src/main/java/de/hhu/ba/yoshikoWrapper/core/AlgorithmTask.java index 7fb1284..e910feb 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/core/Core.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/core/AlgorithmTask.java @@ -1,10 +1,11 @@ package de.hhu.ba.yoshikoWrapper.core; //TODO: ADD LOGGER SYSTEM -import org.cytoscape.application.CyApplicationManager; import org.cytoscape.model.CyColumn; import org.cytoscape.model.CyNetwork; import org.cytoscape.model.CyNode; +import org.cytoscape.work.AbstractTask; +import org.cytoscape.work.TaskMonitor; import org.slf4j.Logger; import de.hhu.ba.yoshikoWrapper.logging.YoshikoLogger; @@ -13,14 +14,23 @@ import de.hhu.ba.yoshikoWrapper.swig.SWIGTYPE_p_std__vectorT_int_t; import de.hhu.ba.yoshikoWrapper.swig.SWIGTYPE_p_yskInput__LibraryInput; import de.hhu.ba.yoshikoWrapper.swig.SWIGTYPE_p_ysk__ClusterEditingSolutions; -public class Core { +public class AlgorithmTask extends AbstractTask { //Symbolic links - private static CyApplicationManager cy; private static Logger logger = YoshikoLogger.getInstance().getLogger(); - public static void performYoshiko( + //Parameters + private double insertionCostDefault; + private double deletionCostDefault; + private CyColumn permanentColumn; + private CyColumn forbiddenColumn; + private CyColumn weightColumn; + private int timeLimit; + private CyNetwork net; + + public AlgorithmTask( + CyNetwork net, int timeLimit, CyColumn weightColumn, CyColumn permanentColumn, @@ -29,10 +39,22 @@ public class Core { double deletionCostDefault ) { + this.net = net; + this.timeLimit = timeLimit; + this.weightColumn = weightColumn; + this.permanentColumn = permanentColumn; + this.forbiddenColumn = forbiddenColumn; + this.insertionCostDefault = insertionCostDefault; + this.deletionCostDefault = deletionCostDefault; + } + + @Override + public void run(TaskMonitor taskMonitor) throws Exception { + taskMonitor.setTitle(LocalizationManager.yoshikoStrings().getString("yoshTask")); + taskMonitor.setProgress(0.0); //Get current network - CyNetwork currentNetwork = cy.getCurrentNetwork(); - if (currentNetwork == null) { - logger.warn("There is no network loaded. You need to load a network first!"); + if (net == null) { + logger.warn("CoreAlgorithm called on a net that is NULL!"); return; } @@ -40,24 +62,27 @@ public class Core { LibraryInterface.setTimeLimit(timeLimit); //Create a node map to identify nodes and eges in the solution - NodeMap nodeMap = new NodeMap(currentNetwork); + NodeMap nodeMap = new NodeMap(net); + taskMonitor.setProgress(0.1); //Generate an input instance from the network SWIGTYPE_p_yskInput__LibraryInput input = NetworkParser.parseNetwork( - currentNetwork, + net, nodeMap, weightColumn, permanentColumn, forbiddenColumn, deletionCostDefault ); - + taskMonitor.setProgress(0.2); + //Set the default value for insertion cost LibraryInterface.LibraryInput_setDefaultInsertionCost(input, insertionCostDefault); //Call Yoshiko <<< Algorithm is performed here SWIGTYPE_p_ysk__ClusterEditingSolutions solutions = LibraryInterface.processLibraryInput(input); - + taskMonitor.setProgress(0.9); + long numberOfSolutions = LibraryInterface.ClusterEditingSolutions_getNumberOfSolutions(solutions); System.out.println("Found: "+numberOfSolutions+" solutions!"); @@ -66,8 +91,8 @@ public class Core { for (long i=0;i<numberOfSolutions;i++) { System.out.println("Processing solution "+(i+1)+" of "+numberOfSolutions); String columnName = "YOSHIKO_SOLUTION_"+(i+1); - currentNetwork.getDefaultNodeTable().deleteColumn(columnName); - currentNetwork.getDefaultNodeTable().createColumn(columnName, String.class, false); + net.getDefaultNodeTable().deleteColumn(columnName); + net.getDefaultNodeTable().createColumn(columnName, String.class, false); long numberOfClusters = LibraryInterface.ClusterEditingSolutions_getNumberOfClusters(solutions, i); for (long k=0;k<numberOfClusters;k++) { System.out.println("Processing cluster "+(k+1)+" of "+numberOfClusters); @@ -81,23 +106,12 @@ public class Core { System.out.println("FATAL ERROR: Node was not previously mapped!"); return; } - currentNetwork.getRow(node).set(columnName, ""+(k+1)); + net.getRow(node).set(columnName, ""+(k+1)); } } } LibraryInterface.delete_LibraryInput(input); + taskMonitor.setProgress(1.0); } - - - //SETTER / GETTER METHODS - - public static void setApplicationManager(CyApplicationManager cyApplicationManager) { - cy = cyApplicationManager; - } - - public static CyApplicationManager getApplicationManager() { - return cy; - } - } diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/core/CyCore.java b/src/main/java/de/hhu/ba/yoshikoWrapper/core/CyCore.java new file mode 100644 index 0000000..47fac47 --- /dev/null +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/core/CyCore.java @@ -0,0 +1,9 @@ +package de.hhu.ba.yoshikoWrapper.core; + +import org.cytoscape.application.CyApplicationManager; +import org.cytoscape.work.swing.DialogTaskManager; + +public class CyCore { + public static CyApplicationManager cy; + public static DialogTaskManager dialogTaskManager; +} diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ColumnMapper.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ColumnMapper.java index 6744a35..f87c739 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ColumnMapper.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/ColumnMapper.java @@ -8,18 +8,15 @@ import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; -import org.cytoscape.application.CyApplicationManager; import org.cytoscape.model.CyColumn; import org.cytoscape.model.CyNetwork; -import de.hhu.ba.yoshikoWrapper.core.Core; +import de.hhu.ba.yoshikoWrapper.core.CyCore; @SuppressWarnings("serial") //will never be serialized public class ColumnMapper extends ComfortPanel{ - //Symbolic links - private CyApplicationManager cy; - + //Swing components private JComboBox<CyColumn> editingCostMapper; private JComboBox<CyColumn> permanentMapper; @@ -33,7 +30,6 @@ public class ColumnMapper extends ComfortPanel{ public ColumnMapper() { this.setLayout(new BoxLayout(this,BoxLayout.Y_AXIS)); - cy = Core.getApplicationManager(); //SWING COMPONENTS editingCostMapper = new JComboBox<CyColumn>(); @@ -64,7 +60,7 @@ public class ColumnMapper extends ComfortPanel{ public void updateValues() { - CyNetwork net = cy.getCurrentNetwork(); + CyNetwork net = CyCore.cy.getCurrentNetwork(); if (net != null) { //Check if a network is loaded diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/MainPanel.java b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/MainPanel.java index ac0b3fb..f370508 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/gui/MainPanel.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/gui/MainPanel.java @@ -13,7 +13,11 @@ import javax.swing.JRadioButton; import org.cytoscape.application.swing.CytoPanelComponent; import org.cytoscape.application.swing.CytoPanelName; -import de.hhu.ba.yoshikoWrapper.core.Core; +import org.cytoscape.work.AbstractTask; +import org.cytoscape.work.TaskIterator; + +import de.hhu.ba.yoshikoWrapper.core.AlgorithmTask; +import de.hhu.ba.yoshikoWrapper.core.CyCore; import de.hhu.ba.yoshikoWrapper.core.YoshikoLoader; /**This class describes the Swing Panel that the user interacts with in cytoscape @@ -41,13 +45,18 @@ public class MainPanel extends ComfortPanel implements CytoPanelComponent { private final JCheckBox useTriangleCutsBox; private final JCheckBox usePartitionCutsBox; - - + //SYMBOLIC LINKS + private final SolutionsPanel solutionsPanel; + /** * Main constructor, creates a new Panel and initializes subcomponents + * @param solPanel */ - public MainPanel() { + public MainPanel(SolutionsPanel solPanel) { + + this.solutionsPanel = solPanel; + //SWING INIT this.setLayout(new BoxLayout(this,BoxLayout.PAGE_AXIS)); //Initialize Swing components @@ -71,7 +80,8 @@ public class MainPanel extends ComfortPanel implements CytoPanelComponent { @Override public void actionPerformed(ActionEvent e) { if (YoshikoLoader.isLibraryLoaded()){ - Core.performYoshiko( + AbstractTask yoshiko = new AlgorithmTask( + CyCore.cy.getCurrentNetwork(), timeLimitSetter.getTimeLimit(), ecPanel.getWeightColumn(), ecPanel.getPermanentColumn(), @@ -79,7 +89,8 @@ public class MainPanel extends ComfortPanel implements CytoPanelComponent { ecPanel.getDefaultInsertionCost(), ecPanel.getDefaultDeletionCost() ); - + CyCore.dialogTaskManager.execute(new TaskIterator(1,yoshiko)); + solutionsPanel.setVisible(true); } } diff --git a/src/main/resources/YoshikoStrings.properties b/src/main/resources/YoshikoStrings.properties index 9d773a7..b919c85 100644 --- a/src/main/resources/YoshikoStrings.properties +++ b/src/main/resources/YoshikoStrings.properties @@ -1,3 +1,4 @@ resultsPanelTitle = Yoshiko Results yoshVersion = Yoshiko Version -resolveLibPath = Resolve Yoshiko Library Path \ No newline at end of file +resolveLibPath = Resolve Yoshiko Library Path +yoshTask = Performing Yoshiko Algorithm \ No newline at end of file -- GitLab