hotspot/src/share/tools/IdealGraphVisualizer/Difference/src/com/sun/hotspot/igv/difference/Difference.java
author xdono
Mon, 15 Dec 2008 16:55:11 -0800
changeset 1623 a0dd9009e992
parent 1497 cd3234c89e59
child 5547 f4b087cbb361
permissions -rw-r--r--
6785258: Update copyright year Summary: Update copyright for files that have been modified starting July 2008 to Dec 2008 Reviewed-by: katleman, ohair, tbell
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
766
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
     1
/*
1623
a0dd9009e992 6785258: Update copyright year
xdono
parents: 1497
diff changeset
     2
 * Copyright 1998-2008 Sun Microsystems, Inc.  All Rights Reserved.
766
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
     4
 *
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Sun designates this
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
     9
 * by Sun in the LICENSE file that accompanied this code.
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    10
 *
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    15
 * accompanied this code).
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    16
 *
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    20
 *
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    21
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    22
 * CA 95054 USA or visit www.sun.com if you need additional information or
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    23
 * have any questions.
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    24
 */
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    25
package com.sun.hotspot.igv.difference;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    26
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    27
import com.sun.hotspot.igv.data.Group;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    28
import com.sun.hotspot.igv.data.InputEdge;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    29
import com.sun.hotspot.igv.data.InputGraph;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    30
import com.sun.hotspot.igv.data.InputNode;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    31
import com.sun.hotspot.igv.data.Property;
1497
cd3234c89e59 6764622: IdealGraphVisualizer fixes
never
parents: 766
diff changeset
    32
import java.util.Collection;
766
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    33
import java.util.HashMap;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    34
import java.util.HashSet;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    35
import java.util.Map;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    36
import java.util.Set;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    37
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    38
/**
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    39
 *
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    40
 * @author Thomas Wuerthinger
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    41
 */
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    42
public class Difference {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    43
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    44
    public static final String PROPERTY_STATE = "state";
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    45
    public static final String VALUE_NEW = "new";
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    46
    public static final String VALUE_CHANGED = "changed";
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    47
    public static final String VALUE_SAME = "same";
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    48
    public static final String VALUE_DELETED = "deleted";
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    49
    public static final String OLD_PREFIX = "OLD_";
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    50
    public static final String MAIN_PROPERTY = "name";
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    51
    public static final double LIMIT = 100.0;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    52
    public static final String[] IGNORE_PROPERTIES = new String[]{"idx", "debug_idx"};
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    53
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    54
    public static InputGraph createDiffGraph(InputGraph a, InputGraph b) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    55
        if (a.getGroup() == b.getGroup()) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    56
            return createDiffSameGroup(a, b);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    57
        } else {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    58
            return createDiff(a, b);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    59
        }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    60
    }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    61
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    62
    private static InputGraph createDiffSameGroup(InputGraph a, InputGraph b) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    63
        Map<Integer, InputNode> keyMapB = new HashMap<Integer, InputNode>();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    64
        for (InputNode n : b.getNodes()) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    65
            Integer key = n.getId();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    66
            assert !keyMapB.containsKey(key);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    67
            keyMapB.put(key, n);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    68
        }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    69
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    70
        Set<Pair> pairs = new HashSet<Pair>();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    71
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    72
        for (InputNode n : a.getNodes()) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    73
            Integer key = n.getId();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    74
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    75
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    76
            if (keyMapB.containsKey(key)) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    77
                InputNode nB = keyMapB.get(key);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    78
                pairs.add(new Pair(n, nB));
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    79
            }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    80
        }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    81
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    82
        return createDiff(a, b, pairs);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    83
    }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    84
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    85
    private static InputGraph createDiff(InputGraph a, InputGraph b, Set<Pair> pairs) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    86
        Group g = new Group();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    87
        g.setMethod(a.getGroup().getMethod());
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    88
        g.setAssembly(a.getGroup().getAssembly());
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    89
        g.getProperties().setProperty("name", "Difference");
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    90
        InputGraph graph = new InputGraph(g, null);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    91
        graph.setName(a.getName() + ", " + b.getName());
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    92
        graph.setIsDifferenceGraph(true);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    93
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    94
        Set<InputNode> nodesA = new HashSet<InputNode>(a.getNodes());
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    95
        Set<InputNode> nodesB = new HashSet<InputNode>(b.getNodes());
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    96
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    97
        Map<InputNode, InputNode> inputNodeMap = new HashMap<InputNode, InputNode>();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    98
        for (Pair p : pairs) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
    99
            InputNode n = p.getN1();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   100
            assert nodesA.contains(n);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   101
            InputNode nB = p.getN2();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   102
            assert nodesB.contains(nB);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   103
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   104
            nodesA.remove(n);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   105
            nodesB.remove(nB);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   106
            InputNode n2 = new InputNode(n);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   107
            inputNodeMap.put(n, n2);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   108
            inputNodeMap.put(nB, n2);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   109
            graph.addNode(n2);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   110
            markAsChanged(n2, n, nB);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   111
        }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   112
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   113
        for (InputNode n : nodesA) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   114
            InputNode n2 = new InputNode(n);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   115
            graph.addNode(n2);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   116
            markAsNew(n2);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   117
            inputNodeMap.put(n, n2);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   118
        }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   119
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   120
        for (InputNode n : nodesB) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   121
            InputNode n2 = new InputNode(n);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   122
            n2.setId(-n2.getId());
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   123
            graph.addNode(n2);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   124
            markAsDeleted(n2);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   125
            inputNodeMap.put(n, n2);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   126
        }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   127
