Ticket #15316: 15316.patch

File 15316.patch, 3.8 KB (added by GerdP, 7 years ago)
  • src/reverter/ChangesetReverter.java

     
    44import static org.openstreetmap.josm.tools.I18n.tr;
    55
    66import java.net.HttpURLConnection;
     7import java.util.ArrayList;
    78import java.util.Arrays;
    89import java.util.Collection;
    910import java.util.Collections;
     
    2324import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    2425import org.openstreetmap.josm.data.osm.PrimitiveId;
    2526import org.openstreetmap.josm.data.osm.Relation;
    26 import org.openstreetmap.josm.data.osm.RelationMember;
    2727import org.openstreetmap.josm.data.osm.RelationMemberData;
    2828import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
    2929import org.openstreetmap.josm.data.osm.Way;
     
    343343     *
    344344     */
    345345    public List<Command> getCommands() {
    346         if (this.nds == null) return null;
     346        List<Command> cmds = new ArrayList<>();
     347        if (this.nds == null) return cmds;
    347348
    348349        //////////////////////////////////////////////////////////////////////////
    349350        // Create commands to restore/update all affected objects
    350351        DataSetCommandMerger merger = new DataSetCommandMerger(nds, ds);
    351         List<Command> cmds = merger.getCommandList();
     352        cmds.addAll(merger.getCommandList());
    352353
    353354        //////////////////////////////////////////////////////////////////////////
    354355        // Create a set of objects to be deleted
     
    439440    }
    440441
    441442    public void fixNodesWithoutCoordinates(ProgressMonitor progressMonitor) throws OsmTransferException {
     443        DataSet mod = new DataSet();
    442444        for (Node n : nds.getNodes()) {
    443445            if (!n.isDeleted() && n.getCoor() == null) {
    444446                PrimitiveId id = n.getPrimitiveId();
    445447                OsmPrimitive p = ds.getPrimitiveById(id);
    446                 if (p instanceof Node && p.getVersion() > 1) {
    447                     LatLon coor = ((Node) p).getCoor();
    448                     if (coor == null) {
    449                         final OsmServerMultiObjectReader rdr = new OsmServerMultiObjectReader();
    450                         readObjectVersion(rdr, id, p.getVersion()-1, progressMonitor);
    451                         Collection<OsmPrimitive> result = rdr.parseOsm(progressMonitor.createSubTaskMonitor(1, true)).allPrimitives();
    452                         if (!result.isEmpty()) {
    453                             coor = ((Node) result.iterator().next()).getCoor();
     448                if (p instanceof Node) {
     449                    if (p.getVersion() == 1 && ((Node) p).isLatLonKnown()) {
     450                        n.cloneFrom(p);
     451                    } else if (p.getVersion() > 1 && !((Node) p).isLatLonKnown()) {
     452                        int version = p.getVersion() - 1;
     453                        while (version > 0) {
     454                            final OsmServerMultiObjectReader rdr = new OsmServerMultiObjectReader();
     455                            readObjectVersion(rdr, id, version, progressMonitor);
     456                            DataSet history = rdr.parseOsm(progressMonitor.createSubTaskMonitor(1, true));
     457                            if (!history.isEmpty() ) {
     458                                Node historyNode = (Node) history.allPrimitives().iterator().next();
     459                                if (historyNode.isLatLonKnown() && changeset.getClosedAt().after(historyNode.getTimestamp())) {
     460                                    mod.mergeFrom(history);
     461                                    break;
     462                                }
     463                            }
     464                            --version;
    454465                        }
    455466                    }
    456                     if (coor != null) {
    457                         n.setCoor(coor);
    458                     }
    459467                }
    460468            }
    461469        }
     470        nds.mergeFrom(mod);
    462471    }
    463472}