OSDN Git Service

change internal process method, which introducing ExtractionResultSet
[stigmata/stigmata.git] / src / main / java / jp / naist / se / stigmata / ui / swing / RoundRobinComparisonResultPane.java
old mode 100755 (executable)
new mode 100644 (file)
index 13e3647..f4cdda3
@@ -1,12 +1,11 @@
 package jp.naist.se.stigmata.ui.swing;\r
 \r
 /*\r
- * $Id: CompareTablePane.java,v 1.2 2005/01/30 08:41:45 harua-t Exp $\r
+ * $Id$\r
  */\r
 \r
 import java.awt.BorderLayout;\r
 import java.awt.Component;\r
-import java.awt.FlowLayout;\r
 import java.awt.GridLayout;\r
 import java.awt.event.ActionEvent;\r
 import java.awt.event.ActionListener;\r
@@ -15,13 +14,16 @@ import java.awt.event.MouseEvent;
 import java.io.File;\r
 import java.io.IOException;\r
 import java.io.PrintWriter;\r
+import java.net.URL;\r
 import java.util.HashMap;\r
+import java.util.Iterator;\r
 import java.util.Map;\r
 \r
-import javax.swing.BoxLayout;\r
+import javax.swing.Box;\r
 import javax.swing.JButton;\r
-import javax.swing.JComboBox;\r
+import javax.swing.JComponent;\r
 import javax.swing.JLabel;\r
+import javax.swing.JMenuItem;\r
 import javax.swing.JOptionPane;\r
 import javax.swing.JPanel;\r
 import javax.swing.JScrollPane;\r
@@ -31,73 +33,82 @@ import javax.swing.table.DefaultTableModel;
 \r
 import jp.naist.se.stigmata.Birthmark;\r
 import jp.naist.se.stigmata.BirthmarkComparator;\r
-import jp.naist.se.stigmata.BirthmarkContext;\r
+import jp.naist.se.stigmata.BirthmarkEnvironment;\r
 import jp.naist.se.stigmata.BirthmarkSet;\r
-import jp.naist.se.stigmata.CertainPairComparisonResultSet;\r
 import jp.naist.se.stigmata.ComparisonResultSet;\r
-import jp.naist.se.stigmata.RoundRobinComparisonResultSet;\r
+import jp.naist.se.stigmata.ExtractionResultSet;\r
+import jp.naist.se.stigmata.ExtractionTarget;\r
+import jp.naist.se.stigmata.filter.FilteredComparisonResultSet;\r
+import jp.naist.se.stigmata.format.FormatManager;\r
+import jp.naist.se.stigmata.result.CertainPairComparisonResultSet;\r
+import jp.naist.se.stigmata.result.MemoryExtractionResultSet;\r
+import jp.naist.se.stigmata.result.RoundRobinComparisonResultSet;\r
 import jp.naist.se.stigmata.spi.ResultFormatSpi;\r
+import jp.naist.se.stigmata.ui.swing.actions.SaveAction;\r
+import jp.naist.se.stigmata.ui.swing.actions.UpdateBirthmarkCellColorAction;\r
+import jp.naist.se.stigmata.utils.AsciiDataWritable;\r
 \r
 /**\r
  * \r
  * @author Haruaki TAMADA\r
  * @version $Revision$ $Date$\r
  */\r
