Ticket #5293: ticket5293.patch

File ticket5293.patch, 2.4 KB (added by lordsutch, 13 years ago)

Patch for duplicate downloads

  • src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java

     
    77import java.io.IOException;
    88import java.text.MessageFormat;
    99import java.util.Collection;
     10import java.util.Set;
     11import java.util.HashSet;
    1012import java.util.HashMap;
    1113import java.util.Map;
    1214import java.util.Map.Entry;
     
    1719import org.openstreetmap.josm.Main;
    1820import org.openstreetmap.josm.data.osm.DataSet;
    1921import org.openstreetmap.josm.data.osm.DataSetMerger;
     22import org.openstreetmap.josm.data.osm.Node;
    2023import org.openstreetmap.josm.data.osm.OsmPrimitive;
    2124import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    2225import org.openstreetmap.josm.data.osm.PrimitiveId;
     
    192195            reader = null;
    193196        }
    194197        Collection<Way> ways = ds.getWays();
     198
    195199        DataSetMerger merger;
    196200        if (!ways.isEmpty()) {
    197             reader = new MultiFetchServerObjectReader();
     201            Set<Node> nodes = new HashSet<Node>();
    198202            for (Way w: ways) {
    199                 ((MultiFetchServerObjectReader)reader).append(w.getNodes());
     203                // Ensure each node is only listed once
     204                nodes.addAll(w.getNodes());
    200205            }
    201             DataSet wayNodes = reader.parseOsm(progressMonitor.createSubTaskMonitor(1, false));
    202             synchronized(this) { // avoid race condition in cancel()
    203                 reader = null;
     206            // Don't retrieve any nodes we've already grabbed
     207            nodes.removeAll(parents.getNodes());
     208            if (!nodes.isEmpty()) {
     209                reader = new MultiFetchServerObjectReader();
     210                ((MultiFetchServerObjectReader)reader).append(nodes);
     211                DataSet wayNodes = reader.parseOsm(progressMonitor.createSubTaskMonitor(1, false));
     212                synchronized(this) { // avoid race condition in cancel()
     213                    reader = null;
     214                }
     215                merger = new DataSetMerger(ds, wayNodes);
     216                merger.merge();
    204217            }
    205             merger = new DataSetMerger(ds, wayNodes);
    206             merger.merge();
    207218        }
    208219        merger = new DataSetMerger(parents, ds);
    209220        merger.merge();