Ticket #15316: 15316-v2.patch

File 15316-v2.patch, 4.8 KB (added by GerdP, 7 years ago)

improved version

  • 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;
     
    9191    private void addMissingHistoryIds(Iterable<HistoryOsmPrimitive> primitives) {
    9292        for (HistoryOsmPrimitive p : primitives) {
    9393            addIfMissing(p.getPrimitiveId());
    94             if (p.getType() == OsmPrimitiveType.WAY) {
    95                 for (long nd : ((HistoryWay) p).getNodes()) {
    96                     addIfMissing(new SimplePrimitiveId(nd, OsmPrimitiveType.NODE));
    97                 }
    98             }
    9994        }
    10095    }
    10196
    102     private void addMissingIds(Iterable<OsmPrimitive> primitives) {
    103         for (OsmPrimitive p : primitives) {
    104             addIfMissing(p);
    105             if (p.getType() == OsmPrimitiveType.WAY) {
    106                 for (Node nd : ((Way) p).getNodes()) {
    107                     addIfMissing(nd);
    108                 }
     97    private void addMissingId(OsmPrimitive p) {
     98        addIfMissing(p);
     99        if (p.getType() == OsmPrimitiveType.WAY) {
     100            for (Node nd : ((Way) p).getNodes()) {
     101                addIfMissing(nd);
    109102            }
    110103        }
    111104    }
     
    232225            nds = rdr.parseOsm(progressMonitor.createSubTaskMonitor(1, true));
    233226            for (OsmPrimitive p : nds.allPrimitives()) {
    234227                if (!p.isIncomplete()) {
    235                     addMissingIds(Collections.singleton(p));
     228                    addMissingId(p);
    236229                } else {
    237230                    if (ds.getPrimitiveById(p.getPrimitiveId()) == null) {
    238231                        switch (p.getType()) {
     
    343336     *
    344337     */
    345338    public List<Command> getCommands() {
    346         if (this.nds == null) return null;
     339        List<Command> cmds = new ArrayList<>();
     340        if (this.nds == null) return cmds;
    347341
    348342        //////////////////////////////////////////////////////////////////////////
    349343        // Create commands to restore/update all affected objects
    350344        DataSetCommandMerger merger = new DataSetCommandMerger(nds, ds);
    351         List<Command> cmds = merger.getCommandList();
     345        cmds.addAll(merger.getCommandList());
    352346
    353347        //////////////////////////////////////////////////////////////////////////
    354348        // Create a set of objects to be deleted
     
    443437            if (!n.isDeleted() && n.getCoor() == null) {
    444438                PrimitiveId id = n.getPrimitiveId();
    445439                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();
    454                         }
    455                     }
    456                     if (coor != null) {
    457                         n.setCoor(coor);
    458                     }
     440                if (p instanceof Node && !((Node) p).isLatLonKnown()) {
     441                        int version = p.getVersion();
     442                        while (version > 1) {
     443                                // find the version that was in use when the current changeset was closed
     444                                --version;
     445                                final OsmServerMultiObjectReader rdr = new OsmServerMultiObjectReader();
     446                                readObjectVersion(rdr, id, version, progressMonitor);
     447                                DataSet history = rdr.parseOsm(progressMonitor.createSubTaskMonitor(1, true));
     448                                if (!history.isEmpty() ) {
     449                                        Node historyNode = (Node) history.allPrimitives().iterator().next();
     450                                        if (historyNode.isLatLonKnown() && changeset.getClosedAt().after(historyNode.getTimestamp())) {
     451                                                n.load(historyNode.save());
     452                                                break;
     453                                        }
     454                                }
     455                        }
    459456                }
    460457            }
    461458        }