From 5d35fb36f33b9b5d83dae422e426f72c4d2f9aab Mon Sep 17 00:00:00 2001 From: Taylor Smock Date: Mon, 13 Jul 2020 15:10:07 -0600 Subject: [PATCH] FIXUP: Avoid crash when user may have modified conn/dupe tags Signed-off-by: Taylor Smock --- .../conflation/AbstractConflationCommand.java | 15 +++++++++++---- .../AbstractConflationCommandTest.java | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 test/unit/org/openstreetmap/josm/plugins/mapwithai/commands/conflation/AbstractConflationCommandTest.java diff --git a/src/main/java/org/openstreetmap/josm/plugins/mapwithai/backend/commands/conflation/AbstractConflationCommand.java b/src/main/java/org/openstreetmap/josm/plugins/mapwithai/backend/commands/conflation/AbstractConflationCommand.java index 10c983e..f6fd6d9 100644 --- a/src/main/java/org/openstreetmap/josm/plugins/mapwithai/backend/commands/conflation/AbstractConflationCommand.java +++ b/src/main/java/org/openstreetmap/josm/plugins/mapwithai/backend/commands/conflation/AbstractConflationCommand.java @@ -100,10 +100,17 @@ public abstract class AbstractConflationCommand extends Command { final OsmPrimitive[] primitiveConnections = new OsmPrimitive[connections.length]; for (int i = 0; i < connections.length; i++) { final String member = connections[i]; - SimplePrimitiveId primitiveId = SimplePrimitiveId.fromString(member); - primitiveConnections[i] = dataSet.getPrimitiveById(primitiveId); - if (primitiveConnections[i] == null) { - missingPrimitives.put(i, new Pair<>(primitiveId.getUniqueId(), primitiveId.getType())); + try { + SimplePrimitiveId primitiveId = SimplePrimitiveId.fromString(member); + primitiveConnections[i] = dataSet.getPrimitiveById(primitiveId); + if (primitiveConnections[i] == null) { + missingPrimitives.put(i, new Pair<>(primitiveId.getUniqueId(), primitiveId.getType())); + } + } catch (IllegalArgumentException e) { + // Assume someone fiddled with the tag if the pattern doesn't match. + if (!e.getMessage().contains("n|node|w|way|r|rel|relation")) { + throw e; + } } } obtainMissingPrimitives(dataSet, primitiveConnections, missingPrimitives); diff --git a/test/unit/org/openstreetmap/josm/plugins/mapwithai/commands/conflation/AbstractConflationCommandTest.java b/test/unit/org/openstreetmap/josm/plugins/mapwithai/commands/conflation/AbstractConflationCommandTest.java new file mode 100644 index 0000000..ad1a704 --- /dev/null +++ b/test/unit/org/openstreetmap/josm/plugins/mapwithai/commands/conflation/AbstractConflationCommandTest.java @@ -0,0 +1,19 @@ +// License: GPL. For details, see LICENSE file. +package org.openstreetmap.josm.plugins.mapwithai.commands.conflation; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +import org.junit.jupiter.api.Test; +import org.openstreetmap.josm.data.osm.DataSet; +import org.openstreetmap.josm.plugins.mapwithai.backend.commands.conflation.AbstractConflationCommand; + +public class AbstractConflationCommandTest { + /** + * Non-regression test for + * #19495 + */ + @Test + public void testBadPrimitive() { + assertDoesNotThrow(() -> AbstractConflationCommand.getPrimitives(new DataSet(), "Linie 401699530")); + } +}