Ignore:
Timestamp:
2020-07-17T17:12:54+02:00 (4 years ago)
Author:
GerdP
Message:

see #19180: false positives from tagchecker with single letter differences

  • avoid to produce "Value 'y' for key 'x' is unknown, maybe 'z' is meant?" when x=z produces a deprecated message. It uses all *.mapcss rules which are stored in files ending with deprecated.mapcss, so this will fail if user changed the name to something else, but it should work with e.g. my_deprecated.mapcss
File:
1 edited

Legend:

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

    r16630 r16784  
    1818import java.util.HashMap;
    1919import java.util.HashSet;
     20import java.util.Iterator;
    2021import java.util.LinkedHashMap;
    2122import java.util.LinkedHashSet;
     
    4546import org.openstreetmap.josm.data.osm.Tagged;
    4647import org.openstreetmap.josm.data.preferences.sources.ValidatorPrefHelper;
     48import org.openstreetmap.josm.data.validation.OsmValidator;
    4749import org.openstreetmap.josm.data.validation.Severity;
    4850import org.openstreetmap.josm.data.validation.Test.TagTest;
     
    100102    /** The preferences prefix */
    101103    protected static final String PREFIX = ValidatorPrefHelper.PREFIX + "." + TagChecker.class.getSimpleName();
     104
     105    MapCSSTagChecker deprecatedChecker;
    102106
    103107    /**
     
    894898            // use Levenshtein distance to find typical typos
    895899            int minDist = MAX_LEVENSHTEIN_DISTANCE + 1;
    896             String closest = null;
    897900            for (Set<String> possibleValues: sets) {
    898901                for (String possibleVal : possibleValues) {
     
    911914                    }
    912915                    if (dist < minDist) {
    913                         closest = possibleVal;
    914916                        minDist = dist;
    915917                        fixVals.clear();
     
    920922                }
    921923            }
    922 
     924            filterDeprecatedTags(p, key, fixVals);
    923925            if (minDist <= MAX_LEVENSHTEIN_DISTANCE && maxPresetValueLen > MAX_LEVENSHTEIN_DISTANCE
     926                    && !fixVals.isEmpty()
    924927                    && (harmonizedValue.length() > 3 || minDist < MAX_LEVENSHTEIN_DISTANCE)) {
    925928                if (fixVals.size() < 2) {
    926                     fixedValue = closest;
     929                    fixedValue = fixVals.get(0);
    927930                } else {
    928931                    Collections.sort(fixVals);
     
    958961    }
    959962
     963    // see #19180
     964    private void filterDeprecatedTags(OsmPrimitive p, String key, List<String> fixVals) {
     965        if (fixVals.isEmpty() || deprecatedChecker == null)
     966            return;
     967
     968        String origVal = p.get(key);
     969        try {
     970            int unchangedDeprecated = countDeprecated(p);
     971            Iterator<String> iter = fixVals.iterator();
     972            while (iter.hasNext()) {
     973                p.put(key, iter.next());
     974                if (countDeprecated(p) > unchangedDeprecated)
     975                    iter.remove();
     976            }
     977        } finally {
     978            // restore original value
     979            p.put(key, origVal);
     980        }
     981    }
     982
     983    private int countDeprecated(OsmPrimitive p) {
     984        if (deprecatedChecker == null)
     985            return 0;
     986        deprecatedChecker.getErrors().clear();
     987        deprecatedChecker.runOnly("deprecated.mapcss", Collections.singleton(p));
     988        return deprecatedChecker.getErrors().size();
     989    }
     990
    960991    private static boolean isNum(String harmonizedValue) {
    961992        try {
     
    10081039            checkPresetsTypes = checkPresetsTypes && Config.getPref().getBoolean(PREF_CHECK_PRESETS_TYPES_BEFORE_UPLOAD, true);
    10091040        }
     1041        deprecatedChecker = OsmValidator.getTest(MapCSSTagChecker.class);
     1042    }
     1043
     1044    @Override
     1045    public void endTest() {
     1046        deprecatedChecker = null;
     1047        super.endTest();
    10101048    }
    10111049
Note: See TracChangeset for help on using the changeset viewer.