Ignore:
Timestamp:
2016-09-17T14:37:53+02:00 (8 years ago)
Author:
Don-vip
Message:

fix #13643 - prevent creation of DuplicateNode errors with empty list of primitives, improve unit test

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/data/validation/tests/DuplicateNode.java

    r10970 r11007  
    3232import org.openstreetmap.josm.data.validation.TestError;
    3333import org.openstreetmap.josm.gui.progress.ProgressMonitor;
     34import org.openstreetmap.josm.tools.CheckParameterUtil;
    3435import org.openstreetmap.josm.tools.MultiMap;
    3536
     
    8687    }
    8788
     89    private static class DuplicateNodeTestError extends TestError {
     90        DuplicateNodeTestError(Test parentTest, Severity severity, String msg, int code, Set<OsmPrimitive> primitives) {
     91            super(parentTest, severity, tr("Duplicated nodes"), tr(msg), msg, code, primitives);
     92            CheckParameterUtil.ensureThat(!primitives.isEmpty(), "Empty primitives: " + msg);
     93        }
     94    }
     95
    8896    protected static final int DUPLICATE_NODE = 1;
    8997    protected static final int DUPLICATE_NODE_MIXED = 2;
     
    173181        // check whether we have multiple nodes at the same position with the same tag set
    174182        for (Iterator<Map<String, String>> it = mm.keySet().iterator(); it.hasNext();) {
    175             Map<String, String> tagSet = it.next();
    176             if (mm.get(tagSet).size() > 1) {
     183            Set<OsmPrimitive> primitives = mm.get(it.next());
     184            if (primitives.size() > 1) {
    177185
    178186                for (String type: TYPES) {
     
    180188                }
    181189
    182                 for (OsmPrimitive p : mm.get(tagSet)) {
     190                for (OsmPrimitive p : primitives) {
    183191                    if (p.getType() == OsmPrimitiveType.NODE) {
    184192                        Node n = (Node) p;
     
    203211                }
    204212
    205                 int nbType = 0;
    206                 for (Entry<String, Boolean> entry: typeMap.entrySet()) {
    207                     if (entry.getValue()) {
    208                         nbType++;
    209                     }
    210                 }
     213                long nbType = typeMap.entrySet().stream().filter(Entry::getValue).count();
    211214
    212215                if (nbType > 1) {
    213                     String msg = marktr("Mixed type duplicated nodes");
    214                     errors.add(new TestError(
     216                    errors.add(new DuplicateNodeTestError(
    215217                            parentTest,
    216218                            Severity.WARNING,
    217                             tr("Duplicated nodes"),
    218                             tr(msg),
    219                             msg,
     219                            marktr("Mixed type duplicated nodes"),
    220220                            DUPLICATE_NODE_MIXED,
    221                             mm.get(tagSet)
     221                            primitives
    222222                            ));
    223223                } else if (typeMap.get("highway")) {
    224                     String msg = marktr("Highway duplicated nodes");
    225                     errors.add(new TestError(
    226                             parentTest,
    227                             Severity.ERROR,
    228                             tr("Duplicated nodes"),
    229                             tr(msg),
    230                             msg,
     224                    errors.add(new DuplicateNodeTestError(
     225                            parentTest,
     226                            Severity.ERROR,
     227                            marktr("Highway duplicated nodes"),
    231228                            DUPLICATE_NODE_HIGHWAY,
    232                             mm.get(tagSet)
     229                            primitives
    233230                            ));
    234231                } else if (typeMap.get("railway")) {
    235                     String msg = marktr("Railway duplicated nodes");
    236                     errors.add(new TestError(
    237                             parentTest,
    238                             Severity.ERROR,
    239                             tr("Duplicated nodes"),
    240                             tr(msg),
    241                             msg,
     232                    errors.add(new DuplicateNodeTestError(
     233                            parentTest,
     234                            Severity.ERROR,
     235                            marktr("Railway duplicated nodes"),
    242236                            DUPLICATE_NODE_RAILWAY,
    243                             mm.get(tagSet)
     237                            primitives
    244238                            ));
    245239                } else if (typeMap.get("waterway")) {
    246                     String msg = marktr("Waterway duplicated nodes");
    247                     errors.add(new TestError(
    248                             parentTest,
    249                             Severity.ERROR,
    250                             tr("Duplicated nodes"),
    251                             tr(msg),
    252                             msg,
     240                    errors.add(new DuplicateNodeTestError(
     241                            parentTest,
     242                            Severity.ERROR,
     243                            marktr("Waterway duplicated nodes"),
    253244                            DUPLICATE_NODE_WATERWAY,
    254                             mm.get(tagSet)
     245                            primitives
    255246                            ));
    256247                } else if (typeMap.get("boundary")) {
    257                     String msg = marktr("Boundary duplicated nodes");
    258                     errors.add(new TestError(
    259                             parentTest,
    260                             Severity.ERROR,
    261                             tr("Duplicated nodes"),
    262                             tr(msg),
    263                             msg,
     248                    errors.add(new DuplicateNodeTestError(
     249                            parentTest,
     250                            Severity.ERROR,
     251                            marktr("Boundary duplicated nodes"),
    264252                            DUPLICATE_NODE_BOUNDARY,
    265                             mm.get(tagSet)
     253                            primitives
    266254                            ));
    267255                } else if (typeMap.get("power")) {
    268                     String msg = marktr("Power duplicated nodes");
    269                     errors.add(new TestError(
    270                             parentTest,
    271                             Severity.ERROR,
    272                             tr("Duplicated nodes"),
    273                             tr(msg),
    274                             msg,
     256                    errors.add(new DuplicateNodeTestError(
     257                            parentTest,
     258                            Severity.ERROR,
     259                            marktr("Power duplicated nodes"),
    275260                            DUPLICATE_NODE_POWER,
    276                             mm.get(tagSet)
     261                            primitives
    277262                            ));
    278263                } else if (typeMap.get("natural")) {
    279                     String msg = marktr("Natural duplicated nodes");
    280                     errors.add(new TestError(
    281                             parentTest,
    282                             Severity.ERROR,
    283                             tr("Duplicated nodes"),
    284                             tr(msg),
    285                             msg,
     264                    errors.add(new DuplicateNodeTestError(
     265                            parentTest,
     266                            Severity.ERROR,
     267                            marktr("Natural duplicated nodes"),
    286268                            DUPLICATE_NODE_NATURAL,
    287                             mm.get(tagSet)
     269                            primitives
    288270                            ));
    289271                } else if (typeMap.get("building")) {
    290                     String msg = marktr("Building duplicated nodes");
    291                     errors.add(new TestError(
    292                             parentTest,
    293                             Severity.ERROR,
    294                             tr("Duplicated nodes"),
    295                             tr(msg),
    296                             msg,
     272                    errors.add(new DuplicateNodeTestError(
     273                            parentTest,
     274                            Severity.ERROR,
     275                            marktr("Building duplicated nodes"),
    297276                            DUPLICATE_NODE_BUILDING,
    298                             mm.get(tagSet)
     277                            primitives
    299278                            ));
    300279                } else if (typeMap.get("landuse")) {
    301                     String msg = marktr("Landuse duplicated nodes");
    302                     errors.add(new TestError(
    303                             parentTest,
    304                             Severity.ERROR,
    305                             tr("Duplicated nodes"),
    306                             tr(msg),
    307                             msg,
     280                    errors.add(new DuplicateNodeTestError(
     281                            parentTest,
     282                            Severity.ERROR,
     283                            marktr("Landuse duplicated nodes"),
    308284                            DUPLICATE_NODE_LANDUSE,
    309                             mm.get(tagSet)
     285                            primitives
    310286                            ));
    311287                } else {
    312                     String msg = marktr("Other duplicated nodes");
    313                     errors.add(new TestError(
     288                    errors.add(new DuplicateNodeTestError(
    314289                            parentTest,
    315290                            Severity.WARNING,
    316                             tr("Duplicated nodes"),
    317                             tr(msg),
    318                             msg,
     291                            marktr("Other duplicated nodes"),
    319292                            DUPLICATE_NODE_OTHER,
    320                             mm.get(tagSet)
    321                             ));
    322 
     293                            primitives
     294                            ));
    323295                }
    324296                it.remove();
     
    326298        }
    327299
    328         // check whether we have multiple nodes at the same position with
    329         // differing tag sets
    330         //
     300        // check whether we have multiple nodes at the same position with differing tag sets
    331301        if (!mm.isEmpty()) {
    332302            List<OsmPrimitive> duplicates = new ArrayList<>();
Note: See TracChangeset for help on using the changeset viewer.