Ticket #18566: 18566-alpha.patch

File 18566-alpha.patch, 11.9 KB (added by GerdP, 6 years ago)
  • src/org/openstreetmap/josm/gui/io/AbstractPrimitiveTask.java

     
    2020import org.openstreetmap.josm.gui.progress.ProgressMonitor;
    2121import org.openstreetmap.josm.gui.progress.swing.PleaseWaitProgressMonitor;
    2222import org.openstreetmap.josm.gui.util.GuiHelper;
     23import org.openstreetmap.josm.io.MultiFetchOverpassObjectReader;
    2324import org.openstreetmap.josm.io.MultiFetchServerObjectReader;
    2425import org.openstreetmap.josm.io.OsmServerObjectReader;
    2526import org.openstreetmap.josm.io.OsmTransferException;
     
    4142    protected OsmServerObjectReader objectReader;
    4243
    4344    private boolean zoom;
    44     private boolean downloadRelations;
    4545    private boolean fullRelation;
    4646
    4747    protected AbstractPrimitiveTask(String title, OsmDataLayer layer) {
     
    7070    }
    7171
    7272    /**
    73      * Sets whether .
    74      * @param downloadRelations {@code true} if
     73     * Sets whether all members of the relation should be downloaded completely.
     74     * @param downloadRelations ignored since xxx
    7575     * @param fullRelation {@code true} if a full download is required,
    7676     *                     i.e., a download including the immediate children of a relation.
    7777     * @return {@code this}
    7878     */
    7979    public final AbstractPrimitiveTask setDownloadRelations(boolean downloadRelations, boolean fullRelation) {
    80         this.downloadRelations = downloadRelations;
    8180        this.fullRelation = fullRelation;
    8281        return this;
    8382    }
     
    103102                multiObjectReader = MultiFetchServerObjectReader.create();
    104103            }
    105104            initMultiFetchReader(multiObjectReader);
     105            if (multiObjectReader instanceof MultiFetchOverpassObjectReader) {
     106                ((MultiFetchOverpassObjectReader) multiObjectReader).setRecurseDownRelations(fullRelation);
     107            }
    106108            theirDataSet = multiObjectReader.parseOsm(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
    107109            missingPrimitives = multiObjectReader.getMissingPrimitives();
    108110            synchronized (this) {
     
    110112            }
    111113            new DataSetMerger(ds, theirDataSet).merge();
    112114
    113             if (downloadRelations) {
     115            if (fullRelation) {
    114116                loadIncompleteRelationMembers();
    115117            }
    116118
  • src/org/openstreetmap/josm/gui/io/UpdatePrimitivesTask.java

     
    55
    66import java.util.Collection;
    77import java.util.Collections;
     8import java.util.stream.Collectors;
    89
    9 import org.openstreetmap.josm.data.osm.Node;
    1010import org.openstreetmap.josm.data.osm.OsmPrimitive;
    11 import org.openstreetmap.josm.data.osm.Relation;
    12 import org.openstreetmap.josm.data.osm.Way;
    1311import org.openstreetmap.josm.gui.layer.OsmDataLayer;
    1412import org.openstreetmap.josm.io.MultiFetchServerObjectReader;
    1513
     
    3230    public UpdatePrimitivesTask(OsmDataLayer layer, Collection<? extends OsmPrimitive> toUpdate) {
    3331        super(tr("Update objects"), layer);
    3432        this.toUpdate = toUpdate != null ? toUpdate : Collections.<OsmPrimitive>emptyList();
     33        this.setDownloadRelations(false, false);
    3534    }
    3635
    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 nodes
    51                 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 members
    61                 reader.append(primitive);
    62             }
    63         }
    64     }
    65 
    6636    @Override
    6737    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()));
    7139    }
    7240}
  • src/org/openstreetmap/josm/io/MultiFetchOverpassObjectReader.java

     
    55import java.util.stream.Collectors;
    66
    77import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
     8import org.openstreetmap.josm.tools.Logging;
    89import org.openstreetmap.josm.tools.Utils;
    910
    1011/**
     
    1213 *
    1314 * @since 9241
    1415 */
    15 class MultiFetchOverpassObjectReader extends MultiFetchServerObjectReader {
     16public class MultiFetchOverpassObjectReader extends MultiFetchServerObjectReader {
     17    private boolean recurseDownRelations = true;
    1618
    1719    @Override
    1820    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);
    2225        return "interpreter?data=" + Utils.encodeUrl(query);
    2326    }
    2427
     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
    2536    @Override
    2637    protected String getBaseUrl() {
    2738        return OverpassDownloadReader.OVERPASS_SERVER.get();
     
    3344        // accomplished using >; in the query string above
    3445        return true;
    3546    }
     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
    3656}
  • src/org/openstreetmap/josm/io/MultiFetchServerObjectReader.java

     
    382382        progressMonitor.beginTask(trn("Downloading {0} object from ''{1}''",
    383383                "Downloading {0} objects from ''{1}''", n, n, OsmApi.getOsmApi().getBaseUrl()));
    384384        try {
     385            boolean ignoreAlreadyDownloaded = outputDataSet != null && outputDataSet.isEmpty();
    385386            missingPrimitives = new HashSet<>();
    386387            if (isCanceled()) return null;
     388            fetchPrimitives(relations, OsmPrimitiveType.RELATION, progressMonitor);
     389            if (isCanceled()) return null;
    387390            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            }
    388395            if (isCanceled()) return null;
    389396            fetchPrimitives(nodes, OsmPrimitiveType.NODE, progressMonitor);
    390             if (isCanceled()) return null;
    391             fetchPrimitives(relations, OsmPrimitiveType.RELATION, progressMonitor);
    392397            if (outputDataSet != null) {
    393398                outputDataSet.deleteInvisible();
    394399            }
  • test/functional/org/openstreetmap/josm/io/MultiFetchServerObjectReaderTest.java

     
    4242import org.openstreetmap.josm.data.osm.Way;
    4343import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
    4444import org.openstreetmap.josm.spi.preferences.Config;
     45import org.openstreetmap.josm.testutils.JOSMTestRules;
    4546
    4647import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
    47 import org.openstreetmap.josm.testutils.JOSMTestRules;
    4848
    4949/**
    5050 * Unit tests of {@link MultiFetchServerObjectReader}.
  • test/unit/org/openstreetmap/josm/io/MultiFetchOverpassObjectReaderTest.java

     
    66import java.util.Arrays;
    77import java.util.TreeSet;
    88
    9 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
    109import org.junit.Rule;
    1110import org.junit.Test;
    1211import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
     
    1312import org.openstreetmap.josm.testutils.JOSMTestRules;
    1413import org.openstreetmap.josm.tools.Utils;
    1514
     15import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
     16
    1617/**
    1718 * Unit tests of {@link MultiFetchOverpassObjectReader}.
    1819 */
     
    2930     * Test {@link MultiFetchOverpassObjectReader#buildRequestString}
    3031     */
    3132    @Test
    32     public void testBuildRequestString() {
     33    public void testBuildRequestWaysString() {
    3334        String requestString = new MultiFetchOverpassObjectReader()
    3435                .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);
    3637    }
    3738
     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
    3855}