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}