Ticket #18624: 18624.2.patch
| File 18624.2.patch, 5.9 KB (added by , 6 years ago) |
|---|
-
src/org/openstreetmap/josm/actions/downloadtasks/DownloadReferrersTask.java
7 7 import java.io.IOException; 8 8 import java.text.MessageFormat; 9 9 import java.util.Collection; 10 import java.util.HashMap; 11 import java.util.Map; 12 import java.util.Map.Entry; 10 import java.util.LinkedHashSet; 13 11 import java.util.Set; 14 12 import java.util.stream.Collectors; 15 13 … … 47 45 /** the target layer */ 48 46 private final OsmDataLayer targetLayer; 49 47 /** the collection of child primitives */ 50 private final Map<Long, OsmPrimitiveType> children;48 private final Set<PrimitiveId> children; 51 49 /** the parents */ 52 50 private final DataSet parents; 53 51 … … 64 62 throw new IllegalArgumentException("Non-downloadable layer: " + targetLayer); 65 63 } 66 64 canceled = false; 67 this.children = new HashMap<>();65 this.children = new LinkedHashSet<>(); 68 66 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); 74 68 } 69 75 70 this.targetLayer = targetLayer; 76 71 parents = new DataSet(); 77 72 } … … 93 88 throw new IllegalArgumentException(MessageFormat.format( 94 89 "Cannot download referrers for new primitives (ID {0})", primitiveId.getUniqueId())); 95 90 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); 98 93 this.targetLayer = targetLayer; 99 94 parents = new DataSet(); 100 95 } … … 140 135 } 141 136 142 137 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 144 140 DataSet ds = reader.parseOsm(progressMonitor.createSubTaskMonitor(1, false)); 145 141 synchronized (this) { // avoid race condition in cancel() 146 142 reader = null; 147 143 } 148 Collection<Way> ways = ds.getWays();149 150 if (!ways.isEmpty()) {151 // Ensure each node is only listed once152 Set<Node> nodes = ways.stream().flatMap(w -> w.getNodes().stream()).collect(Collectors.toSet());153 // Don't retrieve any nodes we've already grabbed154 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 }165 144 new DataSetMerger(parents, ds).merge(); 166 145 } 167 146 … … 170 149 try { 171 150 progressMonitor.setTicksCount(children.size()); 172 151 int i = 1; 173 for ( Entry<Long, OsmPrimitiveType> entry: children.entrySet()) {152 for (PrimitiveId p : children) { 174 153 if (canceled) 175 154 return; 176 155 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; 181 161 default: throw new AssertionError(); 182 162 } 183 163 progressMonitor.subTask(msg); 184 downloadParents( entry.getKey(), entry.getValue(), progressMonitor);164 downloadParents(p.getUniqueId(), p.getType(), progressMonitor); 185 165 i++; 186 166 } 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 187 184 } catch (OsmTransferException e) { 188 185 if (canceled) 189 186 return;
