Ignore:
Timestamp:
2020-02-03T06:35:22+01:00 (4 years ago)
Author:
GerdP
Message:

fix #18566: Download object: member of relations always downloaded (18566.3.patch)

  • return same result when downloading objects, no matter if overpass api is enabled or not.
  • fix an EDT violation in class ChildRelationBrowser
  • let MultiFetchOverpassObjectReader create a single overpass query, no matter how many objects are requested

(gives much better reaction times).

  • use multi-fetch in ChildRelationBrowser to reduce duplicated code. Small disadvantage: When downloading multiple members of a relation the dialog doesn't update after each member. Should not matter much as the overall time for multiple members is shorter

I tried to keep the code backward compatible. Plugins reverter and undelete should continue to work.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/io/AbstractPrimitiveTask.java

    r13486 r15811  
    1212import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    1313import org.openstreetmap.josm.data.osm.PrimitiveId;
    14 import org.openstreetmap.josm.data.osm.Relation;
    1514import org.openstreetmap.josm.data.osm.Way;
    1615import org.openstreetmap.josm.gui.ExceptionDialogUtil;
     
    4241
    4342    private boolean zoom;
    44     private boolean downloadRelations;
    45     private boolean fullRelation;
     43    protected boolean fullRelation;
    4644
    4745    protected AbstractPrimitiveTask(String title, OsmDataLayer layer) {
     
    7169
    7270    /**
    73      * Sets whether .
    74      * @param downloadRelations {@code true} if
     71     * Sets whether all members of the relation should be downloaded completely.
    7572     * @param fullRelation {@code true} if a full download is required,
    7673     *                     i.e., a download including the immediate children of a relation.
    7774     * @return {@code this}
     75     * since 15811 (changed parameter list)
    7876     */
    79     public final AbstractPrimitiveTask setDownloadRelations(boolean downloadRelations, boolean fullRelation) {
    80         this.downloadRelations = downloadRelations;
     77    public final AbstractPrimitiveTask setDownloadRelations(boolean fullRelation) {
    8178        this.fullRelation = fullRelation;
    8279        return this;
     
    10198                if (canceled)
    10299                    return;
    103                 multiObjectReader = MultiFetchServerObjectReader.create();
     100                multiObjectReader = MultiFetchServerObjectReader.create().setRecurseDownRelations(fullRelation);
    104101            }
    105102            initMultiFetchReader(multiObjectReader);
     
    111108            new DataSetMerger(ds, theirDataSet).merge();
    112109
    113             if (downloadRelations) {
    114                 loadIncompleteRelationMembers();
    115             }
    116 
    117110            loadIncompleteNodes();
    118111        } catch (OsmTransferException e) {
     
    120113                return;
    121114            lastException = e;
    122         }
    123     }
    124 
    125     protected void loadIncompleteRelationMembers() throws OsmTransferException {
    126         // if incomplete relation members exist, download them too
    127         for (Relation r : ds.getRelations()) {
    128             if (canceled)
    129                 return;
    130             // Relations may be incomplete in case of nested relations if child relations are accessed before their parent
    131             // (it may happen because "relations" has no deterministic sort order, see #10388)
    132             if (r.isIncomplete() || r.hasIncompleteMembers()) {
    133                 synchronized (this) {
    134                     if (canceled)
    135                         return;
    136                     objectReader = new OsmServerObjectReader(r.getId(), OsmPrimitiveType.RELATION, fullRelation);
    137                 }
    138                 DataSet theirDataSet = objectReader.parseOsm(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
    139                 synchronized (this) {
    140                     objectReader = null;
    141                 }
    142                 new DataSetMerger(ds, theirDataSet).merge();
    143             }
    144115        }
    145116    }
Note: See TracChangeset for help on using the changeset viewer.