// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.actions.downloadtasks;
import static org.openstreetmap.josm.tools.CheckParameterUtil.ensureParameterNotNull;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import javax.swing.SwingUtilities;
import org.openstreetmap.josm.data.osm.DataSet;
import org.openstreetmap.josm.data.osm.PrimitiveId;
import org.openstreetmap.josm.gui.ExceptionDialogUtil;
import org.openstreetmap.josm.gui.PleaseWaitRunnable;
import org.openstreetmap.josm.gui.layer.OsmDataLayer;
import org.openstreetmap.josm.gui.progress.ProgressMonitor;
import org.openstreetmap.josm.io.OsmServerObjectReader;
import org.openstreetmap.josm.io.OsmTransferException;
import org.xml.sax.SAXException;
/**
* The asynchronous task for updating a collection of objects using multi fetch.
*
*/
public class DownloadPrimitiveTask extends PleaseWaitRunnable {
private DataSet ds;
private boolean canceled;
private Exception lastException;
private PrimitiveId primitiveId;
private OsmDataLayer layer;
private OsmServerObjectReader reader;
/**
* Creates the task
*
* @param layer the layer in which primitives are updated. Must not be null.
* @param toUpdate a collection of primitives to update from the server. Set to
* the empty collection if null.
* @throws IllegalArgumentException thrown if layer is null.
*/
public DownloadPrimitiveTask(PrimitiveId id, OsmDataLayer layer) {
super(tr("Download object"), false /* don't ignore exception */);
ensureParameterNotNull(layer, "layer");
this.layer = layer;
this.primitiveId = id;
}
@Override
protected void cancel() {
canceled = true;
synchronized(this) {
if (reader != null) {
reader.cancel();
}
}
}
@Override
protected void finish() {
if (canceled)
return;
if (lastException != null) {
ExceptionDialogUtil.explainException(lastException);
return;
}
Runnable r = new Runnable() {
public void run() {
layer.mergeFrom(ds);
layer.onPostDownloadFromServer();
}
};
if (SwingUtilities.isEventDispatchThread()) {
r.run();
} else {
try {
SwingUtilities.invokeAndWait(r);
} catch(InterruptedException e) {
e.printStackTrace();
} catch(InvocationTargetException e) {
e.printStackTrace();
}
}
}
@Override
protected void realRun() throws SAXException, IOException, OsmTransferException {
this.ds = new DataSet();
try {
synchronized(this) {
if (canceled) return;
reader = new OsmServerObjectReader(primitiveId, true);
}
ds = reader.parseOsm(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
synchronized(this) {
reader = null;
}
} catch(Exception e) {
if (canceled)
return;
lastException = e;
}
}
}