kopia lustrzana https://github.com/JOSM/MapWithAI
Allow the download to be cancelled (it takes some time)
Signed-off-by: Taylor Smock <taylor.smock@kaart.com>pull/1/head v0.1.12
rodzic
801db956b5
commit
c146267bfa
|
@ -5,6 +5,7 @@ import static org.openstreetmap.josm.tools.I18n.tr;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.net.SocketException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
@ -27,6 +28,7 @@ import org.openstreetmap.josm.data.osm.Tag;
|
||||||
import org.openstreetmap.josm.data.osm.UploadPolicy;
|
import org.openstreetmap.josm.data.osm.UploadPolicy;
|
||||||
import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
|
import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
|
||||||
import org.openstreetmap.josm.gui.progress.ProgressMonitor;
|
import org.openstreetmap.josm.gui.progress.ProgressMonitor;
|
||||||
|
import org.openstreetmap.josm.gui.progress.ProgressMonitor.CancelListener;
|
||||||
import org.openstreetmap.josm.io.IllegalDataException;
|
import org.openstreetmap.josm.io.IllegalDataException;
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.MapWithAIPlugin;
|
import org.openstreetmap.josm.plugins.mapwithai.MapWithAIPlugin;
|
||||||
import org.openstreetmap.josm.plugins.mapwithai.commands.MergeDuplicateWays;
|
import org.openstreetmap.josm.plugins.mapwithai.commands.MergeDuplicateWays;
|
||||||
|
@ -40,9 +42,10 @@ import org.openstreetmap.josm.tools.Pair;
|
||||||
*
|
*
|
||||||
* @author Taylor Smock
|
* @author Taylor Smock
|
||||||
*/
|
*/
|
||||||
public class GetDataRunnable extends RecursiveTask<DataSet> {
|
public class GetDataRunnable extends RecursiveTask<DataSet> implements CancelListener {
|
||||||
private static final long serialVersionUID = 258423685658089715L;
|
private static final long serialVersionUID = 258423685658089715L;
|
||||||
private final transient List<BBox> bbox;
|
private final transient List<BBox> bbox;
|
||||||
|
private static HttpClient client;
|
||||||
private final transient DataSet dataSet;
|
private final transient DataSet dataSet;
|
||||||
private final transient ProgressMonitor monitor;
|
private final transient ProgressMonitor monitor;
|
||||||
|
|
||||||
|
@ -72,38 +75,47 @@ public class GetDataRunnable extends RecursiveTask<DataSet> {
|
||||||
this.bbox = new ArrayList<>(bbox);
|
this.bbox = new ArrayList<>(bbox);
|
||||||
this.dataSet = dataSet;
|
this.dataSet = dataSet;
|
||||||
this.monitor = Optional.ofNullable(monitor).orElse(NullProgressMonitor.INSTANCE);
|
this.monitor = Optional.ofNullable(monitor).orElse(NullProgressMonitor.INSTANCE);
|
||||||
|
this.monitor.addCancelListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public DataSet compute() {
|
public DataSet compute() {
|
||||||
final List<BBox> bboxes = MapWithAIDataUtils.reduceBBoxSize(bbox);
|
final List<BBox> bboxes = MapWithAIDataUtils.reduceBBoxSize(bbox);
|
||||||
monitor.beginTask(tr("Downloading {0} data", MapWithAIPlugin.NAME), bboxes.size() - 1);
|
monitor.beginTask(tr("Downloading {0} data ({1} total downloads)", MapWithAIPlugin.NAME, bboxes.size()),
|
||||||
|
bboxes.size() - 1);
|
||||||
|
if (!monitor.isCanceled()) {
|
||||||
if (bboxes.size() == MAX_NUMBER_OF_BBOXES_TO_PROCESS) {
|
if (bboxes.size() == MAX_NUMBER_OF_BBOXES_TO_PROCESS) {
|
||||||
final DataSet temporaryDataSet = getDataReal(bboxes.get(0));
|
final DataSet temporaryDataSet = getDataReal(bboxes.get(0), monitor);
|
||||||
synchronized (GetDataRunnable.class) {
|
synchronized (GetDataRunnable.class) {
|
||||||
dataSet.mergeFrom(temporaryDataSet);
|
dataSet.mergeFrom(temporaryDataSet);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
final Collection<GetDataRunnable> tasks = bboxes.parallelStream()
|
final Collection<GetDataRunnable> tasks = bboxes.parallelStream()
|
||||||
.map(tBbox -> new GetDataRunnable(tBbox, dataSet, monitor.createSubTaskMonitor(1, true)))
|
.map(tBbox -> new GetDataRunnable(tBbox, dataSet, monitor.createSubTaskMonitor(0, true)))
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
tasks.forEach(GetDataRunnable::fork);
|
tasks.forEach(GetDataRunnable::fork);
|
||||||
tasks.forEach(GetDataRunnable::join);
|
tasks.parallelStream().forEach(runnable -> {
|
||||||
|
runnable.join();
|
||||||
|
monitor.worked(1);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
monitor.finishTask();
|
}
|
||||||
|
// This can technically be included in the above block, but it is here so that
|
||||||
|
// cancellation is a little faster
|
||||||
|
if (!monitor.isCanceled()) {
|
||||||
synchronized (LOCK) {
|
synchronized (LOCK) {
|
||||||
/* Microsoft buildings don't have a source, so we add one */
|
/* Microsoft buildings don't have a source, so we add one */
|
||||||
MapWithAIDataUtils.addSourceTags(dataSet, "building", "microsoft");
|
MapWithAIDataUtils.addSourceTags(dataSet, "building", "microsoft");
|
||||||
replaceTags(dataSet);
|
replaceTags(dataSet);
|
||||||
removeCommonTags(dataSet);
|
removeCommonTags(dataSet);
|
||||||
mergeNodes(dataSet);
|
mergeNodes(dataSet);
|
||||||
// filterDataSet(dataSet);
|
|
||||||
cleanupDataSet(dataSet);
|
cleanupDataSet(dataSet);
|
||||||
for (int i = 0; i < 5; i++) {
|
for (int i = 0; i < 5; i++) {
|
||||||
new MergeDuplicateWays(dataSet).executeCommand();
|
new MergeDuplicateWays(dataSet).executeCommand();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
monitor.finishTask();
|
||||||
return dataSet;
|
return dataSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,6 +177,7 @@ public class GetDataRunnable extends RecursiveTask<DataSet> {
|
||||||
bbox.addPrimitive(n1, 0.001);
|
bbox.addPrimitive(n1, 0.001);
|
||||||
final List<Node> nearbyNodes = dataSet.searchNodes(bbox).parallelStream()
|
final List<Node> nearbyNodes = dataSet.searchNodes(bbox).parallelStream()
|
||||||
.filter(node -> !node.isDeleted() && !node.equals(n1)
|
.filter(node -> !node.isDeleted() && !node.equals(n1)
|
||||||
|
&& n1.getKeys().equals(node.getKeys())
|
||||||
&& n1.getCoor().greatCircleDistance(node.getCoor()) < MapWithAIPreferenceHelper
|
&& n1.getCoor().greatCircleDistance(node.getCoor()) < MapWithAIPreferenceHelper
|
||||||
.getMaxNodeDistance())
|
.getMaxNodeDistance())
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
@ -180,9 +193,10 @@ public class GetDataRunnable extends RecursiveTask<DataSet> {
|
||||||
* Actually get the data
|
* Actually get the data
|
||||||
*
|
*
|
||||||
* @param bbox The bbox to get the data from
|
* @param bbox The bbox to get the data from
|
||||||
|
* @param monitor Use to determine if the operation has been cancelled
|
||||||
* @return A dataset with the data from the bbox
|
* @return A dataset with the data from the bbox
|
||||||
*/
|
*/
|
||||||
private static DataSet getDataReal(BBox bbox) {
|
private static DataSet getDataReal(BBox bbox, ProgressMonitor monitor) {
|
||||||
InputStream inputStream = null;
|
InputStream inputStream = null;
|
||||||
final DataSet dataSet = new DataSet();
|
final DataSet dataSet = new DataSet();
|
||||||
String urlString = MapWithAIPreferenceHelper.getMapWithAIUrl();
|
String urlString = MapWithAIPreferenceHelper.getMapWithAIUrl();
|
||||||
|
@ -195,7 +209,7 @@ public class GetDataRunnable extends RecursiveTask<DataSet> {
|
||||||
try {
|
try {
|
||||||
final URL url = new URL(urlString.replace("{bbox}", bbox.toStringCSV(",")).replace("{crop_bbox}",
|
final URL url = new URL(urlString.replace("{bbox}", bbox.toStringCSV(",")).replace("{crop_bbox}",
|
||||||
DetectTaskingManagerUtils.getTaskingManagerBBox().toStringCSV(",")));
|
DetectTaskingManagerUtils.getTaskingManagerBBox().toStringCSV(",")));
|
||||||
final HttpClient client = HttpClient.create(url);
|
client = HttpClient.create(url);
|
||||||
final StringBuilder defaultUserAgent = new StringBuilder();
|
final StringBuilder defaultUserAgent = new StringBuilder();
|
||||||
defaultUserAgent.append(client.getHeaders().get("User-Agent"));
|
defaultUserAgent.append(client.getHeaders().get("User-Agent"));
|
||||||
if (defaultUserAgent.toString().trim().length() == 0) {
|
if (defaultUserAgent.toString().trim().length() == 0) {
|
||||||
|
@ -203,12 +217,18 @@ public class GetDataRunnable extends RecursiveTask<DataSet> {
|
||||||
}
|
}
|
||||||
defaultUserAgent.append(tr("/ {0} {1}", MapWithAIPlugin.NAME, MapWithAIPlugin.getVersionInfo()));
|
defaultUserAgent.append(tr("/ {0} {1}", MapWithAIPlugin.NAME, MapWithAIPlugin.getVersionInfo()));
|
||||||
client.setHeader("User-Agent", defaultUserAgent.toString());
|
client.setHeader("User-Agent", defaultUserAgent.toString());
|
||||||
|
if (!monitor.isCanceled()) {
|
||||||
Logging.debug("{0}: Getting {1}", MapWithAIPlugin.NAME, client.getURL().toString());
|
Logging.debug("{0}: Getting {1}", MapWithAIPlugin.NAME, client.getURL().toString());
|
||||||
final Response response = client.connect();
|
final Response response = client.connect();
|
||||||
inputStream = response.getContent();
|
inputStream = response.getContent();
|
||||||
final DataSet mergeData = OsmReaderCustom.parseDataSet(inputStream, null, true);
|
final DataSet mergeData = OsmReaderCustom.parseDataSet(inputStream, null, true);
|
||||||
dataSet.mergeFrom(mergeData);
|
dataSet.mergeFrom(mergeData);
|
||||||
response.disconnect();
|
response.disconnect();
|
||||||
|
}
|
||||||
|
} catch (SocketException e) {
|
||||||
|
if (!monitor.isCanceled()) {
|
||||||
|
Logging.debug(e);
|
||||||
|
}
|
||||||
} catch (UnsupportedOperationException | IllegalDataException | IOException e) {
|
} catch (UnsupportedOperationException | IllegalDataException | IOException e) {
|
||||||
Logging.debug(e);
|
Logging.debug(e);
|
||||||
} finally {
|
} finally {
|
||||||
|
@ -223,4 +243,11 @@ public class GetDataRunnable extends RecursiveTask<DataSet> {
|
||||||
}
|
}
|
||||||
return dataSet;
|
return dataSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void operationCanceled() {
|
||||||
|
if (client != null) {
|
||||||
|
client.disconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -146,7 +146,6 @@ public final class MapWithAIDataUtils {
|
||||||
final DataSet dataSet = new DataSet();
|
final DataSet dataSet = new DataSet();
|
||||||
final List<BBox> realBBoxes = bbox.stream().filter(BBox::isValid).distinct().collect(Collectors.toList());
|
final List<BBox> realBBoxes = bbox.stream().filter(BBox::isValid).distinct().collect(Collectors.toList());
|
||||||
final PleaseWaitProgressMonitor monitor = new PleaseWaitProgressMonitor();
|
final PleaseWaitProgressMonitor monitor = new PleaseWaitProgressMonitor();
|
||||||
monitor.setCancelable(Boolean.FALSE);
|
|
||||||
getForkJoinPool().invoke(new GetDataRunnable(realBBoxes, dataSet, monitor));
|
getForkJoinPool().invoke(new GetDataRunnable(realBBoxes, dataSet, monitor));
|
||||||
monitor.finishTask();
|
monitor.finishTask();
|
||||||
monitor.close();
|
monitor.close();
|
||||||
|
|
Ładowanie…
Reference in New Issue