From cbde7fb181424f2d36840f65b11675cf5da756a3 Mon Sep 17 00:00:00 2001 From: Taylor Smock Date: Thu, 30 Jan 2020 15:10:01 -0700 Subject: [PATCH] Fix some race conditions with EDT threads Signed-off-by: Taylor Smock --- .../mapwithai/backend/GetDataRunnable.java | 34 +++++++++++++------ .../conflation/MergeBuildingAddress.java | 19 +++++++++-- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/openstreetmap/josm/plugins/mapwithai/backend/GetDataRunnable.java b/src/main/java/org/openstreetmap/josm/plugins/mapwithai/backend/GetDataRunnable.java index 8ca3571..a222afe 100644 --- a/src/main/java/org/openstreetmap/josm/plugins/mapwithai/backend/GetDataRunnable.java +++ b/src/main/java/org/openstreetmap/josm/plugins/mapwithai/backend/GetDataRunnable.java @@ -4,6 +4,7 @@ package org.openstreetmap.josm.plugins.mapwithai.backend; import static org.openstreetmap.josm.tools.I18n.tr; import java.io.IOException; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -16,6 +17,8 @@ import java.util.TreeMap; import java.util.concurrent.RecursiveTask; import java.util.stream.Collectors; +import javax.swing.SwingUtilities; + import org.openstreetmap.josm.actions.MergeNodesAction; import org.openstreetmap.josm.command.Command; import org.openstreetmap.josm.command.DeleteCommand; @@ -125,17 +128,26 @@ public class GetDataRunnable extends RecursiveTask { * @param bounds */ public static void cleanup(DataSet dataSet, Bounds bounds) { - synchronized (LOCK) { - removeRedundantSource(dataSet); - replaceTags(dataSet); - removeCommonTags(dataSet); - mergeNodes(dataSet); - cleanupDataSet(dataSet); - mergeWays(dataSet); - removeAlreadyAddedData(dataSet); - new MergeDuplicateWays(dataSet).executeCommand(); - (bounds == null ? dataSet.getWays() : dataSet.searchWays(bounds.toBBox())).parallelStream() - .filter(way -> !way.isDeleted()).forEach(GetDataRunnable::cleanupArtifacts); + try { + SwingUtilities.invokeAndWait(() -> { + synchronized (LOCK) { + removeRedundantSource(dataSet); + replaceTags(dataSet); + removeCommonTags(dataSet); + mergeNodes(dataSet); + cleanupDataSet(dataSet); + mergeWays(dataSet); + removeAlreadyAddedData(dataSet); + new MergeDuplicateWays(dataSet).executeCommand(); + (bounds == null ? dataSet.getWays() : dataSet.searchWays(bounds.toBBox())).parallelStream() + .filter(way -> !way.isDeleted()).forEach(GetDataRunnable::cleanupArtifacts); + } + }); + } catch (InterruptedException e) { + Logging.debug(e); + Thread.currentThread().interrupt(); + } catch (InvocationTargetException e) { + Logging.debug(e); } } diff --git a/src/main/java/org/openstreetmap/josm/plugins/mapwithai/backend/commands/conflation/MergeBuildingAddress.java b/src/main/java/org/openstreetmap/josm/plugins/mapwithai/backend/commands/conflation/MergeBuildingAddress.java index 32214b9..4ff6bbc 100644 --- a/src/main/java/org/openstreetmap/josm/plugins/mapwithai/backend/commands/conflation/MergeBuildingAddress.java +++ b/src/main/java/org/openstreetmap/josm/plugins/mapwithai/backend/commands/conflation/MergeBuildingAddress.java @@ -3,6 +3,7 @@ package org.openstreetmap.josm.plugins.mapwithai.backend.commands.conflation; import static org.openstreetmap.josm.tools.I18n.tr; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -10,6 +11,8 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; +import javax.swing.SwingUtilities; + import org.openstreetmap.josm.command.ChangePropertyCommand; import org.openstreetmap.josm.command.Command; import org.openstreetmap.josm.command.DeleteCommand; @@ -22,6 +25,7 @@ import org.openstreetmap.josm.data.osm.Relation; import org.openstreetmap.josm.data.osm.Way; import org.openstreetmap.josm.plugins.mapwithai.backend.MapWithAIPreferenceHelper; import org.openstreetmap.josm.tools.Geometry; +import org.openstreetmap.josm.tools.Logging; public class MergeBuildingAddress extends AbstractConflationCommand { public static final String KEY = "addr:housenumber"; @@ -66,9 +70,18 @@ public class MergeBuildingAddress extends AbstractConflationCommand { private static Collection mergeBuildingAddress(DataSet affectedDataSet, Node node) { final List toCheck = new ArrayList<>(); final BBox bbox = new BBox(node.getCoor().getX(), node.getCoor().getY(), 0.001); - toCheck.addAll(affectedDataSet.searchWays(bbox)); - toCheck.addAll(affectedDataSet.searchRelations(bbox)); - toCheck.addAll(affectedDataSet.searchNodes(bbox)); + try { + SwingUtilities.invokeAndWait(() -> { + toCheck.addAll(affectedDataSet.searchWays(bbox)); + toCheck.addAll(affectedDataSet.searchRelations(bbox)); + toCheck.addAll(affectedDataSet.searchNodes(bbox)); + }); + } catch (InvocationTargetException e) { + Logging.debug(e); + } catch (InterruptedException e) { + Logging.debug(e); + Thread.currentThread().interrupt(); + } List possibleDuplicates = toCheck.parallelStream().filter(prim -> prim.hasTag(KEY)) .filter(prim -> prim.get(KEY).equals(node.get(KEY))).filter(prim -> !prim.equals(node)) .collect(Collectors.toList());