Ticket #18566: 18566-alpha.patch
| File 18566-alpha.patch, 11.9 KB (added by , 6 years ago) |
|---|
-
src/org/openstreetmap/josm/gui/io/AbstractPrimitiveTask.java
20 20 import org.openstreetmap.josm.gui.progress.ProgressMonitor; 21 21 import org.openstreetmap.josm.gui.progress.swing.PleaseWaitProgressMonitor; 22 22 import org.openstreetmap.josm.gui.util.GuiHelper; 23 import org.openstreetmap.josm.io.MultiFetchOverpassObjectReader; 23 24 import org.openstreetmap.josm.io.MultiFetchServerObjectReader; 24 25 import org.openstreetmap.josm.io.OsmServerObjectReader; 25 26 import org.openstreetmap.josm.io.OsmTransferException; … … 41 42 protected OsmServerObjectReader objectReader; 42 43 43 44 private boolean zoom; 44 private boolean downloadRelations;45 45 private boolean fullRelation; 46 46 47 47 protected AbstractPrimitiveTask(String title, OsmDataLayer layer) { … … 70 70 } 71 71 72 72 /** 73 * Sets whether .74 * @param downloadRelations {@code true} if73 * Sets whether all members of the relation should be downloaded completely. 74 * @param downloadRelations ignored since xxx 75 75 * @param fullRelation {@code true} if a full download is required, 76 76 * i.e., a download including the immediate children of a relation. 77 77 * @return {@code this} 78 78 */ 79 79 public final AbstractPrimitiveTask setDownloadRelations(boolean downloadRelations, boolean fullRelation) { 80 this.downloadRelations = downloadRelations;81 80 this.fullRelation = fullRelation; 82 81 return this; 83 82 } … … 103 102 multiObjectReader = MultiFetchServerObjectReader.create(); 104 103 } 105 104 initMultiFetchReader(multiObjectReader); 105 if (multiObjectReader instanceof MultiFetchOverpassObjectReader) { 106 ((MultiFetchOverpassObjectReader) multiObjectReader).setRecurseDownRelations(fullRelation); 107 } 106 108 theirDataSet = multiObjectReader.parseOsm(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false)); 107 109 missingPrimitives = multiObjectReader.getMissingPrimitives(); 108 110 synchronized (this) { … … 110 112 } 111 113 new DataSetMerger(ds, theirDataSet).merge(); 112 114 113 if ( downloadRelations) {115 if (fullRelation) { 114 116 loadIncompleteRelationMembers(); 115 117 } 116 118 -
src/org/openstreetmap/josm/gui/io/UpdatePrimitivesTask.java
5 5 6 6 import java.util.Collection; 7 7 import java.util.Collections; 8 import java.util.stream.Collectors; 8 9 9 import org.openstreetmap.josm.data.osm.Node;10 10 import org.openstreetmap.josm.data.osm.OsmPrimitive; 11 import org.openstreetmap.josm.data.osm.Relation;12 import org.openstreetmap.josm.data.osm.Way;13 11 import org.openstreetmap.josm.gui.layer.OsmDataLayer; 14 12 import org.openstreetmap.josm.io.MultiFetchServerObjectReader; 15 13 … … 32 30 public UpdatePrimitivesTask(OsmDataLayer layer, Collection<? extends OsmPrimitive> toUpdate) { 33 31 super(tr("Update objects"), layer); 34 32 this.toUpdate = toUpdate != null ? toUpdate : Collections.<OsmPrimitive>emptyList(); 33 this.setDownloadRelations(false, false); 35 34 } 36 35 37 protected void initMultiFetchReaderWithNodes(MultiFetchServerObjectReader reader) {38 getProgressMonitor().indeterminateSubTask(tr("Initializing nodes to update ..."));39 for (OsmPrimitive primitive : toUpdate) {40 if (primitive instanceof Node && !primitive.isNew()) {41 reader.append(primitive);42 }43 }44 }45 46 protected void initMultiFetchReaderWithWays(MultiFetchServerObjectReader reader) {47 getProgressMonitor().indeterminateSubTask(tr("Initializing ways to update ..."));48 for (OsmPrimitive primitive : toUpdate) {49 if (primitive instanceof Way && !primitive.isNew()) {50 // this also adds way nodes51 reader.append(primitive);52 }53 }54 }55 56 protected void initMultiFetchReaderWithRelations(MultiFetchServerObjectReader reader) {57 getProgressMonitor().indeterminateSubTask(tr("Initializing relations to update ..."));58 for (OsmPrimitive primitive : toUpdate) {59 if (primitive instanceof Relation && !primitive.isNew()) {60 // this also adds relation members61 reader.append(primitive);62 }63 }64 }65 66 36 @Override 67 37 protected void initMultiFetchReader(MultiFetchServerObjectReader reader) { 68 initMultiFetchReaderWithNodes(reader); 69 initMultiFetchReaderWithWays(reader); 70 initMultiFetchReaderWithRelations(reader); 38 reader.append(toUpdate.stream().filter(p -> !p.isNew()).collect(Collectors.toList())); 71 39 } 72 40 } -
src/org/openstreetmap/josm/io/MultiFetchOverpassObjectReader.java
5 5 import java.util.stream.Collectors; 6 6 7 7 import org.openstreetmap.josm.data.osm.OsmPrimitiveType; 8 import org.openstreetmap.josm.tools.Logging; 8 9 import org.openstreetmap.josm.tools.Utils; 9 10 10 11 /** … … 12 13 * 13 14 * @since 9241 14 15 */ 15 class MultiFetchOverpassObjectReader extends MultiFetchServerObjectReader { 16 public class MultiFetchOverpassObjectReader extends MultiFetchServerObjectReader { 17 private boolean recurseDownRelations = true; 16 18 17 19 @Override 18 20 protected String buildRequestString(final OsmPrimitiveType type, Set<Long> idPackage) { 19 final String query = idPackage.stream() 20 .map(x -> type.getAPIName() + '(' + x + ");>;") 21 .collect(Collectors.joining("", "(", ");out meta;")); 21 final String query = type.getAPIName() + "(id:" 22 + idPackage.stream().map(String::valueOf).collect(Collectors.joining(",")) + ");" 23 + getRecurseOption(type) + "out meta;"; 24 Logging.debug("{0} {1}", "Overpass query:", query); 22 25 return "interpreter?data=" + Utils.encodeUrl(query); 23 26 } 24 27 28 private String getRecurseOption(final OsmPrimitiveType type) { 29 if (type == OsmPrimitiveType.WAY) 30 return ">;"; 31 if (type == OsmPrimitiveType.RELATION && recurseDownRelations) 32 return ">>;"; // >>; needed for sub relations 33 return ""; 34 } 35 25 36 @Override 26 37 protected String getBaseUrl() { 27 38 return OverpassDownloadReader.OVERPASS_SERVER.get(); … … 33 44 // accomplished using >; in the query string above 34 45 return true; 35 46 } 47 48 /** 49 * Should generated queries recurse down on relations? 50 * @param recurseDownRelations true: yes, recurse down to retrieve the complete relation 51 */ 52 public void setRecurseDownRelations(boolean recurseDownRelations) { 53 this.recurseDownRelations = recurseDownRelations; 54 } 55 36 56 } -
src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java
382 382 progressMonitor.beginTask(trn("Downloading {0} object from ''{1}''", 383 383 "Downloading {0} objects from ''{1}''", n, n, OsmApi.getOsmApi().getBaseUrl())); 384 384 try { 385 boolean ignoreAlreadyDownloaded = outputDataSet != null && outputDataSet.isEmpty(); 385 386 missingPrimitives = new HashSet<>(); 386 387 if (isCanceled()) return null; 388 fetchPrimitives(relations, OsmPrimitiveType.RELATION, progressMonitor); 389 if (isCanceled()) return null; 387 390 fetchPrimitives(ways, OsmPrimitiveType.WAY, progressMonitor); 391 if (outputDataSet != null && ignoreAlreadyDownloaded) { 392 // avoid to download data that was already downloaded 393 nodes.removeAll(outputDataSet.getNodes().stream().filter(node -> !node.isIncomplete()).map(OsmPrimitive::getUniqueId).collect(Collectors.toList())); 394 } 388 395 if (isCanceled()) return null; 389 396 fetchPrimitives(nodes, OsmPrimitiveType.NODE, progressMonitor); 390 if (isCanceled()) return null;391 fetchPrimitives(relations, OsmPrimitiveType.RELATION, progressMonitor);392 397 if (outputDataSet != null) { 393 398 outputDataSet.deleteInvisible(); 394 399 } -
test/functional/org/openstreetmap/josm/io/MultiFetchServerObjectReaderTest.java
42 42 import org.openstreetmap.josm.data.osm.Way; 43 43 import org.openstreetmap.josm.gui.progress.NullProgressMonitor; 44 44 import org.openstreetmap.josm.spi.preferences.Config; 45 import org.openstreetmap.josm.testutils.JOSMTestRules; 45 46 46 47 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; 47 import org.openstreetmap.josm.testutils.JOSMTestRules;48 48 49 49 /** 50 50 * Unit tests of {@link MultiFetchServerObjectReader}. -
test/unit/org/openstreetmap/josm/io/MultiFetchOverpassObjectReaderTest.java
6 6 import java.util.Arrays; 7 7 import java.util.TreeSet; 8 8 9 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;10 9 import org.junit.Rule; 11 10 import org.junit.Test; 12 11 import org.openstreetmap.josm.data.osm.OsmPrimitiveType; … … 13 12 import org.openstreetmap.josm.testutils.JOSMTestRules; 14 13 import org.openstreetmap.josm.tools.Utils; 15 14 15 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; 16 16 17 /** 17 18 * Unit tests of {@link MultiFetchOverpassObjectReader}. 18 19 */ … … 29 30 * Test {@link MultiFetchOverpassObjectReader#buildRequestString} 30 31 */ 31 32 @Test 32 public void testBuildRequest String() {33 public void testBuildRequestWaysString() { 33 34 String requestString = new MultiFetchOverpassObjectReader() 34 35 .buildRequestString(OsmPrimitiveType.WAY, new TreeSet<>(Arrays.asList(130L, 123L, 126L))); 35 assertEquals("interpreter?data=" + Utils.encodeUrl(" (way(123);>;way(126);>;way(130);>;);out meta;"), requestString);36 assertEquals("interpreter?data=" + Utils.encodeUrl("way(id:123,126,130);>;out meta;"), requestString); 36 37 } 37 38 39 /** 40 * Test {@link MultiFetchOverpassObjectReader#buildRequestString} 41 */ 42 @Test 43 public void testBuildRequestRelationsString() { 44 MultiFetchOverpassObjectReader reader = new MultiFetchOverpassObjectReader(); 45 reader.setRecurseDownRelations(true); 46 String requestString = reader.buildRequestString(OsmPrimitiveType.RELATION, 47 new TreeSet<>(Arrays.asList(130L, 123L, 126L))); 48 assertEquals("interpreter?data=" + Utils.encodeUrl("relation(id:123,126,130);>>;out meta;"), requestString); 49 reader.setRecurseDownRelations(false); 50 requestString = reader.buildRequestString(OsmPrimitiveType.RELATION, 51 new TreeSet<>(Arrays.asList(130L, 123L, 126L))); 52 assertEquals("interpreter?data=" + Utils.encodeUrl("relation(id:123,126,130);out meta;"), requestString); 53 } 54 38 55 }
