// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.actions.downloadtasks;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.awt.Component;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.openstreetmap.josm.Main;
import org.openstreetmap.josm.data.osm.Changeset;
import org.openstreetmap.josm.data.osm.ChangesetCache;
import org.openstreetmap.josm.gui.ExceptionDialogUtil;
import org.openstreetmap.josm.io.OsmTransferException;
import org.openstreetmap.josm.tools.CheckParameterUtil;
import org.xml.sax.SAXException;
/**
* This is an asynchronous task for downloading a collection of changests from the OSM server.
*
* The task only downloads the changeset properties without the changeset content. It
* updates the global {@link ChangesetCache}.
* @since 2613
*/
public class ChangesetHeaderDownloadTask extends AbstractChangesetDownloadTask {
class DownloadTask extends RunnableDownloadTask {
/** the list of changeset ids to download */
private final Set<Integer> toDownload = new HashSet<>();
/** whether to include discussions or not */
private final boolean includeDiscussion;
DownloadTask(Component parent, Collection<Integer> ids, boolean includeDiscussion) {
super(parent, tr("Download changesets"));
this.includeDiscussion = includeDiscussion;
for (int id: ids != null ? ids : Collections.<Integer>emptyList()) {
if (id <= 0) {
continue;
}
toDownload.add(id);
}
}
@Override
protected void realRun() throws SAXException, IOException, OsmTransferException {
try {
downloadedChangesets.addAll(reader.readChangesets(toDownload, includeDiscussion,
getProgressMonitor().createSubTaskMonitor(0, false)));
} catch (OsmTransferException e) {
if (isCanceled())
// ignore exception if canceled
return;
// remember other exceptions
rememberLastException(e);
}
}
@Override
protected void finish() {
rememberDownloadedData(downloadedChangesets);
if (isCanceled())
return;
if (lastException != null) {
ExceptionDialogUtil.explainException(lastException);
}
updateChangesets();
}
}
/**
* Creates the download task for a collection of changeset ids. Uses a {@link org.openstreetmap.josm.gui.PleaseWaitDialog}
* whose parent is {@link Main#parent}.
*
* Null ids or or ids <= 0 in the id collection are ignored.
*
* @param ids the collection of ids. Empty collection assumed if null.
*/
public ChangesetHeaderDownloadTask(Collection<Integer> ids) {
this(Main.parent, ids, false);
}
/**
* Creates the download task for a collection of changeset ids. Uses a {@link org.openstreetmap.josm.gui.PleaseWaitDialog}
* whose parent is the parent window of <code>dialogParent</code>.
*
* Null ids or or ids <= 0 in the id collection are ignored.
*
* @param dialogParent the parent reference component for the {@link org.openstreetmap.josm.gui.PleaseWaitDialog}. Must not be null.
* @param ids the collection of ids. Empty collection assumed if null.
* @throws IllegalArgumentException if dialogParent is null
*/
public ChangesetHeaderDownloadTask(Component dialogParent, Collection<Integer> ids) {
this(dialogParent, ids, false);
}
/**
* Creates the download task for a collection of changeset ids, with possibility to download changeset discussion.
* Uses a {@link org.openstreetmap.josm.gui.PleaseWaitDialog} whose parent is the parent window of <code>dialogParent</code>.
*
* Null ids or or ids <= 0 in the id collection are ignored.
*
* @param dialogParent the parent reference component for the {@link org.openstreetmap.josm.gui.PleaseWaitDialog}. Must not be null.
* @param ids the collection of ids. Empty collection assumed if null.
* @param includeDiscussion determines if discussion comments must be downloaded or not
* @throws IllegalArgumentException if dialogParent is null
* @since 7704
*/
public ChangesetHeaderDownloadTask(Component dialogParent, Collection<Integer> ids, boolean includeDiscussion) {
setDownloadTask(new DownloadTask(dialogParent, ids, includeDiscussion));
}
/**
* Builds a download task from for a collection of changesets.
*
* Ignores null values and changesets with {@link Changeset#isNew()} == true.
*
* @param changesets the collection of changesets. Assumes an empty collection if null.
* @return the download task
*/
public static ChangesetHeaderDownloadTask buildTaskForChangesets(Collection<Changeset> changesets) {
return buildTaskForChangesets(Main.parent, changesets);
}
/**
* Builds a download task from for a collection of changesets.
*
* Ignores null values and changesets with {@link Changeset#isNew()} == true.
*
* @param parent the parent component relative to which the {@link org.openstreetmap.josm.gui.PleaseWaitDialog} is displayed.
* Must not be null.
* @param changesets the collection of changesets. Assumes an empty collection if null.
* @return the download task
* @throws IllegalArgumentException if parent is null
*/
public static ChangesetHeaderDownloadTask buildTaskForChangesets(Component parent, Collection<Changeset> changesets) {
CheckParameterUtil.ensureParameterNotNull(parent, "parent");
Set<Integer> ids = new HashSet<>();
for (Changeset cs: changesets != null ? changesets : Collections.<Changeset>emptyList()) {
if (cs == null || cs.isNew()) {
continue;
}
ids.add(cs.getId());
}
return new ChangesetHeaderDownloadTask(parent, ids);
}
}