Changeset 16546 in josm for trunk/src/org/openstreetmap


Ignore:
Timestamp:
2020-06-07T11:36:21+02:00 (4 years ago)
Author:
simon04
Message:

fix #19343 - DataIntegrityProblemException: report commands involving relevant primitives

Location:
trunk/src/org/openstreetmap/josm/data/osm
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/osm/DataIntegrityProblemException.java

    r12036 r16546  
    11// License: GPL. For details, see LICENSE file.
    22package org.openstreetmap.josm.data.osm;
     3
     4import java.util.Arrays;
     5import java.util.function.Predicate;
     6import java.util.stream.Collectors;
     7import java.util.stream.Stream;
     8
     9import org.openstreetmap.josm.command.Command;
     10import org.openstreetmap.josm.data.UndoRedoHandler;
    311
    412/**
     
    2230     * @param message the detail message
    2331     * @param htmlMessage HTML-formatted error message. Can be null
     32     * @param p the primitive involved in this integrity problem (used for constructing a detailed message)
    2433     */
    25     public DataIntegrityProblemException(String message, String htmlMessage) {
    26         super(message);
     34    public DataIntegrityProblemException(String message, String htmlMessage, OsmPrimitive... p) {
     35        super(message + relevantCommands(p));
    2736        this.htmlMessage = htmlMessage;
    2837    }
     
    3544        return htmlMessage;
    3645    }
     46
     47    private static String relevantCommands(OsmPrimitive... p) {
     48        if (p == null || p.length == 0) {
     49            return "";
     50        }
     51        Predicate<Command> isParticipating = c -> Arrays.stream(p).anyMatch(c.getParticipatingPrimitives()::contains);
     52        Stream<String> undo = UndoRedoHandler.getInstance().getUndoCommands().stream()
     53                .filter(isParticipating)
     54                .map(c -> "[" + c.getDescriptionText() + "]");
     55        Stream<String> redo = UndoRedoHandler.getInstance().getRedoCommands().stream()
     56                .filter(isParticipating)
     57                .map(c -> "[" + c.getDescriptionText() + " (undone)]");
     58        return Stream.concat(undo, redo)
     59                .collect(Collectors.joining(", ", " (changed by the following commands: ", ")"));
     60    }
    3761}
  • trunk/src/org/openstreetmap/josm/data/osm/DataSet.java

    r16468 r16546  
    496496            if (getPrimitiveById(primitive) != null)
    497497                throw new DataIntegrityProblemException(
    498                         tr("Unable to add primitive {0} to the dataset because it is already included",
    499                                 primitive.toString()));
     498                        tr("Unable to add primitive {0} to the dataset because it is already included", primitive.toString()),
     499                        null, primitive);
    500500
    501501            allPrimitives.add(primitive);
  • trunk/src/org/openstreetmap/josm/data/osm/Relation.java

    r16445 r16546  
    484484                    throw new DataIntegrityProblemException(
    485485                            String.format("Relation member must be part of the same dataset as relation(%s, %s)",
    486                                     getPrimitiveId(), rm.getMember().getPrimitiveId()));
     486                                    getPrimitiveId(), rm.getMember().getPrimitiveId()),
     487                            null, this, rm.getMember());
    487488            }
    488489            if (Config.getPref().getBoolean("debug.checkDeleteReferenced", true)) {
    489490                for (RelationMember rm: members) {
    490491                    if (rm.getMember().isDeleted())
    491                         throw new DataIntegrityProblemException("Deleted member referenced: " + toString());
     492                        throw new DataIntegrityProblemException("Deleted member referenced: " + toString(), null, this, rm.getMember());
    492493                }
    493494            }
  • trunk/src/org/openstreetmap/josm/data/osm/Way.java

    r16445 r16546  
    536536                    throw new DataIntegrityProblemException("Deleted node referenced: " + toString(),
    537537                            "<html>" + tr("Deleted node referenced by {0}",
    538                                     DefaultNameFormatter.getInstance().formatAsHtmlUnorderedList(this)) + "</html>");
     538                                    DefaultNameFormatter.getInstance().formatAsHtmlUnorderedList(this)) + "</html>",
     539                            this, n);
    539540            }
    540541            if (Config.getPref().getBoolean("debug.checkNullCoor", true)) {
     
    543544                        throw new DataIntegrityProblemException("Complete visible node with null coordinates: " + toString(),
    544545                                "<html>" + tr("Complete node {0} with null coordinates in way {1}",
    545                                 DefaultNameFormatter.getInstance().formatAsHtmlUnorderedList(n),
    546                                 DefaultNameFormatter.getInstance().formatAsHtmlUnorderedList(this)) + "</html>");
     546                                        DefaultNameFormatter.getInstance().formatAsHtmlUnorderedList(n),
     547                                        DefaultNameFormatter.getInstance().formatAsHtmlUnorderedList(this)) + "</html>",
     548                                this, n);
    547549                }
    548550            }
Note: See TracChangeset for help on using the changeset viewer.