1497
cd3234c89e59 6764622: IdealGraphVisualizer fixes
never
parents: 766
diff changeset
   128
        Collection<InputEdge> edgesA = a.getEdges();
cd3234c89e59 6764622: IdealGraphVisualizer fixes
never
parents: 766
diff changeset
   129
        Collection<InputEdge> edgesB = b.getEdges();
766
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   130
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   131
        Set<InputEdge> newEdges = new HashSet<InputEdge>();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   132
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   133
        for (InputEdge e : edgesA) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   134
            int from = e.getFrom();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   135
            int to = e.getTo();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   136
            InputNode nodeFrom = inputNodeMap.get(a.getNode(from));
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   137
            InputNode nodeTo = inputNodeMap.get(a.getNode(to));
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   138
            char index = e.getToIndex();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   139
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   140
            InputEdge newEdge = new InputEdge(index, nodeFrom.getId(), nodeTo.getId());
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   141
            if (!newEdges.contains(newEdge)) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   142
                markAsNew(newEdge);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   143
                newEdges.add(newEdge);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   144
                graph.addEdge(newEdge);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   145
            }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   146
        }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   147
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   148
        for (InputEdge e : edgesB) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   149
            int from = e.getFrom();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   150
            int to = e.getTo();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   151
            InputNode nodeFrom = inputNodeMap.get(b.getNode(from));
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   152
            InputNode nodeTo = inputNodeMap.get(b.getNode(to));
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   153
            char index = e.getToIndex();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   154
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   155
            InputEdge newEdge = new InputEdge(index, nodeFrom.getId(), nodeTo.getId());
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   156
            if (!newEdges.contains(newEdge)) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   157
                markAsDeleted(newEdge);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   158
                newEdges.add(newEdge);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   159
                graph.addEdge(newEdge);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   160
            } else {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   161
                newEdges.remove(newEdge);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   162
                graph.removeEdge(newEdge);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   163
                markAsSame(newEdge);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   164
                newEdges.add(newEdge);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   165
                graph.addEdge(newEdge);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   166
            }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   167
        }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   168
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   169
        g.addGraph(graph);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   170
        return graph;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   171
    }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   172
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   173
    private static class Pair {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   174
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   175
        private InputNode n1;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   176
        private InputNode n2;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   177
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   178
        public Pair(InputNode n1, InputNode n2) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   179
            this.n1 = n1;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   180
            this.n2 = n2;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   181
        }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   182
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   183
        public double getValue() {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   184
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   185
            double result = 0.0;
1497
cd3234c89e59 6764622: IdealGraphVisualizer fixes
never
parents: 766
diff changeset
   186
            for (Property p : n1.getProperties()) {
766
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   187
                double faktor = 1.0;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   188
                for (String forbidden : IGNORE_PROPERTIES) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   189
                    if (p.getName().equals(forbidden)) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   190
                        faktor = 0.1;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   191
                        break;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   192
                    }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   193
                }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   194
                String p2 = n2.getProperties().get(p.getName());
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   195
                result += evaluate(p.getValue(), p2) * faktor;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   196
            }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   197
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   198
            return result;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   199
        }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   200
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   201
        private double evaluate(String p, String p2) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   202
            if (p2 == null) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   203
                return 1.0;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   204
            }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   205
            if (p.equals(p2)) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   206
                return 0.0;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   207
            } else {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   208
                return (double) (Math.abs(p.length() - p2.length())) / p.length() + 0.5;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   209
            }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   210
        }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   211
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   212
        public InputNode getN1() {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   213
            return n1;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   214
        }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   215
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   216
        public InputNode getN2() {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   217
            return n2;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   218
        }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   219
    }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   220
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   221
    private static InputGraph createDiff(InputGraph a, InputGraph b) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   222
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   223
        Set<InputNode> matched = new HashSet<InputNode>();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   224
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   225
        Set<Pair> pairs = new HashSet<Pair>();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   226
        for (InputNode n : a.getNodes()) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   227
            String s = n.getProperties().get(MAIN_PROPERTY);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   228
            if (s == null) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   229
                s = "";
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   230
            }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   231
            for (InputNode n2 : b.getNodes()) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   232
                String s2 = n2.getProperties().get(MAIN_PROPERTY);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   233
                if (s2 == null) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   234
                    s2 = "";
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   235
                }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   236
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   237
                if (s.equals(s2)) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   238
                    Pair p = new Pair(n, n2);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   239
                    pairs.add(p);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   240
                }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   241
            }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   242
        }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   243
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   244
        Set<Pair> selectedPairs = new HashSet<Pair>();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   245
        while (pairs.size() > 0) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   246
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   247
            double min = Double.MAX_VALUE;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   248
            Pair minPair = null;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   249
            for (Pair p : pairs) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   250
                double cur = p.getValue();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   251
                if (cur < min) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   252
                    minPair = p;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   253
                    min = cur;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   254
                }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   255
            }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   256
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   257
            if (min > LIMIT) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   258
                break;
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   259
            } else {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   260
                selectedPairs.add(minPair);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   261
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   262
                Set<Pair> toRemove = new HashSet<Pair>();
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   263
                for (Pair p : pairs) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   264
                    if (p.getN1() == minPair.getN1() || p.getN2() == minPair.getN2()) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   265
                        toRemove.add(p);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   266
                    }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   267
                }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   268
                pairs.removeAll(toRemove);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   269
            }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   270
        }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   271
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   272
        return createDiff(a, b, selectedPairs);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   273
    }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   274
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   275
    private static void markAsNew(InputEdge e) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   276
        e.setState(InputEdge.State.NEW);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   277
    }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   278
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   279
    private static void markAsDeleted(InputEdge e) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   280
        e.setState(InputEdge.State.DELETED);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   281
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   282
    }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   283
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   284
    private static void markAsSame(InputEdge e) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   285
        e.setState(InputEdge.State.SAME);
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   286
    }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   287
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   288
    private static void markAsChanged(InputNode n, InputNode firstNode, InputNode otherNode) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   289
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   290
        boolean difference = false;
