Changeset 2433 in josm for trunk/src


Ignore:
Timestamp:
2009-11-10T21:25:40+01:00 (12 years ago)
Author:
Gubaer
Message:

Improved test cases for MergeVisitor.
Moved MergeVisitor and removed Visitor-pattern. Double-dispatching isn't necessary and only slows down the merge process.

Location:
trunk/src/org/openstreetmap/josm
Files:
9 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/actions/DownloadReferrersAction.java

    r2343 r2433  
    1818import org.openstreetmap.josm.Main;
    1919import org.openstreetmap.josm.data.osm.DataSet;
     20import org.openstreetmap.josm.data.osm.DataSetMerger;
    2021import org.openstreetmap.josm.data.osm.OsmPrimitive;
    2122import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    22 import org.openstreetmap.josm.data.osm.visitor.MergeVisitor;
    2323import org.openstreetmap.josm.gui.PleaseWaitRunnable;
    2424import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     
    210210            }
    211211
    212             MergeVisitor visitor = new MergeVisitor(targetLayer.data, parents);
     212            DataSetMerger visitor = new DataSetMerger(targetLayer.data, parents);
    213213            visitor.merge();
    214214            SwingUtilities.invokeLater(
     
    239239                reader = null;
    240240            }
    241             MergeVisitor visitor = new MergeVisitor(parents, ds);
     241            DataSetMerger visitor = new DataSetMerger(parents, ds);
    242242            visitor.merge();
    243243        }
  • trunk/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java

    r2381 r2433  
    1515import org.openstreetmap.josm.Main;
    1616import org.openstreetmap.josm.data.osm.DataSet;
     17import org.openstreetmap.josm.data.osm.DataSetMerger;
    1718import org.openstreetmap.josm.data.osm.Node;
    1819import org.openstreetmap.josm.data.osm.OsmPrimitive;
     
    2021import org.openstreetmap.josm.data.osm.Relation;
    2122import org.openstreetmap.josm.data.osm.Way;
    22 import org.openstreetmap.josm.data.osm.visitor.MergeVisitor;
    2323import org.openstreetmap.josm.gui.ExceptionDialogUtil;
    2424import org.openstreetmap.josm.gui.PleaseWaitRunnable;
     
    213213                initMultiFetchReaderWithRelations(reader);
    214214                theirDataSet = reader.parseOsm(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
    215                 MergeVisitor merger = new MergeVisitor(ds, theirDataSet);
     215                DataSetMerger merger = new DataSetMerger(ds, theirDataSet);
    216216                merger.merge();
    217217                // a ways loaded with MultiFetch may be incomplete because at least one of its
     
    223223                        OsmServerObjectReader reader = new OsmServerObjectReader(w.getId(), OsmPrimitiveType.WAY, true /* full */);
    224224                        theirDataSet = reader.parseOsm(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
    225                         merger = new MergeVisitor(ds, theirDataSet);
     225                        merger = new DataSetMerger(ds, theirDataSet);
    226226                        merger.merge();
    227227                    }
  • trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java

    r2418 r2433  
    1 package org.openstreetmap.josm.data.osm.visitor;
     1package org.openstreetmap.josm.data.osm;
    22
    33import static org.openstreetmap.josm.tools.I18n.tr;
     
    1313
    1414import org.openstreetmap.josm.data.conflict.ConflictCollection;
    15 import org.openstreetmap.josm.data.osm.DataSet;
    16 import org.openstreetmap.josm.data.osm.Node;
    17 import org.openstreetmap.josm.data.osm.OsmPrimitive;
    18 import org.openstreetmap.josm.data.osm.Relation;
    19 import org.openstreetmap.josm.data.osm.RelationMember;
    20 import org.openstreetmap.josm.data.osm.Way;
    2115
    2216/**
    23  * A visitor that gets a data set at construction time and merges every visited object
    24  * into it.
    25  *
     17 * A dataset merger which takes a target and a source dataset and merges the source data set
     18 * onto the target dataset.
     19 * 
    2620 */
    27 public class MergeVisitor extends AbstractVisitor {
    28     private static Logger logger = Logger.getLogger(MergeVisitor.class.getName());
     21public class DataSetMerger {
     22    private static Logger logger = Logger.getLogger(DataSetMerger.class.getName());
    2923
    3024    /** the collection of conflicts created during merging */
     
    5145     * The visitor will merge <code>theirDataSet</code> onto <code>myDataSet</code>
    5246     *
    53      * @param myDataSet  dataset with my primitives
    54      * @param theirDataSet dataset with their primitives.
    55      */
    56     public MergeVisitor(DataSet myDataSet, DataSet theirDataSet) {
     47     * @param myDataSet  dataset with my primitives. Must not be null.
     48     * @param theirDataSet dataset with their primitives. Ignored, if null.
     49     * @throws IllegalArgumentException thrown if myDataSet is null
     50     */
     51    public DataSetMerger(DataSet myDataSet, DataSet theirDataSet) throws IllegalArgumentException {
     52        if (myDataSet == null)
     53            throw new IllegalArgumentException(tr("Parameter ''{0}'' must not be null"));
    5754        this.myDataSet = myDataSet;
    5855        this.theirDataSet = theirDataSet;
     
    8279            //
    8380            if (mergeById(other))
     81                return;
     82            if (!other.isVisible())
     83                // ignore it
    8484                return;
    8585        } else {
     
    116116            }
    117117        }
     118
    118119        // If we get here we didn't find a suitable primitive in
    119120        // my dataset. Create a clone and add it to my dataset.
     
    129130        mergedMap.put(other.getUniqueId(), my.getUniqueId());
    130131        fixReferences.add(other.getUniqueId());
    131     }
    132 
    133     public void visit(Node other) {
    134         mergePrimitive(other);
    135     }
    136 
    137     public void visit(Way other) {
    138         mergePrimitive(other);
    139     }
    140 
    141     public void visit(Relation other) {
    142         mergePrimitive(other);
    143132    }
    144133
     
    357346     */
    358347    public void merge() {
     348        if (theirDataSet == null)
     349            return;
    359350        for (Node node: theirDataSet.getNodes()) {
    360             node.visit(this);
     351            mergePrimitive(node);
    361352        }
    362353        for (Way way: theirDataSet.getWays()) {
    363             way.visit(this);
     354            mergePrimitive(way);
    364355        }
    365356        for (Relation relation: theirDataSet.getRelations()) {
    366             relation.visit(this);
     357            mergePrimitive(relation);
    367358        }
    368359        fixReferences();
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/ChildRelationBrowser.java

    r2381 r2433  
    3030import org.openstreetmap.josm.Main;
    3131import org.openstreetmap.josm.data.osm.DataSet;
     32import org.openstreetmap.josm.data.osm.DataSetMerger;
    3233import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    3334import org.openstreetmap.josm.data.osm.Relation;
    3435import org.openstreetmap.josm.data.osm.RelationMember;
    35 import org.openstreetmap.josm.data.osm.visitor.MergeVisitor;
    3636import org.openstreetmap.josm.gui.DefaultNameFormatter;
    3737import org.openstreetmap.josm.gui.ExceptionDialogUtil;
     
    380380        protected void mergeDataSet(DataSet ds) {
    381381            if (ds != null) {
    382                 final MergeVisitor visitor = new MergeVisitor(getLayer().data, ds);
     382                final DataSetMerger visitor = new DataSetMerger(getLayer().data, ds);
    383383                visitor.merge();
    384384                // FIXME: this is necessary because there are dialogs listening
     
    490490        protected void mergeDataSet(DataSet dataSet) {
    491491            if (dataSet != null) {
    492                 final MergeVisitor visitor = new MergeVisitor(getLayer().data, dataSet);
     492                final DataSetMerger visitor = new DataSetMerger(getLayer().data, dataSet);
    493493                visitor.merge();
    494494                // FIXME: this is necessary because there are dialogs listening
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java

    r2381 r2433  
    5757import org.openstreetmap.josm.data.osm.DataSet;
    5858import org.openstreetmap.josm.data.osm.DataSource;
     59import org.openstreetmap.josm.data.osm.DataSetMerger;
    5960import org.openstreetmap.josm.data.osm.OsmPrimitive;
    6061import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    6162import org.openstreetmap.josm.data.osm.Relation;
    6263import org.openstreetmap.josm.data.osm.RelationMember;
    63 import org.openstreetmap.josm.data.osm.visitor.MergeVisitor;
    6464import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
    6565import org.openstreetmap.josm.gui.DefaultNameFormatter;
     
    14471447                    if (dataSet != null) {
    14481448                        changed = true;
    1449                         final MergeVisitor visitor = new MergeVisitor(curLayer.data, dataSet);
     1449                        final DataSetMerger visitor = new DataSetMerger(curLayer.data, dataSet);
    14501450                        visitor.merge();
    14511451
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/ParentRelationLoadingTask.java

    r2401 r2433  
    1414import org.openstreetmap.josm.data.osm.DataSet;
    1515import org.openstreetmap.josm.data.osm.DataSource;
     16import org.openstreetmap.josm.data.osm.DataSetMerger;
    1617import org.openstreetmap.josm.data.osm.Relation;
    17 import org.openstreetmap.josm.data.osm.visitor.MergeVisitor;
    1818import org.openstreetmap.josm.gui.PleaseWaitRunnable;
    1919import org.openstreetmap.josm.gui.layer.OsmDataLayer;
     
    164164            referrers = reader.parseOsm(progressMonitor.createSubTaskMonitor(1, false));
    165165            if (referrers != null) {
    166                 final MergeVisitor visitor = new MergeVisitor(getLayer().data, referrers);
     166                final DataSetMerger visitor = new DataSetMerger(getLayer().data, referrers);
    167167                visitor.merge();
    168168
  • trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationTree.java

    r2273 r2433  
    1818import org.openstreetmap.josm.Main;
    1919import org.openstreetmap.josm.data.osm.DataSet;
     20import org.openstreetmap.josm.data.osm.DataSetMerger;
    2021import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    2122import org.openstreetmap.josm.data.osm.Relation;
    22 import org.openstreetmap.josm.data.osm.visitor.MergeVisitor;
    2323import org.openstreetmap.josm.gui.PleaseWaitRunnable;
    2424import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
     
    136136                return;
    137137            }
    138             MergeVisitor visitor = new MergeVisitor(Main.main.getEditLayer().data, ds);
     138            DataSetMerger visitor = new DataSetMerger(Main.main.getEditLayer().data, ds);
    139139            visitor.merge();
    140140            if (! visitor.getConflicts().isEmpty()) {
  • trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java

    r2414 r2433  
    5050import org.openstreetmap.josm.data.osm.DataSet;
    5151import org.openstreetmap.josm.data.osm.DataSource;
     52import org.openstreetmap.josm.data.osm.DataSetMerger;
    5253import org.openstreetmap.josm.data.osm.Node;
    5354import org.openstreetmap.josm.data.osm.OsmPrimitive;
     
    5758import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
    5859import org.openstreetmap.josm.data.osm.visitor.MapPaintVisitor;
    59 import org.openstreetmap.josm.data.osm.visitor.MergeVisitor;
    6060import org.openstreetmap.josm.data.osm.visitor.SimplePaintVisitor;
    6161import org.openstreetmap.josm.gui.HelpAwareOptionPane;
     
    277277     */
    278278    public void mergeFrom(final DataSet from) {
    279         final MergeVisitor visitor = new MergeVisitor(data,from);
     279        final DataSetMerger visitor = new DataSetMerger(data,from);
    280280        visitor.merge();
    281281
  • trunk/src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java

    r2273 r2433  
    1414
    1515import org.openstreetmap.josm.data.osm.DataSet;
     16import org.openstreetmap.josm.data.osm.DataSetMerger;
    1617import org.openstreetmap.josm.data.osm.Node;
    1718import org.openstreetmap.josm.data.osm.OsmPrimitive;
     
    2021import org.openstreetmap.josm.data.osm.RelationMember;
    2122import org.openstreetmap.josm.data.osm.Way;
    22 import org.openstreetmap.josm.data.osm.visitor.MergeVisitor;
    2323import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
    2424import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     
    387387     */
    388388    protected void merge(DataSet from) {
    389         final MergeVisitor visitor = new MergeVisitor(outputDataSet,from);
     389        final DataSetMerger visitor = new DataSetMerger(outputDataSet,from);
    390390        visitor.merge();
    391391    }
  • trunk/src/org/openstreetmap/josm/io/OsmServerBackreferenceReader.java

    r2381 r2433  
    99
    1010import org.openstreetmap.josm.data.osm.DataSet;
     11import org.openstreetmap.josm.data.osm.DataSetMerger;
    1112import org.openstreetmap.josm.data.osm.OsmPrimitive;
    1213import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    1314import org.openstreetmap.josm.data.osm.Relation;
    1415import org.openstreetmap.josm.data.osm.Way;
    15 import org.openstreetmap.josm.data.osm.visitor.MergeVisitor;
    1616import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
    1717import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     
    227227                        OsmServerObjectReader reader = new OsmServerObjectReader(way.getId(), OsmPrimitiveType.from(way), true /* read full */);
    228228                        DataSet wayDs = reader.parseOsm(progressMonitor.createSubTaskMonitor(1, false));
    229                         MergeVisitor visitor = new MergeVisitor(ds, wayDs);
     229                        DataSetMerger visitor = new DataSetMerger(ds, wayDs);
    230230                        visitor.merge();
    231231                    }
     
    238238                        OsmServerObjectReader reader = new OsmServerObjectReader(relation.getId(), OsmPrimitiveType.from(relation), true /* read full */);
    239239                        DataSet wayDs = reader.parseOsm(progressMonitor.createSubTaskMonitor(1, false));
    240                         MergeVisitor visitor = new MergeVisitor(ds, wayDs);
     240                        DataSetMerger visitor = new DataSetMerger(ds, wayDs);
    241241                        visitor.merge();
    242242                    }
     
    267267            if (primitiveType.equals(OsmPrimitiveType.NODE)) {
    268268                DataSet ds = getReferringWays(progressMonitor.createSubTaskMonitor(1, false));
    269                 MergeVisitor visitor = new MergeVisitor(ret,ds);
     269                DataSetMerger visitor = new DataSetMerger(ret,ds);
    270270                visitor.merge();
    271271                ret = visitor.getMyDataSet();
    272272            }
    273273            DataSet ds = getReferringRelations(progressMonitor.createSubTaskMonitor(1, false));
    274             MergeVisitor visitor = new MergeVisitor(ret,ds);
     274            DataSetMerger visitor = new DataSetMerger(ret,ds);
    275275            visitor.merge();
    276276            ret = visitor.getMyDataSet();
Note: See TracChangeset for help on using the changeset viewer.