001    // License: GPL. For details, see LICENSE file.
002    package org.openstreetmap.josm.gui.io;
003    
004    import static org.openstreetmap.josm.tools.I18n.tr;
005    
006    import java.io.IOException;
007    import java.util.ArrayList;
008    import java.util.Collection;
009    
010    import javax.swing.SwingUtilities;
011    
012    import org.openstreetmap.josm.data.osm.Changeset;
013    import org.openstreetmap.josm.data.osm.ChangesetCache;
014    import org.openstreetmap.josm.gui.ExceptionDialogUtil;
015    import org.openstreetmap.josm.gui.PleaseWaitRunnable;
016    import org.openstreetmap.josm.io.OsmApi;
017    import org.openstreetmap.josm.io.OsmTransferException;
018    import org.xml.sax.SAXException;
019    
020    /**
021     * A task for closing a collection of changesets.
022     *
023     */
024    public class CloseChangesetTask extends PleaseWaitRunnable {
025        private boolean canceled;
026        private Exception lastException;
027        private Collection<Changeset> changesets;
028        private ArrayList<Changeset> closedChangesets;
029    
030        /**
031         * Closes all changesets in <code>changesets</code> if they are not null, if they
032         * are still open and if they have an id > 0. Other changesets in the collection
033         * are ignored.
034         *
035         * @param changesets  the collection of changesets. Empty collection assumes, if null.
036         */
037        public CloseChangesetTask(Collection<Changeset> changesets) {
038            super(tr("Closing changeset"), false /* don't ignore exceptions */);
039            if (changesets == null) {
040                changesets = new ArrayList<Changeset>();
041            }
042            this.changesets = changesets;
043            this.closedChangesets = new ArrayList<Changeset>();
044        }
045    
046        @Override
047        protected void cancel() {
048            this.canceled = true;
049            OsmApi.getOsmApi().cancel();
050        }
051    
052        @Override
053        protected void finish() {
054            if (canceled)
055                return;
056            if (lastException != null) {
057                ExceptionDialogUtil.explainException(lastException);
058            }
059            SwingUtilities.invokeLater(
060                    new Runnable() {
061                        public void run() {
062                            ChangesetCache.getInstance().update(closedChangesets);
063                        }
064                    }
065            );
066        }
067    
068        @Override
069        protected void realRun() throws SAXException, IOException, OsmTransferException {
070            try {
071                for (Changeset cs: changesets) {
072                    if (canceled) return;
073                    if (cs == null || cs.getId() <= 0 || ! cs.isOpen()) {
074                        continue;
075                    }
076                    getProgressMonitor().subTask(tr("Closing changeset {0}", cs.getId()));
077                    OsmApi.getOsmApi().closeChangeset(cs, getProgressMonitor().createSubTaskMonitor(1, false));
078                    closedChangesets.add(cs);
079                }
080            } catch(Exception e) {
081                if (canceled)
082                    return;
083                lastException = e;
084            }
085        }
086    }