1497
cd3234c89e59 6764622: IdealGraphVisualizer fixes
never
parents: 766
diff changeset
   291
        for (Property p : otherNode.getProperties()) {
cd3234c89e59 6764622: IdealGraphVisualizer fixes
never
parents: 766
diff changeset
   292
            String s = firstNode.getProperties().get(p.getName());
766
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   293
            if (!p.getValue().equals(s)) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   294
                difference = true;
1497
cd3234c89e59 6764622: IdealGraphVisualizer fixes
never
parents: 766
diff changeset
   295
                n.getProperties().setProperty(OLD_PREFIX + p.getName(), p.getValue());
766
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   296
            }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   297
        }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   298
1497
cd3234c89e59 6764622: IdealGraphVisualizer fixes
never
parents: 766
diff changeset
   299
        for (Property p : firstNode.getProperties()) {
cd3234c89e59 6764622: IdealGraphVisualizer fixes
never
parents: 766
diff changeset
   300
            String s = otherNode.getProperties().get(p.getName());
766
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   301
            if (s == null && p.getValue().length() > 0) {
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   302
                difference = true;
1497
cd3234c89e59 6764622: IdealGraphVisualizer fixes
never
parents: 766
diff changeset
   303
                n.getProperties().setProperty(OLD_PREFIX + p.getName(), "");
766
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   304
            }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   305
        }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   306
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   307
        if (difference) {
1497
cd3234c89e59 6764622: IdealGraphVisualizer fixes
never
parents: 766
diff changeset
   308
            n.getProperties().setProperty(PROPERTY_STATE, VALUE_CHANGED);
766
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   309
        } else {
1497
cd3234c89e59 6764622: IdealGraphVisualizer fixes
never
parents: 766
diff changeset
   310
            n.getProperties().setProperty(PROPERTY_STATE, VALUE_SAME);
766
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   311
        }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   312
    }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   313
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   314
    private static void markAsDeleted(InputNode n) {
1497
cd3234c89e59 6764622: IdealGraphVisualizer fixes
never
parents: 766
diff changeset
   315
        n.getProperties().setProperty(PROPERTY_STATE, VALUE_DELETED);
766
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   316
    }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   317
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   318
    private static void markAsNew(InputNode n) {
1497
cd3234c89e59 6764622: IdealGraphVisualizer fixes
never
parents: 766
diff changeset
   319
        n.getProperties().setProperty(PROPERTY_STATE, VALUE_NEW);
766
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   320
    }
d3e5868ddb33 6604014: add support for ideal graph visualizer
never
parents:
diff changeset
   321
}