diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/CyActivator.java b/src/main/java/de/hhu/ba/yoshikoWrapper/CyActivator.java index 507a0bfb2985b6404ed1ea2ae54718d413ec6b39..82ae5ea73b193238f2f624ad9f77aa92a97e65fd 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 7fb128424d4b5922e08200058cf02885a9048315..e910feb81a7cb62139861ed42ab3f9aeb684eedf 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 0000000000000000000000000000000000000000..47fac47bd1342b3cdda37ab605ca00b4deb44e83 --- /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 6744a35ae3980ffe826ed6161ad7ecda2961c028..f87c73981536d8b1dc260540794c851a1268d658 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 ac0b3fbbaac9cac320d48cab213a95d4e02261ae..f3705081dfdfe04c91e7bc4fb9e53d82dd81a14f 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 9d773a7796479c3d758c9bc4b19244b128f537b0..b919c85a9d2e7916543055251f88a188ff472d25 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