-public class RoundRobinComparisonResultPane extends JPanel implements BirthmarkDataWritable{\r
+public class RoundRobinComparisonResultPane extends JPanel{\r
     private static final long serialVersionUID = 2134574576543623L;\r
 \r
-    private BirthmarkSet[] birthmarksX;\r
-\r
-    private BirthmarkSet[] birthmarksY;\r
-\r
+    private ExtractionResultSet extraction;\r
+    // private List<BirthmarkSet> birthmarksX;\r
+    // private List<BirthmarkSet> birthmarksY;\r
     private JTable table;\r
-\r
     private DefaultTableModel model;\r
-\r
     private JLabel classCount, comparisonCount, distinctionRatio;\r
-\r
     private JLabel average, minimum, maximum;\r
-\r
     private StigmataFrame stigmataFrame;\r
+    // private BirthmarkEnvironment environment;\r
 \r
-    private BirthmarkContext context;\r
-\r
-    public RoundRobinComparisonResultPane(StigmataFrame stigmata, BirthmarkContext context,\r
-            BirthmarkSet[] birthmarksX, BirthmarkSet[] birthmarksY){\r
+    public RoundRobinComparisonResultPane(StigmataFrame stigmata, ExtractionResultSet resultset){\r
         this.stigmataFrame = stigmata;\r
-        this.context = context;\r
-        this.birthmarksX = birthmarksX;\r
-        this.birthmarksY = birthmarksY;\r
-\r
+        this.extraction = resultset;\r
         initialize();\r
         compare(model);\r
     }\r
 \r
-    public void writeData(PrintWriter out, ResultFormatSpi service){\r
-        service.getComparisonResultFormat().printResult(out,\r
-                new RoundRobinComparisonResultSet(birthmarksX, birthmarksY, context));\r
+    @Deprecated\r
+    public RoundRobinComparisonResultPane(StigmataFrame stigmata, BirthmarkEnvironment environment,\r
+                                          BirthmarkSet[] birthmarksX, BirthmarkSet[] birthmarksY){\r
+        this.stigmataFrame = stigmata;\r
+\r
+        initialize();\r
+        compare(model);\r
     }\r
 \r
     private void compare(DefaultTableModel model){\r
-        int comparison = birthmarksX.length * birthmarksY.length;\r
+        int countX = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_X);\r
+        int countY = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_Y);\r
+        int comparisonCount = countX * countY;\r
 \r
-        classCount.setText(Integer.toString(birthmarksX.length + birthmarksY.length));\r
-        comparisonCount.setText(Integer.toString(comparison));\r
+        classCount.setText(Integer.toString(countX + countY));\r
+        this.comparisonCount.setText(Integer.toString(comparisonCount));\r
         int correct = 0;\r
         double avg = 0d;\r
         double max = 0d;\r
         double min = 100d;\r
-        model.addColumn(""); //$NON-NLS-1$\r
-        for(BirthmarkSet x: birthmarksX){\r
-            model.addColumn(x.getClassName());\r
+        model.addColumn("");\r
+        for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_X); i.hasNext(); ){\r
+            BirthmarkSet x = i.next();\r
+            model.addColumn(x.getName());\r
         }\r
-        for(int j = 0; j < birthmarksY.length; j++){\r
-            Object[] rows = new Object[birthmarksX.length + 1];\r
-            rows[0] = birthmarksY[j].getClassName();\r
-\r
-            for(int i = 0; i < birthmarksX.length; i++){\r
-                double similarity = compare(context, birthmarksX[i], birthmarksY[j]);\r
-                rows[i + 1] = new Double(similarity);\r
+        int sizeX = extraction.getBirthmarkSetSize(ExtractionTarget.TARGET_X);\r
+        for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); i.hasNext(); ){\r
+            Object[] rows = new Object[sizeX + 1];\r
+            BirthmarkSet setY = i.next();\r
+            rows[0] = setY.getName();\r
+\r
+            int index = 0;\r
+            for(Iterator<BirthmarkSet> j = extraction.birthmarkSets(ExtractionTarget.TARGET_X); j.hasNext(); ){\r
+                BirthmarkSet setX = j.next();\r
+                double similarity = compare(setX, setY, extraction.getEnvironment());\r
+                rows[index + 1] = new Double(similarity);\r
 \r
                 if(Math.abs(similarity - 1) < 1E-8){\r
                     correct += 1;\r
@@ -105,18 +116,20 @@ public class RoundRobinComparisonResultPane extends JPanel implements BirthmarkD
                 avg += similarity;\r
                 if(max < similarity) max = similarity;\r
                 if(min > similarity) min = similarity;\r
+                index++;\r
             }\r
             model.addRow(rows);\r
         }\r
-        distinctionRatio.setText(Double.toString((double)(comparison - correct)\r
-                / (double)comparison));\r
-        avg = avg / comparison;\r
+        distinctionRatio.setText(\r
+            Double.toString((double)(comparisonCount - correct) / (double)comparisonCount)\r
+        );\r
+        avg = avg / comparisonCount;\r
         average.setText(Double.toString(avg));\r
         minimum.setText(Double.toString(min));\r
         maximum.setText(Double.toString(max));\r
     }\r
 \r
-    private double compare(BirthmarkContext context, BirthmarkSet x, BirthmarkSet y){\r
+    private double compare(BirthmarkSet x, BirthmarkSet y, BirthmarkEnvironment environment){\r
         double similarity = 0d;\r
         int count = 0;\r
 \r
@@ -124,9 +137,9 @@ public class RoundRobinComparisonResultPane extends JPanel implements BirthmarkD
             Birthmark b1 = x.getBirthmark(type);\r
             Birthmark b2 = y.getBirthmark(type);\r
             if(b1 != null && b2 != null){\r
-                BirthmarkComparator comparator = context.getService(type).getComparator();\r
+                BirthmarkComparator comparator = environment.getService(type).getComparator();\r
                 double result = comparator.compare(b1, b2);\r
-                if(result != Double.NaN){\r
+                if(!Double.isNaN(result)){\r
                     similarity += result;\r
                     count++;\r
                 }\r
@@ -141,7 +154,7 @@ public class RoundRobinComparisonResultPane extends JPanel implements BirthmarkD
 \r
         model = new RoundRobinComparisonResultSetTableModel();\r
         table = new JTable(model);\r
-        table.setDefaultRenderer(Double.class, new CompareTableCellRenderer());\r
+        table.setDefaultRenderer(Double.class, new CompareTableCellRenderer(extraction.getEnvironment()));\r
         table.addMouseListener(new MouseAdapter(){\r
             public void mouseClicked(MouseEvent e){\r
                 if(e.getClickCount() == 2){\r
@@ -149,10 +162,10 @@ public class RoundRobinComparisonResultPane extends JPanel implements BirthmarkD
                     int col = table.columnAtPoint(e.getPoint());\r
                     if(col >= 1 && col < table.getColumnCount() && row >= 0\r
                             && row < table.getRowCount()){\r
-                        BirthmarkSet b1 = birthmarksX[col - 1];\r
-                        BirthmarkSet b2 = birthmarksY[row];\r
+                        BirthmarkSet b1 = extraction.getBirthmarkSet(ExtractionTarget.TARGET_X, col - 1);\r
+                        BirthmarkSet b2 = extraction.getBirthmarkSet(ExtractionTarget.TARGET_Y, row);\r
 \r
-                        stigmataFrame.compareDetails(b1, b2, context);\r
+                        stigmataFrame.compareDetails(b1, b2, extraction.getContext());\r
                     }\r
                 }\r
             }\r
@@ -163,34 +176,49 @@ public class RoundRobinComparisonResultPane extends JPanel implements BirthmarkD
         scroll.setViewportView(table);\r
         scroll.setWheelScrollingEnabled(true);\r
         panel.add(scroll, BorderLayout.CENTER);\r
-        JPanel south = new JPanel();\r
-        south.setLayout(new BoxLayout(south, BoxLayout.Y_AXIS));\r
+        JComponent south = Box.createVerticalBox();\r
         JPanel box1 = new JPanel(new GridLayout(1, 3));\r
         box1.add(classCount = new JLabel());\r
         box1.add(comparisonCount = new JLabel());\r
         box1.add(distinctionRatio = new JLabel());\r
         south.add(box1);\r
         JPanel box2 = new JPanel(new GridLayout(1, 3));\r
-        box2.setBorder(new TitledBorder(Messages.getString("similarity.border"))); //$NON-NLS-1$\r
+        box2.setBorder(new TitledBorder(Messages.getString("similarity.border")));\r
         box2.add(average = new JLabel());\r
         box2.add(minimum = new JLabel());\r
         box2.add(maximum = new JLabel());\r
         south.add(box2);\r
 \r
-        classCount.setBorder(new TitledBorder(Messages.getString("numberofclasses.border"))); //$NON-NLS-1$\r
-        comparisonCount.setBorder(new TitledBorder(Messages.getString("comparisoncount.border"))); //$NON-NLS-1$\r
-        distinctionRatio.setBorder(new TitledBorder(Messages.getString("distinctionratio.border"))); //$NON-NLS-1$\r
-        average.setBorder(new TitledBorder(Messages.getString("average.border"))); //$NON-NLS-1$\r
-        minimum.setBorder(new TitledBorder(Messages.getString("minimum.border"))); //$NON-NLS-1$\r
-        maximum.setBorder(new TitledBorder(Messages.getString("maximum.border"))); //$NON-NLS-1$\r
+        classCount.setBorder(new TitledBorder(Messages.getString("numberofclasses.border")));\r
+        comparisonCount.setBorder(new TitledBorder(Messages.getString("comparisoncount.border")));\r
+        distinctionRatio.setBorder(new TitledBorder(Messages.getString("distinctionratio.border")));\r
+        average.setBorder(new TitledBorder(Messages.getString("average.border")));\r
+        minimum.setBorder(new TitledBorder(Messages.getString("minimum.border")));\r
+        maximum.setBorder(new TitledBorder(Messages.getString("maximum.border")));\r
 \r
         panel.add(south, BorderLayout.SOUTH);\r
 \r
         return panel;\r
     }\r
 \r
-    private void saveButtonActionPerformed(ActionEvent e){\r
-        stigmataFrame.saveAction(this);\r
+    private void mdsButtonActionPerformed(ActionEvent e){\r
+        Map<URL, BirthmarkSet> map = new HashMap<URL, BirthmarkSet>();\r
+        for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_X); i.hasNext(); ){\r
+            BirthmarkSet bs = i.next();\r
+            map.put(bs.getLocation(), bs);\r
+        }\r
+        for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); i.hasNext(); ){\r
+            BirthmarkSet bs = i.next();\r
+            map.put(bs.getLocation(), bs);\r
+        }\r
+        int index = 0;\r
+        BirthmarkSet[] set = new BirthmarkSet[map.size()];\r
+        for(Map.Entry<URL, BirthmarkSet> entry: map.entrySet()){\r
+            set[index] = entry.getValue();\r
+            index++;\r
+        }\r
+        \r
+        stigmataFrame.showMDSGraph(set, extraction.getContext());\r
     }\r
 \r
     private void graphButtonActionPerformed(ActionEvent e){\r
@@ -207,90 +235,154 @@ public class RoundRobinComparisonResultPane extends JPanel implements BirthmarkD
                 values.put(new Integer(similarity), dist);\r
             }\r
         }\r
-        stigmataFrame.showGraph(values);\r
+        stigmataFrame.showSimilarityDistributionGraph(values);\r
     }\r
 \r
     private void initialize(){\r
-        JButton save = Utility.createButton("savecomparison"); //$NON-NLS-1$\r
-        JButton graph = Utility.createButton("showgraph"); //$NON-NLS-1$\r
-        JButton obfuscate = Utility.createButton("obfuscate"); //$NON-NLS-1$\r
-        JButton compare = Utility.createButton("compare"); //$NON-NLS-1$\r
-        final JComboBox combo = new JComboBox();\r
-        JPanel southPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));\r
+        JButton save = Utility.createButton(\r
+            "savecomparison", new SaveAction(stigmataFrame, new AsciiDataWritable(){\r
+                public void writeAsciiData(PrintWriter out, String format){\r
+                    ResultFormatSpi service = FormatManager.getInstance().getService(format);\r
+                    if(service == null){\r
+                        service = FormatManager.getDefaultFormatService();\r
+                    }\r
 \r
-        String[] comparisonMethods = Messages.getStringArray("comparison.methods.inroundrobinresult");\r
-        for(int i = 0; i < comparisonMethods.length; i++){\r
-            combo.addItem(comparisonMethods[i]);\r
-        }\r
+                    service.getComparisonResultFormat().printResult(\r
+                        out, new RoundRobinComparisonResultSet(extraction)\r
+                    );\r
+                }\r
+            }\r
+        ));\r
+        JButton graph = Utility.createButton("showgraph");\r
+        JButton obfuscate = Utility.createButton("obfuscate");\r
+        JButton compare = Utility.createButton("guessedpair");\r
+        JButton updateColor = Utility.createButton(\r
+            "updatecellcolor", new UpdateBirthmarkCellColorAction(this, extraction.getEnvironment())\r
+        );\r
+        JMenuItem mdsMenu = Utility.createJMenuItem("mdsmap");\r
+\r
+        PopupButton comparePopup = new PopupButton(compare);\r
+        PopupButton graphPopup = new PopupButton(graph);\r
+\r
+        JComponent southPanel = Box.createHorizontalBox();\r
 \r
         setLayout(new BorderLayout());\r
         add(getMainPane(), BorderLayout.CENTER);\r
         add(southPanel, BorderLayout.SOUTH);\r
+        southPanel.add(Box.createHorizontalGlue());\r
         southPanel.add(save);\r
-        southPanel.add(graph);\r
+        southPanel.add(Box.createHorizontalGlue());\r
+        southPanel.add(updateColor);\r
+        southPanel.add(Box.createHorizontalGlue());\r
+        southPanel.add(graphPopup);\r
+        southPanel.add(Box.createHorizontalGlue());\r
         southPanel.add(obfuscate);\r
-        southPanel.add(compare);\r
-        southPanel.add(combo);\r
+        southPanel.add(Box.createHorizontalGlue());\r
+        southPanel.add(comparePopup);\r
+        southPanel.add(Box.createHorizontalGlue());\r
 \r
-        save.addActionListener(new ActionListener(){\r
+        graph.addActionListener(new ActionListener(){\r
             public void actionPerformed(ActionEvent e){\r
-                saveButtonActionPerformed(e);\r
+                graphButtonActionPerformed(e);\r
             }\r
         });\r
-\r
-        graph.addActionListener(new ActionListener(){\r
+        mdsMenu.addActionListener(new ActionListener(){\r
             public void actionPerformed(ActionEvent e){\r
-                graphButtonActionPerformed(e);\r
+                mdsButtonActionPerformed(e);\r
             }\r
         });\r
+\r
         obfuscate.addActionListener(new ActionListener(){\r
             public void actionPerformed(ActionEvent e){\r
                 obfuscateClassNames();\r
             }\r
         });\r
 \r
-        compare.addActionListener(new ActionListener(){\r
+        ActionListener compareListener = new ActionListener(){\r
             public void actionPerformed(ActionEvent e){\r
-                String item = (String)combo.getSelectedItem();\r
-                if(item.equals(Messages.getString("guessedpair.label"))){\r
+                String item = e.getActionCommand();\r
+                if(item.equals("guessedpair")){\r
                     compareGuessedPair();\r
                 }\r
-                else if(item.equals(Messages.getString("specifiedpair.label"))){\r
+                else if(item.equals("specifiedpair")){\r
                     compareSpecifiedPair();\r
                 }\r
+                else if(item.equals("roundrobin.filtering")){\r
+                    compareRoundRobinWithFiltering();\r
+                }\r
             }\r
-        });\r
+        };\r
+\r
+        compare.addActionListener(compareListener);\r
+        String[] comparisonMethods = Messages.getStringArray("comparison.methods.inroundrobinresult");\r
+        for(int i = 1; i < comparisonMethods.length; i++){\r
+            JMenuItem item = Utility.createJMenuItem(comparisonMethods[i]);\r
+            comparePopup.addMenuItem(item);\r
+            item.addActionListener(compareListener);\r
+        }\r
+        graphPopup.addMenuItem(mdsMenu);\r
+    }\r
+\r
+    private void compareRoundRobinWithFiltering(){\r
+        FilterSelectionPane pane = new FilterSelectionPane(\r
+            extraction.getEnvironment().getFilterManager()\r
+        );\r
+        int returnValue = JOptionPane.showConfirmDialog(\r
+            stigmataFrame, pane, Messages.getString("filterselection.dialog.title"),\r
+            JOptionPane.OK_CANCEL_OPTION,\r
+            JOptionPane.QUESTION_MESSAGE\r
+        );\r
+        if(returnValue == JOptionPane.OK_OPTION){\r
+            String[] filterSetList = pane.getSelectedFilters();\r
+\r
+            ComparisonResultSet rs = new RoundRobinComparisonResultSet(extraction);\r
+            \r
+            ComparisonResultSet filterResultSet = new FilteredComparisonResultSet(\r
+                rs, extraction.getEnvironment().getFilterManager().getFilterSets(filterSetList)\r
+            );\r
+            stigmataFrame.showComparisonResultSet(filterResultSet);\r
+        }\r
     }\r
 \r
     private void compareGuessedPair(){\r
-        ComparisonResultSet resultset = new CertainPairComparisonResultSet(birthmarksX, birthmarksY, context);\r
-        stigmataFrame.showComparisonResultSet(resultset);\r
+        ComparisonResultSet rs = new CertainPairComparisonResultSet(extraction);\r
+        stigmataFrame.showComparisonResultSet(rs);\r
     }\r
 \r
     private void compareSpecifiedPair(){\r
-        File file = stigmataFrame.getOpenFile(Messages.getStringArray("comparemapping.extension"), Messages.getString("comparemapping.description"));\r
+        File file = stigmataFrame.getOpenFile(\r
+            Messages.getStringArray("comparemapping.extension"),\r
+            Messages.getString("comparemapping.description")\r
+        );\r
         if(file != null){\r
             Map<String, String> mapping = stigmataFrame.constructMapping(file);\r
-            \r
-            ComparisonResultSet resultset = new CertainPairComparisonResultSet(birthmarksX, birthmarksY, mapping, context); \r
-            stigmataFrame.showComparisonResultSet(resultset);\r
+\r
+            ComparisonResultSet comparison = new CertainPairComparisonResultSet(extraction, mapping);\r
+            stigmataFrame.showComparisonResultSet(comparison);\r
         }\r
     }\r
 \r
     private void obfuscateClassNames(){\r
         ClassNameObfuscator obfuscator = new ClassNameObfuscator();\r
 \r
-        for(int i = 0; i < birthmarksX.length; i++){\r
-            birthmarksX[i] = obfuscator.obfuscateClassName(birthmarksX[i]);\r
-        }\r
-        for(int i = 0; i < birthmarksY.length; i++){\r
-            birthmarksY[i] = obfuscator.obfuscateClassName(birthmarksY[i]);\r
-        }\r
-\r
         try{\r
-            File file = stigmataFrame.getSaveFile(Messages.getStringArray("obfuscationmapping.extension"),\r
-                    Messages.getString("obfuscationmapping.description"));\r
-            obfuscator.outputNameMappings(file);\r
+            File file = stigmataFrame.getSaveFile(\r
+                Messages.getStringArray("obfuscationmapping.extension"),\r
+                Messages.getString("obfuscationmapping.description")\r
+            );\r
+            if(file != null){\r
+                ExtractionResultSet ers = new MemoryExtractionResultSet(extraction.getContext(), extraction.isTableType());\r
+                for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_X); i.hasNext(); ){\r
+                    BirthmarkSet bs = i.next();\r
+                    ers.addBirthmarkSet(ExtractionTarget.TARGET_X, obfuscator.obfuscateClassName(bs));\r
+                }\r
+                for(Iterator<BirthmarkSet> i = extraction.birthmarkSets(ExtractionTarget.TARGET_Y); i.hasNext(); ){\r
+                    BirthmarkSet bs = i.next();\r
+                    ers.addBirthmarkSet(ExtractionTarget.TARGET_Y, obfuscator.obfuscateClassName(bs));\r
+                }\r
+                this.extraction = ers;\r
+                obfuscator.outputNameMappings(file);\r
+            }\r
         }catch(IOException e){\r
             JOptionPane.showMessageDialog(this, e.getMessage(), Messages\r
                     .getString("error.dialog.title"), JOptionPane.ERROR_MESSAGE);\r