001// License: GPL. For details, see LICENSE file. 002package org.openstreetmap.josm.gui.io; 003 004import static org.openstreetmap.josm.tools.I18n.tr; 005 006import java.util.Collection; 007import java.util.Collections; 008 009import org.openstreetmap.josm.data.osm.Node; 010import org.openstreetmap.josm.data.osm.OsmPrimitive; 011import org.openstreetmap.josm.data.osm.Relation; 012import org.openstreetmap.josm.data.osm.Way; 013import org.openstreetmap.josm.gui.layer.OsmDataLayer; 014import org.openstreetmap.josm.io.MultiFetchServerObjectReader; 015 016/** 017 * The asynchronous task for updating a collection of objects using multi fetch. 018 * @since 2599 019 */ 020public class UpdatePrimitivesTask extends AbstractPrimitiveTask { 021 022 private final Collection<? extends OsmPrimitive> toUpdate; 023 024 /** 025 * Constructs a new {@code UpdatePrimitivesTask}. 026 * 027 * @param layer the layer in which primitives are updated. Must not be null. 028 * @param toUpdate a collection of primitives to update from the server. Set to 029 * the empty collection if null. 030 * @throws IllegalArgumentException if layer is null. 031 */ 032 public UpdatePrimitivesTask(OsmDataLayer layer, Collection<? extends OsmPrimitive> toUpdate) { 033 super(tr("Update objects"), layer); 034 this.toUpdate = toUpdate != null ? toUpdate : Collections.<OsmPrimitive>emptyList(); 035 } 036 037 protected void initMultiFetchReaderWithNodes(MultiFetchServerObjectReader reader) { 038 getProgressMonitor().indeterminateSubTask(tr("Initializing nodes to update ...")); 039 for (OsmPrimitive primitive : toUpdate) { 040 if (primitive instanceof Node && !primitive.isNew()) { 041 reader.append(primitive); 042 } 043 } 044 } 045 046 protected void initMultiFetchReaderWithWays(MultiFetchServerObjectReader reader) { 047 getProgressMonitor().indeterminateSubTask(tr("Initializing ways to update ...")); 048 for (OsmPrimitive primitive : toUpdate) { 049 if (primitive instanceof Way && !primitive.isNew()) { 050 // this also adds way nodes 051 reader.append(primitive); 052 } 053 } 054 } 055 056 protected void initMultiFetchReaderWithRelations(MultiFetchServerObjectReader reader) { 057 getProgressMonitor().indeterminateSubTask(tr("Initializing relations to update ...")); 058 for (OsmPrimitive primitive : toUpdate) { 059 if (primitive instanceof Relation && !primitive.isNew()) { 060 // this also adds relation members 061 reader.append(primitive); 062 } 063 } 064 } 065 066 @Override 067 protected void initMultiFetchReader(MultiFetchServerObjectReader reader) { 068 initMultiFetchReaderWithNodes(reader); 069 initMultiFetchReaderWithWays(reader); 070 initMultiFetchReaderWithRelations(reader); 071 } 072}