// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.gui.io; import static org.openstreetmap.josm.tools.I18n.tr; import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Optional; import javax.swing.SwingUtilities; import org.openstreetmap.josm.data.osm.Changeset; import org.openstreetmap.josm.data.osm.ChangesetCache; import org.openstreetmap.josm.gui.ExceptionDialogUtil; import org.openstreetmap.josm.gui.PleaseWaitRunnable; import org.openstreetmap.josm.io.OsmApi; import org.openstreetmap.josm.io.OsmTransferException; import org.xml.sax.SAXException; /** * A task for closing a collection of changesets. * */ public class CloseChangesetTask extends PleaseWaitRunnable { private boolean canceled; private Exception lastException; private final Collection<Changeset> changesets; private final List<Changeset> closedChangesets; /** * Closes all changesets in <code>changesets</code> if they are not null, if they * are still open and if they have an id > 0. Other changesets in the collection * are ignored. * * @param changesets the collection of changesets. Empty collection assumes, if null. */ public CloseChangesetTask(Collection<Changeset> changesets) { super(tr("Closing changeset"), false /* don't ignore exceptions */); this.changesets = Optional.ofNullable(changesets).orElseGet(ArrayList::new); this.closedChangesets = new ArrayList<>(); } @Override protected void cancel() { this.canceled = true; OsmApi.getOsmApi().cancel(); } @Override protected void finish() { if (canceled) return; if (lastException != null) { ExceptionDialogUtil.explainException(lastException); } SwingUtilities.invokeLater(() -> ChangesetCache.getInstance().update(closedChangesets)); } @Override protected void realRun() throws SAXException, IOException, OsmTransferException { try { for (Changeset cs: changesets) { if (canceled) return; if (cs == null || cs.getId() <= 0 || !cs.isOpen()) { continue; } getProgressMonitor().subTask(tr("Closing changeset {0}", cs.getId())); OsmApi.getOsmApi().closeChangeset(cs, getProgressMonitor().createSubTaskMonitor(1, false)); closedChangesets.add(cs); } } catch (OsmTransferException e) { if (canceled) return; lastException = e; } } }