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 68f2e78..f4cdda3
@@ -14,16 +14,16 @@ import java.awt.event.MouseEvent;
 import java.io.File;\r
 import java.io.IOException;\r
 import java.io.PrintWriter;\r
-import java.util.Arrays;\r
+import java.net.URL;\r
 import java.util.HashMap;\r
-import java.util.List;\r
+import java.util.Iterator;\r
 import java.util.Map;\r
 \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
@@ -33,70 +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 List<BirthmarkSet> birthmarksX;\r
-    private List<BirthmarkSet> birthmarksY;\r
+    private ExtractionResultSet extraction;\r
+    // private List<BirthmarkSet> birthmarksX;\r
+    // private List<BirthmarkSet> birthmarksY;\r
     private JTable table;\r
     private DefaultTableModel model;\r
     private JLabel classCount, comparisonCount, distinctionRatio;\r
     private JLabel average, minimum, maximum;\r
     private StigmataFrame stigmataFrame;\r
-    private BirthmarkContext context;\r
+    // private BirthmarkEnvironment environment;\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 = Arrays.asList(birthmarksX);\r
-        this.birthmarksY = Arrays.asList(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(\r
-                birthmarksX.toArray(new BirthmarkSet[birthmarksX.size()]), \r
-                birthmarksY.toArray(new BirthmarkSet[birthmarksY.size()]), context\r
-            )\r
-        );\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.size() * birthmarksY.size();\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.size() + birthmarksY.size()));\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("");\r
-        for(BirthmarkSet x: birthmarksX){\r
-            model.addColumn(x.getClassName());\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.size(); j++){\r
-            Object[] rows = new Object[birthmarksX.size() + 1];\r
-            rows[0] = birthmarksY.get(j).getClassName();\r
-\r
-            for(int i = 0; i < birthmarksX.size(); i++){\r
-                double similarity = compare(context, birthmarksX.get(i), birthmarksY.get(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
@@ -104,19 +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(\r
-            Double.toString((double)(comparison - correct) / (double)comparison)\r
+            Double.toString((double)(comparisonCount - correct) / (double)comparisonCount)\r
         );\r
-        avg = avg / comparison;\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.get(col - 1);\r
-                        BirthmarkSet b2 = birthmarksY.get(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
@@ -170,26 +183,42 @@ public class RoundRobinComparisonResultPane extends JPanel implements BirthmarkD
         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
@@ -206,21 +235,36 @@ 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
-        JComponent southPanel = Box.createHorizontalBox();\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
@@ -228,82 +272,117 @@ public class RoundRobinComparisonResultPane extends JPanel implements BirthmarkD
         southPanel.add(Box.createHorizontalGlue());\r
         southPanel.add(save);\r
         southPanel.add(Box.createHorizontalGlue());\r
-        southPanel.add(graph);\r
+        southPanel.add(updateColor);\r
         southPanel.add(Box.createHorizontalGlue());\r
-        southPanel.add(obfuscate);\r
+        southPanel.add(graphPopup);\r
         southPanel.add(Box.createHorizontalGlue());\r
-        southPanel.add(compare);\r
+        southPanel.add(obfuscate);\r
         southPanel.add(Box.createHorizontalGlue());\r
-        southPanel.add(combo);\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 compareGuessedPair(){\r
-        ComparisonResultSet resultset = new CertainPairComparisonResultSet(\r
-            birthmarksX.toArray(new BirthmarkSet[birthmarksX.size()]), \r
-            birthmarksY.toArray(new BirthmarkSet[birthmarksY.size()]),\r
-            context\r
+    private void compareRoundRobinWithFiltering(){\r
+        FilterSelectionPane pane = new FilterSelectionPane(\r
+            extraction.getEnvironment().getFilterManager()\r
         );\r
-        stigmataFrame.showComparisonResultSet(resultset);\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 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(\r
-                birthmarksX.toArray(new BirthmarkSet[birthmarksX.size()]), \r
-                birthmarksY.toArray(new BirthmarkSet[birthmarksY.size()]),\r
-                mapping, context\r
-            ); \r
-            stigmataFrame.showComparisonResultSet(resultset);\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.size(); i++){\r
-            birthmarksX.set(i, obfuscator.obfuscateClassName(birthmarksX.get(i)));\r
-        }\r
-        for(int i = 0; i < birthmarksY.size(); i++){\r
-            birthmarksY.set(i, obfuscator.obfuscateClassName(birthmarksY.get(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