From c5aa9769b2eb10ecd6ea91d5d5a9274e23347953 Mon Sep 17 00:00:00 2001 From: tama3 Date: Tue, 22 May 2007 08:56:53 +0000 Subject: [PATCH] merge revision 116: mds mapping enabled git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/trunk@117 acee48c3-7b26-0410-bdac-b3d0e5314bbc --- pom.xml | 6 + .../stigmata/CertainPairComparisonResultSet.java | 25 +++ .../jp/naist/se/stigmata/ComparisonResultSet.java | 2 + .../se/stigmata/RoundRobinComparisonResultSet.java | 31 ++- .../filter/FilteredComparisonResultSet.java | 5 + .../ui/swing/BirthmarkExtractionResultPane.java | 1 - .../se/stigmata/ui/swing/ChangeColorAction.java | 64 +++++++ .../jp/naist/se/stigmata/ui/swing/ControlPane.java | 64 ++++--- .../jp/naist/se/stigmata/ui/swing/PopupButton.java | 97 ++++++++++ .../ui/swing/RoundRobinComparisonResultPane.java | 95 ++++++++-- .../ui/swing/SimilarityDistributionGraphPane.java | 43 +---- .../naist/se/stigmata/ui/swing/StigmataFrame.java | 59 +++++- .../swing/graph/MultiDimensionalScalingMethod.java | 101 ++++++++++ .../swing/graph/MultiDimensionalScalingViewer.java | 209 +++++++++++++++++++++ .../se/stigmata/ui/swing/graph/PointComponent.java | 70 +++++++ src/main/resources/resources/images/map.png | Bin 0 -> 804 bytes src/main/resources/resources/messages.properties | 37 +++- .../birthmarks/smc/SmcBirthmarkExtractorTest.java | 44 +++-- .../birthmarks/uc/UCBirthmarkExtractorTest.java | 15 +- 19 files changed, 859 insertions(+), 109 deletions(-) create mode 100755 src/main/java/jp/naist/se/stigmata/ui/swing/ChangeColorAction.java create mode 100755 src/main/java/jp/naist/se/stigmata/ui/swing/PopupButton.java create mode 100755 src/main/java/jp/naist/se/stigmata/ui/swing/graph/MultiDimensionalScalingMethod.java create mode 100755 src/main/java/jp/naist/se/stigmata/ui/swing/graph/MultiDimensionalScalingViewer.java create mode 100755 src/main/java/jp/naist/se/stigmata/ui/swing/graph/PointComponent.java create mode 100755 src/main/resources/resources/images/map.png diff --git a/pom.xml b/pom.xml index 6536719..6d51260 100755 --- a/pom.xml +++ b/pom.xml @@ -59,6 +59,12 @@ compile + Jama + Jama + 1.0.2 + compile + + junit junit 4.1 diff --git a/src/main/java/jp/naist/se/stigmata/CertainPairComparisonResultSet.java b/src/main/java/jp/naist/se/stigmata/CertainPairComparisonResultSet.java index 77c3910..61dd523 100755 --- a/src/main/java/jp/naist/se/stigmata/CertainPairComparisonResultSet.java +++ b/src/main/java/jp/naist/se/stigmata/CertainPairComparisonResultSet.java @@ -4,7 +4,9 @@ package jp.naist.se.stigmata; * $Id$ */ +import java.net.URL; import java.util.ArrayList; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; @@ -20,6 +22,7 @@ import java.util.Map; public class CertainPairComparisonResultSet implements ComparisonResultSet{ private BirthmarkContext context; private List pairList = new ArrayList(); + private Map sources = new HashMap(); /** * This constructor is the comparison pair list is specified. @@ -28,6 +31,8 @@ public class CertainPairComparisonResultSet implements ComparisonResultSet{ this.context = context; for(int i = 0; i < pairs.length; i++){ pairList.add(pairs[i]); + sources.put(pairs[i].getTarget1().getLocation(), pairs[i].getTarget1()); + sources.put(pairs[i].getTarget2().getLocation(), pairs[i].getTarget2()); } } @@ -43,6 +48,8 @@ public class CertainPairComparisonResultSet implements ComparisonResultSet{ pairList.add(new ComparisonPair(targetX[i], target2, context)); } } + addSources(targetX); + addSources(targetY); } /** @@ -67,6 +74,8 @@ public class CertainPairComparisonResultSet implements ComparisonResultSet{ pairList.add(new ComparisonPair(target1, target2, context)); } } + addSources(targetX); + addSources(targetY); } /** @@ -90,6 +99,16 @@ public class CertainPairComparisonResultSet implements ComparisonResultSet{ return pairList.iterator(); } + public BirthmarkSet[] getComparisonSources(){ + BirthmarkSet[] entries = new BirthmarkSet[sources.size()]; + int index = 0; + for(Map.Entry entry: sources.entrySet()){ + entries[index] = entry.getValue(); + index++; + } + return entries; + } + /** * find BirthmarkSet from given array by given class name. */ @@ -101,4 +120,10 @@ public class CertainPairComparisonResultSet implements ComparisonResultSet{ } return null; } + + private void addSources(BirthmarkSet[] bs){ + for(BirthmarkSet s: bs){ + sources.put(s.getLocation(), s); + } + } } diff --git a/src/main/java/jp/naist/se/stigmata/ComparisonResultSet.java b/src/main/java/jp/naist/se/stigmata/ComparisonResultSet.java index a9b0967..0fa1f81 100755 --- a/src/main/java/jp/naist/se/stigmata/ComparisonResultSet.java +++ b/src/main/java/jp/naist/se/stigmata/ComparisonResultSet.java @@ -24,4 +24,6 @@ public interface ComparisonResultSet extends Iterable{ public Iterator iterator(); public int getComparisonCount(); + + public BirthmarkSet[] getComparisonSources(); } diff --git a/src/main/java/jp/naist/se/stigmata/RoundRobinComparisonResultSet.java b/src/main/java/jp/naist/se/stigmata/RoundRobinComparisonResultSet.java index 0e21b15..d9940cc 100755 --- a/src/main/java/jp/naist/se/stigmata/RoundRobinComparisonResultSet.java +++ b/src/main/java/jp/naist/se/stigmata/RoundRobinComparisonResultSet.java @@ -4,9 +4,12 @@ package jp.naist.se.stigmata; * $Id$ */ +import java.net.URL; import java.util.Arrays; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; /** * Concrete class for ComparisonResultSet. This instance compare class files by round robin. @@ -35,7 +38,7 @@ public class RoundRobinComparisonResultSet implements ComparisonResultSet{ /** * constructor. if user gives { a, b, c, } as holders1, then the * instance (created by this constructor when samePair is true) - * compares { a<->a, a<->b, a<->c, b<->b, b<->c, c<->c, }. + * compares { a<->a, b<->a, b<->b, c<->a, c<->b, c<->c, }. * Otherwise, the instance compares { a<->b, a<->c, b<->c, } when * samePair is false. */ @@ -102,14 +105,31 @@ public class RoundRobinComparisonResultSet implements ComparisonResultSet{ return new ComparisonIterator(); } + public BirthmarkSet[] getComparisonSources(){ + Map map = new HashMap(); + for(BirthmarkSet set: holders1){ + map.put(set.getLocation(), set); + } + for(BirthmarkSet set: holders2){ + map.put(set.getLocation(), set); + } + + BirthmarkSet[] entries = new BirthmarkSet[map.size()]; + int index = 0; + for(Map.Entry entry: map.entrySet()){ + entries[index] = entry.getValue(); + index++; + } + + return entries; + } + /** * iterator class. */ private class ComparisonIterator implements Iterator{ private int i = 0; - private int j = 0; - private int count = 0; public boolean hasNext(){ @@ -117,8 +137,9 @@ public class RoundRobinComparisonResultSet implements ComparisonResultSet{ } public ComparisonPair next(){ - if((tablePair && i == holders1.size()) || (!tablePair && !samePair && i == j) - || (!tablePair && samePair && i > j)){ + if((tablePair && i == holders1.size()) || + (!tablePair && !samePair && i == j) || + (!tablePair && samePair && i > j)){ i = 0; j++; } diff --git a/src/main/java/jp/naist/se/stigmata/filter/FilteredComparisonResultSet.java b/src/main/java/jp/naist/se/stigmata/filter/FilteredComparisonResultSet.java index d788721..abd3c98 100755 --- a/src/main/java/jp/naist/se/stigmata/filter/FilteredComparisonResultSet.java +++ b/src/main/java/jp/naist/se/stigmata/filter/FilteredComparisonResultSet.java @@ -9,6 +9,7 @@ import java.util.Iterator; import java.util.List; import jp.naist.se.stigmata.BirthmarkContext; +import jp.naist.se.stigmata.BirthmarkSet; import jp.naist.se.stigmata.ComparisonPair; import jp.naist.se.stigmata.ComparisonPairFilterSet; import jp.naist.se.stigmata.ComparisonResultSet; @@ -64,6 +65,10 @@ public class FilteredComparisonResultSet implements ComparisonResultSet{ return new FilteredIterator(resultset.iterator()); } + public BirthmarkSet[] getComparisonSources(){ + return resultset.getComparisonSources(); + } + private class FilteredIterator implements Iterator{ private Iterator iterator; private ComparisonPair next; diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkExtractionResultPane.java b/src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkExtractionResultPane.java index 81f07f5..6ecf57f 100755 --- a/src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkExtractionResultPane.java +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/BirthmarkExtractionResultPane.java @@ -37,7 +37,6 @@ public class BirthmarkExtractionResultPane extends JPanel implements BirthmarkDa this.birthmarks = Arrays.asList(sets); JComponent southPanel = Box.createHorizontalBox(); - // JPanel southPanel = new JPanel(new FlowLayout(FlowLayout.CENTER)); JButton saveButton = Utility.createButton("savebirthmark"); JScrollPane scroll = new JScrollPane(); diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/ChangeColorAction.java b/src/main/java/jp/naist/se/stigmata/ui/swing/ChangeColorAction.java new file mode 100755 index 0000000..5c8bdb1 --- /dev/null +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/ChangeColorAction.java @@ -0,0 +1,64 @@ +package jp.naist.se.stigmata.ui.swing; + +import java.awt.Color; +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.AbstractAction; +import javax.swing.JColorChooser; +import javax.swing.JDialog; + +public class ChangeColorAction extends AbstractAction{ + private static final long serialVersionUID = -7617597154707466764L; + + private Color color = Color.RED; + private JColorChooser chooser; + private Component component; + private boolean colorSelected = false; + private ActionListener listener; + + public ChangeColorAction(Component component, Color color, ActionListener listener){ + super(Messages.getString("changecolor.button.label"), + Utility.getIcon("changecolor.button.icon")); + this.component = component; + this.listener = listener; + this.color = color; + + chooser = new JColorChooser(); + chooser.setColor(color); + } + + public ChangeColorAction(Component component, ActionListener listener){ + this(component, Color.RED, listener); + } + + public boolean isColorSelected(){ + return colorSelected; + } + + public Color getColor(){ + return color; + } + + public void actionPerformed(ActionEvent e){ + chooser.setColor(color); + JDialog dialog = JColorChooser.createDialog( + component, Messages.getString("changecolor.title"), + true, chooser, + new ActionListener(){ // ok + public void actionPerformed(ActionEvent e){ + color = chooser.getColor(); + colorSelected = true; + listener.actionPerformed(new ActionEvent(ChangeColorAction.this, e.getID(), e.getActionCommand(), e.getWhen(), e.getModifiers())); + } + }, + new ActionListener(){ // cancel + public void actionPerformed(ActionEvent e){ + colorSelected = false; + } + } + ); + dialog.setVisible(true); + } +} diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/ControlPane.java b/src/main/java/jp/naist/se/stigmata/ui/swing/ControlPane.java index 4956bad..5793c8a 100755 --- a/src/main/java/jp/naist/se/stigmata/ui/swing/ControlPane.java +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/ControlPane.java @@ -17,8 +17,8 @@ import java.util.Set; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.JButton; -import javax.swing.JComboBox; import javax.swing.JComponent; +import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JTabbedPane; @@ -50,7 +50,7 @@ public class ControlPane extends JPanel{ private JButton compareButton; private JButton extractButton; private JButton resetButton; - private JComboBox comparisonMethods; + private PopupButton comparePopup; private boolean expertmode = false; public ControlPane(StigmataFrame stigmata){ @@ -205,13 +205,16 @@ public class ControlPane extends JPanel{ String[] valueY = targetY.getValues(); String[] targets = birthmarks.getSelectedServices(); - extractButton - .setEnabled(((valueX != null && valueX.length > 0) || (valueY != null && valueY.length > 0)) - && (targets != null && targets.length > 0)); + extractButton.setEnabled( + ((valueX != null && valueX.length > 0) || (valueY != null && valueY.length > 0)) + && (targets != null && targets.length > 0) + ); - compareButton.setEnabled((valueX != null && valueX.length > 0) - && (valueY != null && valueY.length > 0) - && (targets != null && targets.length > 0)); + comparePopup.setEnabled( + (valueX != null && valueX.length > 0) && + (valueY != null && valueY.length > 0) && + (targets != null && targets.length > 0) + ); } private void extractButtonActionPerformed(ActionEvent e){ @@ -257,8 +260,10 @@ public class ControlPane extends JPanel{ private void compareRoundRobin(){ BirthmarkContext context = generateContext(); - stigmata.compareRoundRobin(birthmarks.getSelectedServices(), targetX - .getValues(), targetY.getValues(), context); + stigmata.compareRoundRobin( + birthmarks.getSelectedServices(), targetX.getValues(), + targetY.getValues(), context + ); } private void compareSpecifiedPair(){ @@ -297,13 +302,8 @@ public class ControlPane extends JPanel{ controlTab = new JTabbedPane(); resetButton = Utility.createButton("reset"); extractButton = Utility.createButton("extract"); - compareButton = Utility.createButton("compare"); - comparisonMethods = new JComboBox(); - - String[] items = Messages.getStringArray("comparison.methods"); - for(int i = 0; i < items.length; i++){ - comparisonMethods.addItem(items[i]); - } + compareButton = Utility.createButton("roundrobin"); + comparePopup = new PopupButton(compareButton); Box south = Box.createHorizontalBox(); south.add(Box.createHorizontalGlue()); @@ -311,9 +311,7 @@ public class ControlPane extends JPanel{ south.add(Box.createHorizontalGlue()); south.add(extractButton); south.add(Box.createHorizontalGlue()); - south.add(compareButton); - south.add(Box.createHorizontalGlue()); - south.add(comparisonMethods); + south.add(comparePopup); south.add(Box.createHorizontalGlue()); setLayout(new BorderLayout()); @@ -321,7 +319,7 @@ public class ControlPane extends JPanel{ add(controlTab, BorderLayout.CENTER); extractButton.setEnabled(false); - compareButton.setEnabled(false); + comparePopup.setEnabled(false); resetButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ @@ -335,23 +333,31 @@ public class ControlPane extends JPanel{ } }); - compareButton.addActionListener(new ActionListener(){ + ActionListener compareListener = new ActionListener(){ public void actionPerformed(ActionEvent e){ - String item = (String)comparisonMethods.getSelectedItem(); - if(item.equals(Messages.getString("roundrobin.label"))){ + String command = e.getActionCommand(); + + if(command.equals("roundrobin")){ compareRoundRobin(); } - else if(item.equals(Messages.getString("guessedpair.label"))){ + else if(command.equals("guessedpair")){ compareGuessedPair(); } - else if(item.equals(Messages.getString("specifiedpair.label"))){ + else if(command.equals("specifiedpair")){ compareSpecifiedPair(); } - else if(item.equals(Messages - .getString("roundrobin.filtering.label"))){ + else if(command.equals("roundrobin.filtering")){ compareRoundRobinWithFiltering(); } } - }); + }; + compareButton.addActionListener(compareListener); + + String[] items = Messages.getStringArray("comparison.methods"); + for(int i = 1; i < items.length; i++){ + JMenuItem item = Utility.createJMenuItem(items[i]); + comparePopup.addMenuItem(item); + item.addActionListener(compareListener); + } } } diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/PopupButton.java b/src/main/java/jp/naist/se/stigmata/ui/swing/PopupButton.java new file mode 100755 index 0000000..3de7e43 --- /dev/null +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/PopupButton.java @@ -0,0 +1,97 @@ +package jp.naist.se.stigmata.ui.swing; + +/* + * $Id$ + */ + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Polygon; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.image.BufferedImage; + +import javax.swing.Icon; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JMenuItem; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; + +/** + * Popup button. + * + * @author tamada + * @version $Revision$ $Date$ + */ +public class PopupButton extends JPanel{ + private static final long serialVersionUID = -4428839967597028837L; + + private JButton button; + private JPopupMenu popup; + private JButton arrowButton; + + public PopupButton(JButton initButton){ + this.button = initButton; + + Icon icon = createIcon(); + arrowButton = new JButton(icon); + popup = new JPopupMenu(); + add(button); + add(arrowButton); + + setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0)); + Dimension prefferedSize = button.getPreferredSize(); + + arrowButton.setPreferredSize(new Dimension(icon.getIconWidth() + 2, prefferedSize.height)); + setPreferredSize(new Dimension(prefferedSize.width + icon.getIconWidth() + 2, prefferedSize.height)); + + Dimension maxSize = button.getMaximumSize(); + arrowButton.setMaximumSize(new Dimension(icon.getIconWidth() + 2, maxSize.height)); + setMaximumSize(new Dimension(maxSize.width + icon.getIconWidth() + 2, maxSize.height)); + + Dimension minSize = button.getMinimumSize(); + arrowButton.setMaximumSize(new Dimension(icon.getIconWidth() + 2, minSize.height)); + setMinimumSize(new Dimension(minSize.width + icon.getIconWidth() + 2, minSize.height)); + + arrowButton.setSize(arrowButton.getPreferredSize()); + setSize(getPreferredSize()); + + arrowButton.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e){ + Point p = button.getLocation(); + popup.show(PopupButton.this, p.x, button.getHeight()); + } + }); + } + + @Override + public void setEnabled(boolean enabled){ + super.setEnabled(enabled); + button.setEnabled(enabled); + arrowButton.setEnabled(enabled); + } + + public JButton getButton(){ + return button; + } + + private Icon createIcon(){ + BufferedImage image = new BufferedImage(10, 10, BufferedImage.TYPE_INT_ARGB); + Graphics2D g = image.createGraphics(); + int[] x = new int[] { 0, 5, 10, }; + int[] y = new int[] { 3, 8, 3, }; + Polygon polygon = new Polygon(x, y, x.length); + g.setColor(Color.black); + g.fill(polygon); + + return new ImageIcon(image); + } + + public JMenuItem addMenuItem(JMenuItem menuItem){ + return popup.add(menuItem); + } +} diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/RoundRobinComparisonResultPane.java b/src/main/java/jp/naist/se/stigmata/ui/swing/RoundRobinComparisonResultPane.java index 4024d04..f1ceeee 100755 --- a/src/main/java/jp/naist/se/stigmata/ui/swing/RoundRobinComparisonResultPane.java +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/RoundRobinComparisonResultPane.java @@ -14,6 +14,7 @@ import java.awt.event.MouseEvent; import java.io.File; import java.io.IOException; import java.io.PrintWriter; +import java.net.URL; import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -21,9 +22,9 @@ import java.util.Map; import javax.swing.Box; import javax.swing.JButton; -import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JLabel; +import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; @@ -38,6 +39,7 @@ import jp.naist.se.stigmata.BirthmarkSet; import jp.naist.se.stigmata.CertainPairComparisonResultSet; import jp.naist.se.stigmata.ComparisonResultSet; import jp.naist.se.stigmata.RoundRobinComparisonResultSet; +import jp.naist.se.stigmata.filter.FilteredComparisonResultSet; import jp.naist.se.stigmata.spi.ResultFormatSpi; /** @@ -192,6 +194,24 @@ public class RoundRobinComparisonResultPane extends JPanel implements BirthmarkD stigmataFrame.saveAction(this); } + private void mdsButtonActionPerformed(ActionEvent e){ + Map map = new HashMap(); + for(BirthmarkSet bs: birthmarksX){ + map.put(bs.getLocation(), bs); + } + for(BirthmarkSet bs: birthmarksY){ + map.put(bs.getLocation(), bs); + } + int index = 0; + BirthmarkSet[] set = new BirthmarkSet[map.size()]; + for(Map.Entry entry: map.entrySet()){ + set[index] = entry.getValue(); + index++; + } + + stigmataFrame.showMDSGraph(set); + } + private void graphButtonActionPerformed(ActionEvent e){ Map values = new HashMap(); for(int i = 0; i < table.getRowCount(); i++){ @@ -213,14 +233,13 @@ public class RoundRobinComparisonResultPane extends JPanel implements BirthmarkD JButton save = Utility.createButton("savecomparison"); //$NON-NLS-1$ JButton graph = Utility.createButton("showgraph"); //$NON-NLS-1$ JButton obfuscate = Utility.createButton("obfuscate"); //$NON-NLS-1$ - JButton compare = Utility.createButton("compare"); //$NON-NLS-1$ - final JComboBox combo = new JComboBox(); - JComponent southPanel = Box.createHorizontalBox(); + JButton compare = Utility.createButton("guessedpair"); //$NON-NLS-1$ + JMenuItem mdsMenu = Utility.createJMenuItem("mdsmap"); - String[] comparisonMethods = Messages.getStringArray("comparison.methods.inroundrobinresult"); - for(int i = 0; i < comparisonMethods.length; i++){ - combo.addItem(comparisonMethods[i]); - } + PopupButton comparePopup = new PopupButton(compare); + PopupButton graphPopup = new PopupButton(graph); + + JComponent southPanel = Box.createHorizontalBox(); setLayout(new BorderLayout()); add(getMainPane(), BorderLayout.CENTER); @@ -228,13 +247,11 @@ public class RoundRobinComparisonResultPane extends JPanel implements BirthmarkD southPanel.add(Box.createHorizontalGlue()); southPanel.add(save); southPanel.add(Box.createHorizontalGlue()); - southPanel.add(graph); + southPanel.add(graphPopup); southPanel.add(Box.createHorizontalGlue()); southPanel.add(obfuscate); southPanel.add(Box.createHorizontalGlue()); - southPanel.add(compare); - southPanel.add(Box.createHorizontalGlue()); - southPanel.add(combo); + southPanel.add(comparePopup); southPanel.add(Box.createHorizontalGlue()); save.addActionListener(new ActionListener(){ @@ -248,23 +265,67 @@ public class RoundRobinComparisonResultPane extends JPanel implements BirthmarkD graphButtonActionPerformed(e); } }); + mdsMenu.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e){ + mdsButtonActionPerformed(e); + } + }); + obfuscate.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ obfuscateClassNames(); } }); - compare.addActionListener(new ActionListener(){ + ActionListener compareListener = new ActionListener(){ public void actionPerformed(ActionEvent e){ - String item = (String)combo.getSelectedItem(); - if(item.equals(Messages.getString("guessedpair.label"))){ + String item = e.getActionCommand(); + if(item.equals("guessedpair")){ compareGuessedPair(); } - else if(item.equals(Messages.getString("specifiedpair.label"))){ + else if(item.equals("specifiedpair")){ compareSpecifiedPair(); } + else if(item.equals("roundrobin.filtering")){ + compareRoundRobinWithFiltering(); + } } - }); + }; + + compare.addActionListener(compareListener); + String[] comparisonMethods = Messages.getStringArray("comparison.methods.inroundrobinresult"); + for(int i = 1; i < comparisonMethods.length; i++){ + JMenuItem item = Utility.createJMenuItem(comparisonMethods[i]); + comparePopup.addMenuItem(item); + item.addActionListener(compareListener); + } + graphPopup.addMenuItem(mdsMenu); + } + + private void compareRoundRobinWithFiltering(){ + FilterSelectionPane pane = new FilterSelectionPane( + context.getFilterManager() + ); + int returnValue = JOptionPane.showConfirmDialog( + stigmataFrame, pane, Messages.getString("filterselection.dialog.title"), + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.QUESTION_MESSAGE + ); + if(returnValue == JOptionPane.OK_OPTION){ + String[] filterSetList = pane.getSelectedFilters(); + + ComparisonResultSet resultset = new RoundRobinComparisonResultSet( + birthmarksX.toArray(new BirthmarkSet[birthmarksX.size()]), + birthmarksY.toArray(new BirthmarkSet[birthmarksY.size()]), + context + ); + + ComparisonResultSet filterResultSet = new FilteredComparisonResultSet( + resultset, + context.getFilterManager().getFilterSets(filterSetList) + ); + stigmataFrame.showComparisonResultSet(filterResultSet); + } } private void compareGuessedPair(){ diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/SimilarityDistributionGraphPane.java b/src/main/java/jp/naist/se/stigmata/ui/swing/SimilarityDistributionGraphPane.java index 6be8fdd..5b5d5e5 100644 --- a/src/main/java/jp/naist/se/stigmata/ui/swing/SimilarityDistributionGraphPane.java +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/SimilarityDistributionGraphPane.java @@ -24,8 +24,6 @@ import javax.imageio.ImageIO; import javax.swing.Box; import javax.swing.ImageIcon; import javax.swing.JButton; -import javax.swing.JColorChooser; -import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; @@ -44,8 +42,6 @@ public class SimilarityDistributionGraphPane extends JPanel{ private int maxFrequency = 0; private JLabel iconLabel; private BufferedImage image; - private Color color = Color.RED; - private JColorChooser chooser; public SimilarityDistributionGraphPane(StigmataFrame stigmata, Map distributions){ this.stigmata = stigmata; @@ -54,7 +50,7 @@ public class SimilarityDistributionGraphPane extends JPanel{ initializeLayouts(); initializeData(); - drawGraph(); + drawGraph(Color.RED); } public String[] getSupportedFormats(){ @@ -68,7 +64,7 @@ public class SimilarityDistributionGraphPane extends JPanel{ return set.toArray(new String[set.size()]); } - private void drawGraph(){ + private void drawGraph(Color color){ Graphics2D g = image.createGraphics(); g.setColor(getBackground()); g.fillRect(0, 0, image.getWidth(), image.getHeight()); @@ -142,23 +138,23 @@ public class SimilarityDistributionGraphPane extends JPanel{ } private void initializeLayouts(){ - chooser = new JColorChooser(); - chooser.setColor(Color.RED); image = new BufferedImage(300, 300, BufferedImage.TYPE_INT_ARGB); JPanel center = new JPanel(new FlowLayout(FlowLayout.CENTER)); iconLabel = new JLabel(); Box south = Box.createHorizontalBox(); JButton storeImageButton = Utility.createButton("savegraph"); - JButton switchColorButton = Utility.createButton("changecolor"); - storeImageButton.addActionListener(new ActionListener(){ + JButton switchColorButton = new JButton(new ChangeColorAction(stigmata, new ActionListener(){ public void actionPerformed(ActionEvent e){ - storeGraphImage(); + ChangeColorAction action = (ChangeColorAction)e.getSource(); + if(action.isColorSelected()){ + drawGraph(action.getColor()); + } } - }); - switchColorButton.addActionListener(new ActionListener(){ + })); + storeImageButton.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e){ - switchColor(); + storeGraphImage(); } }); @@ -174,25 +170,6 @@ public class SimilarityDistributionGraphPane extends JPanel{ add(south, BorderLayout.SOUTH); } - private void switchColor(){ - chooser.setColor(color); - JDialog dialog = JColorChooser.createDialog( - stigmata, Messages.getString("changecolor.title"), - true, chooser, - new ActionListener(){ // ok - public void actionPerformed(ActionEvent e){ - color = chooser.getColor(); - drawGraph(); - } - }, - new ActionListener(){ // cancel - public void actionPerformed(ActionEvent e){ - } - } - ); - dialog.setVisible(true); - } - private void storeGraphImage(){ String[] exts = getSupportedFormats(); File file = stigmata.getSaveFile( diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/StigmataFrame.java b/src/main/java/jp/naist/se/stigmata/ui/swing/StigmataFrame.java index b825a3b..2f598a5 100755 --- a/src/main/java/jp/naist/se/stigmata/ui/swing/StigmataFrame.java +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/StigmataFrame.java @@ -5,6 +5,7 @@ package jp.naist.se.stigmata.ui.swing; */ import java.awt.BorderLayout; +import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.event.ActionEvent; @@ -26,6 +27,9 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import javax.swing.Box; +import javax.swing.JButton; +import javax.swing.JCheckBox; import javax.swing.JCheckBoxMenuItem; import javax.swing.JFileChooser; import javax.swing.JFrame; @@ -58,6 +62,9 @@ import jp.naist.se.stigmata.Stigmata; import jp.naist.se.stigmata.filter.FilteredComparisonResultSet; import jp.naist.se.stigmata.format.FormatManager; import jp.naist.se.stigmata.spi.ResultFormatSpi; +import jp.naist.se.stigmata.ui.swing.graph.MultiDimensionalScalingMethod; +import jp.naist.se.stigmata.ui.swing.graph.MultiDimensionalScalingViewer; +import Jama.Matrix; /** @@ -79,7 +86,8 @@ public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{ private int extractCount = 0; private int compareCount = 0; private int compareDetail = 0; - private int graphCount = 0; + private int similarityGraphCount = 0; + private int mappingGraphCount = 0; private int comparePair = 0; public StigmataFrame(){ @@ -295,11 +303,56 @@ public class StigmataFrame extends JFrame implements CurrentDirectoryHolder{ tabPane.setSelectedIndex(tabPane.getTabCount() - 1); } + public void showMDSGraph(BirthmarkSet[] set){ + double[][] matrix = new double[set.length][set.length]; + + String[] labels = new String[set.length]; + for(int i = 0; i < set.length; i++){ + for(int j = 0; j <= i; j++){ + ComparisonPair pair = new ComparisonPair(set[i], set[j], context); + matrix[i][j] = 1d - pair.calculateSimilarity(); + if(i != j){ + matrix[j][i] = matrix[i][j]; + } + } + labels[i] = set[i].getClassName(); + } + final MultiDimensionalScalingViewer viewer = new MultiDimensionalScalingViewer(new MultiDimensionalScalingMethod(new Matrix(matrix)), labels); + viewer.setShowLabel(true); + + JPanel panel = new JPanel(new BorderLayout()); + Box south = Box.createHorizontalBox(); + JButton colorButton = new JButton(new ChangeColorAction(this, Color.BLUE, new ActionListener(){ + public void actionPerformed(ActionEvent e){ + ChangeColorAction action = (ChangeColorAction)e.getSource(); + viewer.setOverColor(action.getColor()); + } + })); + final JCheckBox check = new JCheckBox(Messages.getString("showlabel.button.label"), true); + check.addActionListener(new ActionListener(){ + public void actionPerformed(ActionEvent e){ + viewer.setShowLabel(check.isSelected()); + } + }); + + south.add(Box.createHorizontalGlue()); + south.add(colorButton); + south.add(Box.createHorizontalGlue()); + south.add(check); + south.add(Box.createHorizontalGlue()); + panel.add(viewer, BorderLayout.CENTER); + panel.add(south, BorderLayout.SOUTH); + + mappingGraphCount++; + Utility.addNewTab("mappinggraph", tabPane, panel, new Object[] { new Integer(mappingGraphCount), }, null); + tabPane.setSelectedIndex(tabPane.getTabCount() - 1); + } + public void showSimilarityDistributionGraph(Map distributions){ SimilarityDistributionGraphPane graph = new SimilarityDistributionGraphPane(this, distributions); - graphCount++; - Utility.addNewTab("graph", tabPane, graph, new Object[] { new Integer(graphCount), }, null); + similarityGraphCount++; + Utility.addNewTab("similaritygraph", tabPane, graph, new Object[] { new Integer(similarityGraphCount), }, null); tabPane.setSelectedIndex(tabPane.getTabCount() - 1); } diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/graph/MultiDimensionalScalingMethod.java b/src/main/java/jp/naist/se/stigmata/ui/swing/graph/MultiDimensionalScalingMethod.java new file mode 100755 index 0000000..2c00cb1 --- /dev/null +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/graph/MultiDimensionalScalingMethod.java @@ -0,0 +1,101 @@ +package jp.naist.se.stigmata.ui.swing.graph; + +import Jama.EigenvalueDecomposition; +import Jama.Matrix; + +public class MultiDimensionalScalingMethod{ + private Matrix target; + private Matrix coordinate; + private int[] indexes; + + public MultiDimensionalScalingMethod(Matrix matrix){ + this.target = matrix; + } + + protected Matrix getCenteredInnerProductMatrix(){ + Matrix centering = getCenteringMatrix(target.getColumnDimension()); + Matrix trans = centering.transpose(); + + return centering.times(target).times(trans).times(-1); + } + + public double[] getCoordinate(int axis){ + if(coordinate == null){ + getCoordinateMatrix(); + } + double[] v = new double[coordinate.getRowDimension()]; + for(int i = 0; i < v.length; i++){ + v[i] = coordinate.get(i, indexes[axis]); + } + return v; + } + + public Matrix getCoordinateMatrix(){ + Matrix mat = getCenteredInnerProductMatrix(); + EigenvalueDecomposition eigen = mat.eig(); + Matrix eigenVectors = eigen.getV(); + Matrix eigenValues = eigen.getD(); + + for(int i = 0; i < mat.getRowDimension(); i++){ + for(int j = 0; j < mat.getColumnDimension(); j++){ + double v = eigenVectors.get(i, j); + v = v * Math.sqrt(eigenValues.get(j, j)); + eigenVectors.set(i, j, v); + } + } + sortValues(eigenVectors); + this.coordinate = eigenVectors; + + return eigenVectors; + } + + protected static Matrix getCenteringMatrix(int n){ + Matrix matrix = Matrix.identity(n, n); + for(int i = 0; i < n; i++){ + for(int j = 0; j < n; j++){ + matrix.set(i, j, matrix.get(i, j) - (1d / n)); + } + } + return matrix; + } + + private void sortValues(Matrix m){ + double[] v = new double[m.getColumnDimension()]; + int[] index = new int[v.length]; + for(int i = 0; i < v.length; i++){ + v[i] = m.get(i, i); + index[i] = i; + } + + for(int i = 0; i < v.length; i++){ + for(int j = i + 1; j < v.length; j++){ + if(v[i] < v[j]){ + double tmpValue = v[j]; + v[j] = v[i]; + v[i] = tmpValue; + int tmpIndex = index[j]; + index[j] = index[i]; + index[i] = tmpIndex; + } + } + } + indexes = index; + } + + public static void main(String[] args){ + Matrix matrix = new Matrix(new double[][]{ + { 0, 587, 1212, 701, 1936, 604, 748, 2139, 2182, 543, }, + { 587, 0, 920, 940, 1745, 1188, 713, 1858, 1737, 597, }, + { 1212, 920, 0, 879, 831, 1726, 1631, 949, 1021, 1494, }, + { 701, 940, 879, 0, 1374, 968, 1420, 1645, 1891, 1220, }, + { 1936, 1745, 831, 1374, 0, 2339, 2451, 347, 959, 2300, }, + { 604, 1188, 1726, 968, 2339, 0, 1092, 2592, 2734, 923, }, + { 748, 713, 1631, 1420, 2451, 1092, 0, 2571, 2408, 205, }, + { 2139, 1858, 949, 1645, 347, 2594, 2571, 0, 678, 2442, }, + { 2182, 1737, 1021, 1891, 959, 2734, 2408, 678, 0, 2329, }, + { 543, 597, 1494, 1220, 2300, 923, 205, 2442, 2329, 0, }, + }); + MultiDimensionalScalingMethod mds = new MultiDimensionalScalingMethod(matrix); + System.out.println(mds.getCoordinateMatrix()); + } +} diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/graph/MultiDimensionalScalingViewer.java b/src/main/java/jp/naist/se/stigmata/ui/swing/graph/MultiDimensionalScalingViewer.java new file mode 100755 index 0000000..7070f61 --- /dev/null +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/graph/MultiDimensionalScalingViewer.java @@ -0,0 +1,209 @@ +package jp.naist.se.stigmata.ui.swing.graph; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Point; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JLayeredPane; + +import Jama.Matrix; + +public class MultiDimensionalScalingViewer extends JLayeredPane{ + private static final long serialVersionUID = -9196070059428975126L; + private static final int POINT_LAYER = DEFAULT_LAYER; + private static final int LABEL_LAYER = DEFAULT_LAYER; + + private MultiDimensionalScalingMethod mds; + private List list = new ArrayList(); + private Color overColor = PointComponent.DEFAULT_OVER_COLOR; + private Color pointColor = getForeground(); + private boolean sameAspect = false; + private boolean showLabel = false; + private List points = new ArrayList(); + private List labellist = new ArrayList(); + + public MultiDimensionalScalingViewer(MultiDimensionalScalingMethod mds){ + this(mds, null); + } + + public MultiDimensionalScalingViewer(MultiDimensionalScalingMethod mds, String[] labels){ + this.mds = mds; + + setSize(300, 300); + setMinimumSize(getSize()); + setPreferredSize(getSize()); + initLayouts(labels); + } + + public boolean isShowLabel(){ + return showLabel; + } + + public void setShowLabel(boolean showLabel){ + this.showLabel = showLabel; + repaint(); + } + + public boolean isSameAspect(){ + return sameAspect; + } + + public void setSameAspect(boolean sameAspect){ + this.sameAspect = sameAspect; + repaint(); + } + + public Color getOverColor(){ + return overColor; + } + + public void setOverColor(Color color){ + this.overColor = color; + for(int i = 0; i < getComponentCount(); i++){ + Component c = getComponent(i); + if(c instanceof PointComponent){ + ((PointComponent)c).setOverColor(color); + } + } + } + + public Color getPointColor(){ + return pointColor; + } + + public void setPointColor(Color color){ + this.pointColor = color; + for(int i = 0; i < getComponentCount(); i++){ + Component c = getComponent(i); + if(c instanceof PointComponent){ + ((PointComponent)c).setForeground(color); + } + } + } + + @Override + public void paintComponent(Graphics g){ + super.paintComponent(g); + + Dimension d = getSize(); + + g.setColor(Color.GRAY); + g.drawLine(d.width / 2, d.height, d.width / 2, 0); + g.drawLine(0, d.height / 2, d.width, d.height / 2); + + updateComponents(d); + } + + private void initLayouts(String[] labels){ + double[] x = mds.getCoordinate(0); + double[] y = mds.getCoordinate(1); + + double xmax = 0d; + double ymax = 0d; + for(int i = 0; i < x.length; i++){ + if(xmax < Math.abs(x[i])) xmax = Math.abs(x[i]); + } + for(int i = 0; i < y.length; i++){ + if(ymax < Math.abs(y[i])) ymax = Math.abs(y[i]); + } + if(sameAspect){ + if(ymax > xmax) xmax = ymax; + else ymax = xmax; + } + + int w = getWidth(); + int h = getHeight(); + + int ww = w - 20; + int hh = h - 20; + + for(int i = 0; i < x.length; i++){ + double[] xy = new double[] { x[i] / xmax, - y[i] / ymax, }; + list.add(xy); + double xx = xy[0] * ww / 2 + (w / 2); + double yy = xy[1] * hh / 2 + (h / 2); + String label = String.valueOf(i); + if(labels != null && labels.length > i){ + label = labels[i]; + } + + PointComponent p = new PointComponent(label, x[i], y[i]); + add(p, POINT_LAYER); + Dimension size = p.getSize(); + p.setLocation( + new Point((int)(xx - (size.getWidth() / 2d)), (int)(yy - (size.getHeight() / 2))) + ); + points.add(p); + + JLabel l = new JLabel(p.getLabel()); + add(l, LABEL_LAYER); + l.setSize(l.getPreferredSize()); + Point pcp = p.getLocation(); + Dimension dsize = l.getSize(); + l.setLocation(new Point(pcp.x - (dsize.width / 2), pcp.y - 15)); + l.setVisible(isShowLabel()); + labellist.add(l); + } + } + + private void updateComponents(Dimension d){ + int index = 0; + for(PointComponent pc: points){ + updateLocation(pc, list.get(index), d); + JLabel label = labellist.get(index); + Point pcp = pc.getLocation(); + Dimension dsize = label.getSize(); + label.setLocation(new Point(pcp.x - (dsize.width / 2), pcp.y - 15)); + label.setVisible(isShowLabel()); + index++; + } + } + + private void updateLocation(PointComponent c, double[] xy, Dimension d){ + double xx = xy[0] * (d.width - 20) / 2 + (d.width / 2); + double yy = xy[1] * (d.height - 20) / 2 + (d.height / 2); + Dimension size = c.getSize(); + c.setLocation( + new Point((int)(xx - (size.getWidth() / 2d)), (int)(yy - (size.getHeight() / 2))) + ); + } + + public static void main(String[] args) throws Exception{ + MultiDimensionalScalingMethod mds; + String[] labels = null; + + labels = new String[] { + "Atlanta", "Chicago", "Denver", "Houston", "Los Angeles", "Miami", + "New York", "San Francisco", "Seattle", "Washington D.C.", + }; + Matrix matrix = new Matrix(new double[][]{ + { 0, 587, 1212, 701, 1936, 604, 748, 2139, 2182, 543, }, + { 587, 0, 920, 940, 1745, 1188, 713, 1858, 1737, 597, }, + { 1212, 920, 0, 879, 831, 1726, 1631, 949, 1021, 1494, }, + { 701, 940, 879, 0, 1374, 968, 1420, 1645, 1891, 1220, }, + { 1936, 1745, 831, 1374, 0, 2339, 2451, 347, 959, 2300, }, + { 604, 1188, 1726, 968, 2339, 0, 1092, 2592, 2734, 923, }, + { 748, 713, 1631, 1420, 2451, 1092, 0, 2571, 2408, 205, }, + { 2139, 1858, 949, 1645, 347, 2594, 2571, 0, 678, 2442, }, + { 2182, 1737, 1021, 1891, 959, 2734, 2408, 678, 0, 2329, }, + { 543, 597, 1494, 1220, 2300, 923, 205, 2442, 2329, 0, }, + }); + mds = new MultiDimensionalScalingMethod(matrix); + + mds.getCoordinateMatrix().print(8, 4); + MultiDimensionalScalingViewer viewer = new MultiDimensionalScalingViewer(mds, labels); + viewer.setShowLabel(true); + JFrame f = new JFrame(); + f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + f.getContentPane().add(viewer, BorderLayout.CENTER); + f.pack(); + f.setVisible(true); + } +} diff --git a/src/main/java/jp/naist/se/stigmata/ui/swing/graph/PointComponent.java b/src/main/java/jp/naist/se/stigmata/ui/swing/graph/PointComponent.java new file mode 100755 index 0000000..f08884c --- /dev/null +++ b/src/main/java/jp/naist/se/stigmata/ui/swing/graph/PointComponent.java @@ -0,0 +1,70 @@ +package jp.naist.se.stigmata.ui.swing.graph; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +import javax.swing.JLabel; + +class PointComponent extends JLabel{ + private static final long serialVersionUID = 6945871049990818511L; + public static final Color DEFAULT_OVER_COLOR = Color.BLUE; + private String label; + private boolean entered = false; + private Color overColor = DEFAULT_OVER_COLOR; + + public PointComponent(String label, double x, double y){ + this(label); + + setToolTipText(String.format("%s [%g, %g]", label, x, y)); + } + + public PointComponent(String label){ + this.label = label; + setSize(10, 10); + setMinimumSize(getSize()); + setMaximumSize(getSize()); + setPreferredSize(getSize()); + + addMouseListener(new MouseAdapter(){ + @Override + public void mouseEntered(MouseEvent e){ + entered = true; + updateUI(); + } + + @Override + public void mouseExited(MouseEvent e){ + entered = false; + updateUI(); + } + }); + setToolTipText(this.label); + } + + public String getLabel(){ + return label; + } + + @Override + public void paintComponent(Graphics g){ + super.paintComponent(g); + if(entered){ + g.setColor(getOverColor()); + g.fillOval(0, 0, 10, 10); + } + else{ + g.setColor(getForeground()); + g.fillOval(4, 4, 3, 3); + } + } + + public Color getOverColor(){ + return overColor; + } + + public void setOverColor(Color overColor){ + this.overColor = overColor; + } +} diff --git a/src/main/resources/resources/images/map.png b/src/main/resources/resources/images/map.png new file mode 100755 index 0000000000000000000000000000000000000000..f90ef25ec7f1cb0fdae38d9fe2d9edeee9928ef1 GIT binary patch literal 804 zcmV+<1Ka$GP)mbpQb1@7I~O+ue5CWtZi#AZox@gcwb{Xkx^Rf;Ty8yn6DWhJV4kC*wg94<7Vt zlteKm5+jKLV^qM1yt2HO4YZw^&a^Wfzb_m+@y40e_0^+M6ajz$03Zl}fU=sqfA9W} z@#^~O(a%3QB{YI^J_A4y)M^1_vjjn1H`Mc5t@6>y50A!C6seTL>`UqQ7p$DgY@K|> zQm^as;HM{#Qwj<3}(>R-AM4&+cd0t49%y2X`UaCBJg8YmB)K#uA{Z>9n zOp8>WCg#&r06`o8oz6gaIn`fY2FR)ssCr@3rc|5f%`bIJO$zbt__PK3gH51Sff`H}0ZWac9&q~*( zO@qNscV0VSU%X#sYO9)Qx4M=(eR(m}UFhondELHSnO2hr&mMO3 zv6gmw!P2y#u0c!?LPO88NyxOTj>XWm>*77F&55fo9Z?)iynObdfA;SdwVRl$W~G3* zEGt!2+1T-%ja32&!XdoMS_mM#IQK#{6D_nvjYu`GlvO3XdE)qYJJ;7 and <{2}> by {0}. comparedetail.tab.label=Compare Detail {0} comparedetail.tab.tooltip=Compare birthmarks between {1} and {2} by {0}. -graph.tab.label=Similarity Graph {0} -graph.tab.tooltip=Similarity distribution graph. +similaritygraph.tab.label=Similarity Graph {0} +similaritygraph.tab.tooltip=Similarity distribution graph. + +mappinggraph.tab.label=MDS Graph {0} +mappinggraph.tab.tooltip=Plot classes based on MDS store.extensions=xml, csv store.description=Sotre birthmarks as {0} @@ -150,7 +153,7 @@ extract.button.tooltip=Extract birthmarks from class files in specified jar file extract.button.icon=arrow_out.png compare.button.label=Compare -compare.button.tooltip=Compare class files in jar files by specified comparison method with selected birthmarks +compare.button.tooltip=Compare class files in jar files by round robin comparison with selected birthmarks compare.button.icon=arrow_right_left.png #compareguess.button.label=Compare Pair (guess) @@ -213,6 +216,13 @@ savecomparison.button.icon=disk.png showgraph.button.label=Graph showgraph.button.tooltip=Show distribution graph of birthmark similarity. showgraph.button.icon=chart_curve.png +showgraph.menu.label=Graph +showgraph.menu.tooltip=Show distribution graph of birthmark similarity. +showgraph.menu.icon=chart_curve.png + +mdsmap.menuitem.label=Distance Mapping +mdsmap.menuitem.tooltip=Mapping all classes into 2-d plane. +mdsmap.menuitem.icon=map.png ################################################ #BirthmarksViewPane @@ -248,6 +258,8 @@ changecolor.button.label=Change Color... changecolor.button.icon=color_swatch.png changecolor.title=Switch Color +showlabel.button.label=Show label + comparepair.tab.label=Compare Pair {0} comparepair.tab.tooltip=Compare pair between {1} and {2} by {0} birthmark. comparepair.target1.label=Target 1 @@ -260,10 +272,25 @@ guessedpair.label=Guessed pair specifiedpair.label=Specified pair... roundrobin.filtering.label=Filtering round robin... -comparison.methods=${roundrobin.label},${guessedpair.label},${specifiedpair.label},${roundrobin.filtering.label} +roundrobin.button.label=Compare round robin +roundrobin.button.tooltip=Compare birthmarks by round robin comparison from selected files +roundrobin.button.icon=arrow_right_left.png + +guessedpair.button.label=Compare guessed pair +guessedpair.button.tooltip=Compare birthmarks by guessed pair +guessedpair.button.icon=arrow_right_left.png + +roundrobin.menuitem.label=${roundrobin.button.label} +guessedpair.menuitem.label=${guessedpair.button.label} +specifiedpair.menuitem.label=Comparing specified pair... +roundrobin.filtering.menuitem.label=Filtering round robin comparison pair... + +comparison.methods=roundrobin,guessedpair,specifiedpair,roundrobin.filtering +comparison.methods.inroundrobinresult=guessedpair,specifiedpair,roundrobin.filtering + result.border=Comparison Result eachbirthmarksimilarity.border=Each birthmark similarities -comparison.methods.inroundrobinresult=${guessedpair.label},${specifiedpair.label} + comparisonresultset.tab.label=Compare Pair {0} comparisonresultset.tab.tooltip=Comparison pair. diff --git a/src/test/java/jp/naist/se/stigmata/birthmarks/smc/SmcBirthmarkExtractorTest.java b/src/test/java/jp/naist/se/stigmata/birthmarks/smc/SmcBirthmarkExtractorTest.java index 8e83b2b..72a1c01 100755 --- a/src/test/java/jp/naist/se/stigmata/birthmarks/smc/SmcBirthmarkExtractorTest.java +++ b/src/test/java/jp/naist/se/stigmata/birthmarks/smc/SmcBirthmarkExtractorTest.java @@ -142,7 +142,7 @@ public class SmcBirthmarkExtractorTest{ Birthmark birthmark = array[0].getBirthmark("smc"); Assert.assertEquals("smc", birthmark.getType()); - Assert.assertEquals(10, birthmark.getElementCount()); + Assert.assertEquals(25, birthmark.getElementCount()); BirthmarkElement[] elements = birthmark.getElements(); for(int i = 0; i < elements.length; i++){ @@ -151,15 +151,37 @@ public class SmcBirthmarkExtractorTest{ elements[i].getClass().getName() ); } - Assert.assertEquals("java.lang.Object#", elements[0].toString()); - Assert.assertEquals("java.util.Arrays#asList", elements[1].toString()); - Assert.assertEquals("java.util.Arrays#asList", elements[2].toString()); - Assert.assertEquals("java.lang.Object#", elements[3].toString()); - Assert.assertEquals("java.util.Arrays#asList", elements[4].toString()); - Assert.assertEquals("java.util.Arrays#asList", elements[5].toString()); - Assert.assertEquals("java.util.List#size", elements[6].toString()); - Assert.assertEquals("java.util.List#size", elements[7].toString()); - Assert.assertEquals("java.util.List#size", elements[8].toString()); - Assert.assertEquals("java.util.List#size", elements[9].toString()); + // (BirthmarkSet[], BirthmarkContext, boolean) + Assert.assertEquals("java.lang.Object#", elements[ 0].toString()); + Assert.assertEquals("java.util.Arrays#asList", elements[ 1].toString()); + Assert.assertEquals("java.util.Arrays#asList", elements[ 2].toString()); + Assert.assertEquals("java.lang.Object#", elements[ 3].toString()); + + // (BirthmarkSet[], BirthmarkSet[], BirthmarkContext, boolean) + Assert.assertEquals("java.util.Arrays#asList", elements[ 4].toString()); + Assert.assertEquals("java.util.Arrays#asList", elements[ 5].toString()); + + // setCompareSamePair + Assert.assertEquals("java.util.List#size", elements[ 6].toString()); + Assert.assertEquals("java.util.List#size", elements[ 7].toString()); + Assert.assertEquals("java.util.List#size", elements[ 8].toString()); + Assert.assertEquals("java.util.List#size", elements[ 9].toString()); + + // getComparisonSources + Assert.assertEquals("java.util.HashMap#", elements[10].toString()); + Assert.assertEquals("java.util.List#iterator", elements[11].toString()); + Assert.assertEquals("java.util.Iterator#next", elements[12].toString()); + Assert.assertEquals("java.util.Map#put", elements[13].toString()); + Assert.assertEquals("java.util.Iterator#hasNext", elements[14].toString()); + Assert.assertEquals("java.util.List#iterator", elements[15].toString()); + Assert.assertEquals("java.util.Iterator#next", elements[16].toString()); + Assert.assertEquals("java.util.Map#put", elements[17].toString()); + Assert.assertEquals("java.util.Iterator#hasNext", elements[18].toString()); + Assert.assertEquals("java.util.Map#size", elements[19].toString()); + Assert.assertEquals("java.util.Map#entrySet", elements[20].toString()); + Assert.assertEquals("java.util.Set#iterator", elements[21].toString()); + Assert.assertEquals("java.util.Iterator#next", elements[22].toString()); + Assert.assertEquals("java.util.Map$Entry#getValue", elements[23].toString()); + Assert.assertEquals("java.util.Iterator#hasNext", elements[24].toString()); } } diff --git a/src/test/java/jp/naist/se/stigmata/birthmarks/uc/UCBirthmarkExtractorTest.java b/src/test/java/jp/naist/se/stigmata/birthmarks/uc/UCBirthmarkExtractorTest.java index de304fe..99a22ea 100755 --- a/src/test/java/jp/naist/se/stigmata/birthmarks/uc/UCBirthmarkExtractorTest.java +++ b/src/test/java/jp/naist/se/stigmata/birthmarks/uc/UCBirthmarkExtractorTest.java @@ -76,12 +76,17 @@ public class UCBirthmarkExtractorTest{ Birthmark birthmark = array[0].getBirthmark("uc"); Assert.assertEquals("uc", birthmark.getType()); - Assert.assertEquals(4, birthmark.getElementCount()); + Assert.assertEquals(9, birthmark.getElementCount()); BirthmarkElement[] elements = birthmark.getElements(); - Assert.assertEquals("java.lang.Object", elements[0].getValue()); - Assert.assertEquals("java.util.Arrays", elements[1].getValue()); - Assert.assertEquals("java.util.Iterator", elements[2].getValue()); - Assert.assertEquals("java.util.List", elements[3].getValue()); + Assert.assertEquals("java.lang.Object", elements[0].getValue()); + Assert.assertEquals("java.net.URL", elements[1].getValue()); + Assert.assertEquals("java.util.Arrays", elements[2].getValue()); + Assert.assertEquals("java.util.HashMap", elements[3].getValue()); + Assert.assertEquals("java.util.Iterator", elements[4].getValue()); + Assert.assertEquals("java.util.List", elements[5].getValue()); + Assert.assertEquals("java.util.Map", elements[6].getValue()); + Assert.assertEquals("java.util.Map$Entry", elements[7].getValue()); + Assert.assertEquals("java.util.Set", elements[8].getValue()); } } -- 2.11.0