Changeset 2978 in josm for trunk/src/org/openstreetmap


Ignore:
Timestamp:
2010-02-14T12:00:24+01:00 (14 years ago)
Author:
jttt
Message:

Fix #4521 org.openstreetmap.josm.data.osm.DataIntegrityProblemException: Nodes in way must be in the same dataset

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java

    r2845 r2978  
    11// License: GPL. For details, see LICENSE file.
    22package org.openstreetmap.josm.data.osm.visitor;
    3 
    4 import static org.openstreetmap.josm.tools.I18n.tr;
    53
    64import java.util.ArrayList;
     
    119import org.openstreetmap.josm.data.osm.Node;
    1210import org.openstreetmap.josm.data.osm.OsmPrimitive;
     11import org.openstreetmap.josm.data.osm.PrimitiveData;
    1312import org.openstreetmap.josm.data.osm.Relation;
     13import org.openstreetmap.josm.data.osm.RelationData;
    1414import org.openstreetmap.josm.data.osm.RelationMember;
     15import org.openstreetmap.josm.data.osm.RelationMemberData;
    1516import org.openstreetmap.josm.data.osm.Way;
     17import org.openstreetmap.josm.data.osm.WayData;
    1618import org.openstreetmap.josm.tools.CheckParameterUtil;
    1719
     
    3032    private DataSet selectionBase;
    3133    private DataSet hull;
    32     private HashMap<OsmPrimitive, OsmPrimitive> mappedPrimitives;
     34    private HashMap<OsmPrimitive, PrimitiveData> mappedPrimitives;
    3335
    3436    /**
     
    4547        this.selectionBase = selectionBase;
    4648        this.hull = new DataSet();
    47         this.mappedPrimitives = new HashMap<OsmPrimitive, OsmPrimitive>();
     49        this.mappedPrimitives = new HashMap<OsmPrimitive, PrimitiveData>();
    4850    }
    4951
     
    6466        if (isAlreadyRemembered(n))
    6567            return;
    66         Node clone = new Node(n);
    67         mappedPrimitives.put(n, clone);
     68        mappedPrimitives.put(n, n.save());
    6869    }
    6970
     
    7677        if (isAlreadyRemembered(w))
    7778            return;
    78         Way clone = new Way(w);
    79         List<Node> newNodes = new ArrayList<Node>(w.getNodesCount());
     79        WayData clone = w.save();
     80        List<Long> newNodes = new ArrayList<Long>(w.getNodesCount());
    8081        for (Node n: w.getNodes()) {
    81             newNodes.add((Node)mappedPrimitives.get(n));
     82            newNodes.add(mappedPrimitives.get(n).getUniqueId());
    8283        }
    8384        clone.setNodes(newNodes);
     
    9192     */
    9293    protected void rememberRelation(Relation r) {
    93         Relation clone;
     94        RelationData clone;
    9495        if (isAlreadyRemembered(r)) {
    95             clone = (Relation)mappedPrimitives.get(r);
    96             clone.cloneFrom(r);
     96            clone = (RelationData)mappedPrimitives.get(r);
    9797        } else {
    98             clone = new Relation(r);
     98            clone = r.save();
     99            mappedPrimitives.put(r, clone);
    99100        }
    100101
    101         List<RelationMember> newMembers = new ArrayList<RelationMember>();
     102        List<RelationMemberData> newMembers = new ArrayList<RelationMemberData>();
    102103        for (RelationMember member: r.getMembers()) {
    103104            newMembers.add(
    104                     new RelationMember(member.getRole(), mappedPrimitives.get(member.getMember())));
     105                    new RelationMemberData(member.getRole(), mappedPrimitives.get(member.getMember())));
    105106
    106107        }
    107108        clone.setMembers(newMembers);
    108 
    109         if (!isAlreadyRemembered(r)) {
    110             mappedPrimitives.put(r, clone);
    111         }
    112109    }
    113110
     
    115112        if (isAlreadyRemembered(r))
    116113            return;
    117         Relation clone = new Relation(r);
    118         clone.setMembers(null);
     114        RelationData clone = r.save();
     115        clone.getMembers().clear();
    119116        mappedPrimitives.put(r, clone);
    120117    }
     
    123120        if (isAlreadyRemembered(primitive))
    124121            return;
    125         OsmPrimitive clone = null;
    126         if (primitive instanceof Node) {
    127             clone = new Node(primitive.getId());
    128         } else if (primitive instanceof Way) {
    129             clone = new Way(primitive.getId());
    130         } else if (primitive instanceof Relation) {
    131             clone = new Relation(primitive.getId());
    132         }
     122        PrimitiveData clone = primitive.save();
     123        clone.setIncomplete(true);
    133124        mappedPrimitives.put(primitive, clone);
    134     }
    135 
    136     protected void rememberNodeIncomplete(Node n) {
    137         if (!isAlreadyRemembered(n)) {
    138             mappedPrimitives.put(n, new Node(n.getId()));
    139         }
    140     }
    141 
    142     protected void rememberWayIncomplete(Way w) {
    143         if (!isAlreadyRemembered(w)) {
    144             mappedPrimitives.put(w, new Way(w.getId()));
    145         }
    146     }
    147 
    148     protected void rememberRelationIncomplete(Relation r) {
    149         if (!isAlreadyRemembered(r)) {
    150             mappedPrimitives.put(r, new Relation(r.getId()));
    151         }
    152125    }
    153126
     
    177150                continue;
    178151            }
    179             if (member.isNode()) {
    180                 Node node = member.getNode();
    181                 if (isInSelectionBase(node)) {
    182                     rememberNode(node);
    183                 } else if (node.isNew()) {
    184                     rememberNode(node);
    185                 } else  {
    186                     rememberNodeIncomplete(node);
    187                 }
    188             } else if (member.isWay()) {
    189                 Way way = member.getWay();
    190                 if (isInSelectionBase(way)) {
    191                     way.visit(this);
    192                 } else if (way.isNew()) {
    193                     way.visit(this);
    194                 } else {
    195                     rememberWayIncomplete(way);
    196                 }
    197             } else if (member.isRelation()) {
    198                 Relation relation = member.getRelation();
    199                 if (isInSelectionBase(member.getMember())) {
    200                     relation.visit(this);
    201                 } else if (relation.isNew()) {
    202                     relation.visit(this);
    203                 } else {
    204                     rememberRelationIncomplete(relation);
    205                 }
     152            if (isInSelectionBase(member.getMember()) || member.getMember().isNew()) {
     153                member.getMember().visit(this);
     154            } else {
     155                rememberIncomplete(member.getMember());
    206156            }
    207157        }
     
    210160
    211161    protected void buildHull() {
    212         for (OsmPrimitive primitive : mappedPrimitives.keySet()) {
    213             OsmPrimitive clone = mappedPrimitives.get(primitive);
    214             hull.addPrimitive(clone);
     162        // Create all primitives first
     163        for (PrimitiveData primitive: mappedPrimitives.values()) {
     164            hull.getPrimitiveById(primitive, true);
     165        }
     166        // Then fill them with data
     167        for (PrimitiveData primitive : mappedPrimitives.values()) {
     168            if (!primitive.isIncomplete()) {
     169                hull.getPrimitiveById(primitive).load(primitive);
     170            }
    215171        }
    216172    }
Note: See TracChangeset for help on using the changeset viewer.