diff --git a/src/main/java/org/openstreetmap/josm/plugins/mapwithai/commands/MergeAddressBuildings.java b/src/main/java/org/openstreetmap/josm/plugins/mapwithai/commands/MergeAddressBuildings.java index 3e91a39..3238d6a 100644 --- a/src/main/java/org/openstreetmap/josm/plugins/mapwithai/commands/MergeAddressBuildings.java +++ b/src/main/java/org/openstreetmap/josm/plugins/mapwithai/commands/MergeAddressBuildings.java @@ -8,8 +8,11 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.openstreetmap.josm.command.ChangePropertyCommand; import org.openstreetmap.josm.command.Command; import org.openstreetmap.josm.command.SequenceCommand; import org.openstreetmap.josm.data.osm.DataSet; @@ -31,6 +34,7 @@ import org.openstreetmap.josm.tools.Geometry; */ public class MergeAddressBuildings extends AbstractConflationCommand { public static final String KEY = "building"; + public static final String SOURCE = "source"; public MergeAddressBuildings(DataSet data) { super(data); @@ -85,16 +89,27 @@ public class MergeAddressBuildings extends AbstractConflationCommand { if (nodesWithAddresses.size() == 1 && nodesWithAddresses.parallelStream().allMatch(n -> n.getParentWays().isEmpty())) { String currentKey = null; + Node node = nodesWithAddresses.get(0); + List sources = new ArrayList<>(); try { // Remove the key to avoid the popup from utilsplugin2 currentKey = object.get(KEY); + sources.add(object.get(SOURCE)); object.remove(KEY); - GuiHelper.runInEDTAndWait(() -> commandList - .add(ReplaceGeometryUtils.buildUpgradeNodeCommand(nodesWithAddresses.get(0), object))); + object.remove(SOURCE); + GuiHelper.runInEDTAndWait( + () -> commandList.add(ReplaceGeometryUtils.buildUpgradeNodeCommand(node, object))); } finally { if (currentKey != null) { object.put(KEY, currentKey); } + sources.add(node.get(SOURCE)); + sources.removeIf(Objects::isNull); + sources = sources.stream().flatMap(source -> Stream.of(source.split(";", 0))).distinct() + .filter(Objects::nonNull).sorted().collect(Collectors.toList()); + if (!sources.isEmpty()) { + commandList.add(new ChangePropertyCommand(object, SOURCE, String.join(";", sources))); + } } } return commandList; diff --git a/src/main/java/org/openstreetmap/josm/plugins/mapwithai/commands/MergeBuildingAddress.java b/src/main/java/org/openstreetmap/josm/plugins/mapwithai/commands/MergeBuildingAddress.java index 791d439..edb90a3 100644 --- a/src/main/java/org/openstreetmap/josm/plugins/mapwithai/commands/MergeBuildingAddress.java +++ b/src/main/java/org/openstreetmap/josm/plugins/mapwithai/commands/MergeBuildingAddress.java @@ -8,7 +8,9 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; +import java.util.stream.Stream; import org.openstreetmap.josm.command.ChangePropertyCommand; import org.openstreetmap.josm.command.Command; @@ -92,12 +94,27 @@ public class MergeBuildingAddress extends AbstractConflationCommand { .filter(prim -> checkInside(node, prim)).collect(Collectors.toList()); final List commandList = new ArrayList<>(); + List sources = new ArrayList<>(); + OsmPrimitive object = null; + sources.add(node.get(MergeAddressBuildings.SOURCE)); if (possibleDuplicates.size() == 1) { commandList.add(new ChangePropertyCommand(possibleDuplicates, node.getKeys())); commandList.add(DeleteCommand.delete(Collections.singleton(node))); + object = possibleDuplicates.get(0); } else if (buildings.size() == 1 && getAddressPoints(buildings.get(0)).size() == 1) { commandList.add(new ChangePropertyCommand(buildings, node.getKeys())); commandList.add(DeleteCommand.delete(Collections.singleton(node))); + object = buildings.get(0); + } + if (object != null) { + sources.add(object.get(MergeAddressBuildings.SOURCE)); + } + + sources.removeIf(Objects::isNull); + sources = sources.stream().flatMap(source -> Stream.of(source.split(";", 0))).distinct() + .filter(Objects::nonNull).sorted().collect(Collectors.toList()); + if (!sources.isEmpty() && object != null) { + commandList.add(new ChangePropertyCommand(object, MergeAddressBuildings.SOURCE, String.join(";", sources))); } return commandList;