Ticket #18624: 18624.2.patch

File 18624.2.patch, 5.9 KB (added by GerdP, 2 months ago)
  • src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java

     
    77import java.io.IOException;
    88import java.text.MessageFormat;
    99import java.util.Collection;
    10 import java.util.HashMap;
    11 import java.util.Map;
    12 import java.util.Map.Entry;
     10import java.util.LinkedHashSet;
    1311import java.util.Set;
    1412import java.util.stream.Collectors;
    1513
     
    4745    /** the target layer */
    4846    private final OsmDataLayer targetLayer;
    4947    /** the collection of child primitives */
    50     private final Map<Long, OsmPrimitiveType> children;
     48    private final Set<PrimitiveId> children;
    5149    /** the parents */
    5250    private final DataSet parents;
    5351
     
    6462            throw new IllegalArgumentException("Non-downloadable layer: " + targetLayer);
    6563        }
    6664        canceled = false;
    67         this.children = new HashMap<>();
     65        this.children = new LinkedHashSet<>();
    6866        if (children != null) {
    69             for (OsmPrimitive p: children) {
    70                 if (!p.isNew()) {
    71                     this.children.put(p.getId(), OsmPrimitiveType.from(p));
    72                 }
    73             }
     67            children.stream().filter(p -> !p.isNew()).forEach(this.children::add);
    7468        }
     69
    7570        this.targetLayer = targetLayer;
    7671        parents = new DataSet();
    7772    }
     
    9388            throw new IllegalArgumentException(MessageFormat.format(
    9489                    "Cannot download referrers for new primitives (ID {0})", primitiveId.getUniqueId()));
    9590        canceled = false;
    96         this.children = new HashMap<>();
    97         this.children.put(primitiveId.getUniqueId(), primitiveId.getType());
     91        this.children = new LinkedHashSet<>();
     92        this.children.add(primitiveId);
    9893        this.targetLayer = targetLayer;
    9994        parents = new DataSet();
    10095    }
     
    140135    }
    141136
    142137    protected void downloadParents(long id, OsmPrimitiveType type, ProgressMonitor progressMonitor) throws OsmTransferException {
    143         reader = new OsmServerBackreferenceReader(id, type);
     138        reader = new OsmServerBackreferenceReader(id, type, false).setAllowIncompleteParentWays(true);
     139
    144140        DataSet ds = reader.parseOsm(progressMonitor.createSubTaskMonitor(1, false));
    145141        synchronized (this) { // avoid race condition in cancel()
    146142            reader = null;
    147143        }
    148         Collection<Way> ways = ds.getWays();
    149 
    150         if (!ways.isEmpty()) {
    151             // Ensure each node is only listed once
    152             Set<Node> nodes = ways.stream().flatMap(w -> w.getNodes().stream()).collect(Collectors.toSet());
    153             // Don't retrieve any nodes we've already grabbed
    154             nodes.removeAll(targetLayer.data.getNodes());
    155             if (!nodes.isEmpty()) {
    156                 reader = MultiFetchServerObjectReader.create();
    157                 ((MultiFetchServerObjectReader) reader).append(nodes);
    158                 DataSet wayNodes = reader.parseOsm(progressMonitor.createSubTaskMonitor(1, false));
    159                 synchronized (this) { // avoid race condition in cancel()
    160                     reader = null;
    161                 }
    162                 new DataSetMerger(ds, wayNodes).merge();
    163             }
    164         }
    165144        new DataSetMerger(parents, ds).merge();
    166145    }
    167146
     
    170149        try {
    171150            progressMonitor.setTicksCount(children.size());
    172151            int i = 1;
    173             for (Entry<Long, OsmPrimitiveType> entry: children.entrySet()) {
     152            for (PrimitiveId p : children) {
    174153                if (canceled)
    175154                    return;
    176155                String msg;
    177                 switch(entry.getValue()) {
    178                 case NODE: msg = tr("({0}/{1}) Loading parents of node {2}", i+1, children.size(), entry.getKey()); break;
    179                 case WAY: msg = tr("({0}/{1}) Loading parents of way {2}", i+1, children.size(), entry.getKey()); break;
    180                 case RELATION: msg = tr("({0}/{1}) Loading parents of relation {2}", i+1, children.size(), entry.getKey()); break;
     156                String id = Long.toString(p.getUniqueId());
     157                switch(p.getType()) {
     158                case NODE: msg = tr("({0}/{1}) Loading parents of node {2}", i, children.size(), id); break;
     159                case WAY: msg = tr("({0}/{1}) Loading parents of way {2}", i, children.size(), id); break;
     160                case RELATION: msg = tr("({0}/{1}) Loading parents of relation {2}", i, children.size(), id); break;
    181161                default: throw new AssertionError();
    182162                }
    183163                progressMonitor.subTask(msg);
    184                 downloadParents(entry.getKey(), entry.getValue(), progressMonitor);
     164                downloadParents(p.getUniqueId(), p.getType(), progressMonitor);
    185165                i++;
    186166            }
     167            Collection<Way> ways = parents.getWays();
     168
     169            if (!ways.isEmpty()) {
     170                // Collect incomplete nodes of parent ways
     171                Set<Node> nodes = ways.stream().flatMap(w -> w.getNodes().stream().filter(OsmPrimitive::isIncomplete))
     172                        .collect(Collectors.toSet());
     173                if (!nodes.isEmpty()) {
     174                    reader = MultiFetchServerObjectReader.create();
     175                    ((MultiFetchServerObjectReader) reader).append(nodes);
     176                    DataSet wayNodes = reader.parseOsm(progressMonitor.createSubTaskMonitor(1, false));
     177                    synchronized (this) { // avoid race condition in cancel()
     178                        reader = null;
     179                    }
     180                    new DataSetMerger(parents, wayNodes).merge();
     181                }
     182            }
     183
    187184        } catch (OsmTransferException e) {
    188185            if (canceled)
    189186                return;