Ticket #19053: 19053.7.patch

File 19053.7.patch, 8.9 KB (added by GerdP, 6 years ago)
  • src/org/openstreetmap/josm/data/preferences/sources/ValidatorPrefHelper.java

     
    4747    /** The preferences key for the ignorelist */
    4848    public static final String PREF_IGNORELIST = PREFIX + ".ignorelist";
    4949
     50    /** The preferences key for the ignorelist format */
     51    public static final String PREF_IGNORELIST_FORMAT = PREF_IGNORELIST + ".version";
     52
    5053    /**
    5154     * The preferences key for enabling the permanent filtering
    5255     * of the displayed errors in the tree regarding the current selection
  • src/org/openstreetmap/josm/data/validation/OsmValidator.java

     
    1818import java.util.EnumMap;
    1919import java.util.Enumeration;
    2020import java.util.HashMap;
     21import java.util.HashSet;
    2122import java.util.Iterator;
    2223import java.util.List;
    2324import java.util.Map;
    2425import java.util.Map.Entry;
     26import java.util.Set;
    2527import java.util.SortedMap;
    2628import java.util.TreeMap;
    2729import java.util.TreeSet;
     
    221223                        TreeSet<String> treeSet = new TreeSet<>();
    222224                        treeSet.addAll(Files.readAllLines(path, StandardCharsets.UTF_8));
    223225                        treeSet.forEach(ignore -> ignoredErrors.putIfAbsent(ignore, ""));
     226                        removeLegacyEntries(true);
    224227
    225228                        saveIgnoredErrors();
    226229                        Files.deleteIfExists(path);
     
    234237            } catch (SecurityException e) {
    235238                Logging.log(Logging.LEVEL_ERROR, "Unable to load ignored errors", e);
    236239            }
    237             // see #19053: remove invalid entry
    238             ignoredErrors.remove("3000");
     240            removeLegacyEntries(Config.getPref().get(ValidatorPrefHelper.PREF_IGNORELIST_FORMAT).isEmpty());
    239241        }
    240242    }
    241243
     244    private static void removeLegacyEntries(boolean force) {
     245        // see #19053:
     246        boolean wasChanged = false;
     247        if (force) {
     248            Iterator<Entry<String, String>> iter = ignoredErrors.entrySet().iterator();
     249            while (iter.hasNext()) {
     250                Entry<String, String> entry = iter.next();
     251                if (entry.getKey().startsWith("3000_")) {
     252                    Logging.warn(tr("Cannot handle ignore list entry {0}", entry));
     253                    iter.remove();
     254                    wasChanged = true;
     255                }
     256            }
     257        }
     258        String legacyEntry = ignoredErrors.remove("3000");
     259        if (legacyEntry != null) {
     260            if (!legacyEntry.isEmpty()) {
     261                addIgnoredError("3000_" + legacyEntry, legacyEntry);
     262            }
     263            wasChanged = true;
     264        }
     265        if (wasChanged) {
     266            saveIgnoredErrors();
     267        }
     268    }
     269
    242270    /**
    243271     * Adds an ignored error
    244272     * @param s The ignore group / sub group name
     
    265293     *  Make sure that we don't keep single entries for a "group ignore".
    266294     */
    267295    static void cleanupIgnoredErrors() {
     296        cleanup3000();
    268297        if (ignoredErrors.size() > 1) {
    269298            List<String> toRemove = new ArrayList<>();
    270299
     
    288317        }
    289318    }
    290319
     320    private static void cleanup3000() {
     321        // see #19053
     322        if (ignoredErrors.size() > 1) {
     323            Set<String> toRemove = new HashSet<>();
     324            for (Entry<String, String> entry : ignoredErrors.entrySet()) {
     325                if (entry.getKey().equals("3000_" + entry.getValue()))
     326                    toRemove.add(entry.getValue());
     327            }
     328            ignoredErrors.entrySet()
     329                    .removeIf(e -> toRemove.contains(e.getValue()) && !e.getKey().equals("3000_" + e.getValue()));
     330
     331        }
     332    }
     333
    291334    private static boolean sameCode(String key1, String key2) {
    292335        return extractCodeFromIgnoreKey(key1).equals(extractCodeFromIgnoreKey(key2));
    293336    }
     
    482525        }
    483526        if (list.isEmpty()) list = null;
    484527        Config.getPref().putListOfMaps(ValidatorPrefHelper.PREF_IGNORELIST, list);
     528        Config.getPref().put(ValidatorPrefHelper.PREF_IGNORELIST_FORMAT, "2");
    485529    }
    486530
    487531    /**
  • src/org/openstreetmap/josm/data/validation/TestError.java

     
    338338     * @return The ignore sub group
    339339     */
    340340    public String getIgnoreSubGroup() {
     341        if (code == 3000) {
     342            // see #19053
     343            return "3000_" + (description == null ? message : description);
     344        }
    341345        String ignorestring = getIgnoreGroup();
    342346        if (descriptionEn != null) {
    343347            ignorestring += '_' + descriptionEn;
     
    351355     * @see TestError#getIgnoreSubGroup()
    352356     */
    353357    public String getIgnoreGroup() {
     358        if (code == 3000) {
     359            // see #19053
     360            return "3000_" + getMessage();
     361        }
    354362        return Integer.toString(code);
    355363    }
    356364
     
    524532    public String toString() {
    525533        return "TestError [tester=" + tester + ", code=" + code + ", message=" + message + ']';
    526534    }
     535
    527536}
  • src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java

     
    410410
    411411        lastSelectedNode = node;
    412412        if (node != null) {
    413             final Set<String> codes = new HashSet<>();
    414413            ValidatorTreePanel.visitTestErrors(node, error -> {
    415                 codes.add(error.getIgnoreSubGroup()); // see #19053
    416414                error.setSelected(true);
    417415
    418416                hasFixes.set(hasFixes.get() || error.isFixable());
     
    424422            });
    425423            selectAction.setEnabled(true);
    426424            if (ignoreAction != null) {
    427                 ignoreAction.setEnabled(!(node.getUserObject() instanceof Severity) && codes.size() <= 1);
     425                ignoreAction.setEnabled(!(node.getUserObject() instanceof Severity));
    428426            }
    429427        }
    430428
  • test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java

     
    144144        final Collection<TestError> errors = test.getErrorsForPrimitive(p, false);
    145145        assertEquals(1, errors.size());
    146146        assertEquals("has alt_name but not name", errors.iterator().next().getMessage());
    147         assertEquals("3000_*[.+_name][!name]", errors.iterator().next().getIgnoreSubGroup());
     147        assertEquals("3000_has alt_name but not name", errors.iterator().next().getIgnoreSubGroup());
    148148    }
    149149
    150150    /**
     
    159159        final Collection<TestError> errors = test.getErrorsForPrimitive(p, false);
    160160        assertEquals(1, errors.size());
    161161        assertEquals("footway used with foot=no", errors.iterator().next().getMessage());
    162         assertEquals("3000_way[highway=footway][foot]", errors.iterator().next().getIgnoreSubGroup());
     162        assertEquals("3000_footway used with foot=no", errors.iterator().next().getIgnoreSubGroup());
    163163    }
    164164
    165165    /**
     
    413413        }
    414414    }
    415415
     416    /**
     417     * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/19053">Bug #19053</a>.
     418     * Mapcss rule with group.
     419     * @throws ParseException if a parsing error occurs
     420     */
     421    @Test
     422    public void testTicket19053() throws ParseException {
     423        final MapCSSTagChecker test = buildTagChecker(
     424                "*[ele][ele =~ /^-?[0-9]+\\.[0-9][0-9][0-9]+$/] {"
     425                        + "throwWarning: tr(\"{0}\",\"{0.tag}\");"
     426                        + "group: tr(\"Unnecessary amount of decimal places\");" + "}");
     427        final OsmPrimitive p = OsmUtils.createPrimitive("node ele=12.123456");
     428        final Collection<TestError> errors = test.getErrorsForPrimitive(p, false);
     429        assertEquals(1, errors.size());
     430        assertEquals("Unnecessary amount of decimal places", errors.iterator().next().getMessage());
     431        assertEquals("3000_ele=12.123456", errors.iterator().next().getIgnoreSubGroup());
     432        assertEquals("3000_Unnecessary amount of decimal places", errors.iterator().next().getIgnoreGroup());
     433    }
     434
    416435}