Ticket #18057: 18057.3.patch

File 18057.3.patch, 6.4 KB (added by taylor.smock, 7 years ago)

Update patch to latest JOSM version

  • src/org/openstreetmap/josm/gui/mappaint/mapcss/Functions.java

     
    99import java.util.Collections;
    1010import java.util.List;
    1111import java.util.Locale;
     12import java.util.Map.Entry;
    1213import java.util.TreeSet;
    1314import java.util.regex.Matcher;
    1415import java.util.regex.Pattern;
     16import java.util.stream.Collectors;
    1517import java.util.zip.CRC32;
    1618
    1719import org.openstreetmap.josm.data.coor.LatLon;
     
    386388    }
    387389
    388390    /**
     391     * Get keys that follow a regex
     392     * @param env the environment
     393     * @param key_regex the pattern that the key must match
     394     * @return the values for the keys that match the pattern
     395     * @see Functions#tag_regex(Environment, String, String)
     396     * @since xxx
     397     */
     398    public static List<String> tag_regex(final Environment env, String key_regex) { // NO_UCD (unused code)
     399        return tag_regex(env, key_regex, "");
     400    }
     401
     402    /**
     403     * Get keys that follow a regex
     404     * @param env the environment
     405     * @param key_regex the pattern that the key must match
     406     * @return the values for the keys that match the pattern
     407     * @param flags a string that may contain "i" (case insensitive), "m" (multiline) and "s" ("dot all")
     408     * @see Pattern#CASE_INSENSITIVE
     409     * @see Pattern#DOTALL
     410     * @see Pattern#MULTILINE
     411     * @since xxx
     412     */
     413    public static List<String> tag_regex(final Environment env, String key_regex, String flags) { // NO_UCD (unused code)
     414        int f = parse_regex_flags(flags);
     415        Pattern compiled = Pattern.compile(key_regex, f);
     416        return env.osm.getKeys().entrySet().stream()
     417                .filter(object -> compiled.matcher(object.getKey()).find())
     418                .map(Entry::getValue).collect(Collectors.toList());
     419    }
     420
     421    /**
     422     * Parse flags for regex usage. Shouldn't be used in mapcss
     423     * @param flags a string that may contain "i" (case insensitive), "m" (multiline) and "s" ("dot all")
     424     * @see Pattern#CASE_INSENSITIVE
     425     * @see Pattern#DOTALL
     426     * @see Pattern#MULTILINE
     427     * @return An int that can be used by a {@link Pattern} object
     428     * @since xxx
     429     */
     430    private static final int parse_regex_flags(String flags) {
     431        int f = 0;
     432        if (flags.contains("i")) {
     433            f |= Pattern.CASE_INSENSITIVE;
     434        }
     435        if (flags.contains("s")) {
     436            f |= Pattern.DOTALL;
     437        }
     438        if (flags.contains("m")) {
     439            f |= Pattern.MULTILINE;
     440        }
     441        return f;
     442    }
     443
     444    /**
    389445     * Gets the first non-null value of the key {@code key} from the object's parent(s).
    390446     * @param env the environment
    391447     * @param key the OSM key
     
    724780     * @since 5699
    725781     */
    726782    public static boolean regexp_test(String pattern, String target, String flags) { // NO_UCD (unused code)
    727         int f = 0;
    728         if (flags.contains("i")) {
    729             f |= Pattern.CASE_INSENSITIVE;
    730         }
    731         if (flags.contains("s")) {
    732             f |= Pattern.DOTALL;
    733         }
    734         if (flags.contains("m")) {
    735             f |= Pattern.MULTILINE;
    736         }
     783        int f = parse_regex_flags(flags);
    737784        return Pattern.compile(pattern, f).matcher(target).matches();
    738785    }
    739786
     
    751798     * @since 5701
    752799     */
    753800    public static List<String> regexp_match(String pattern, String target, String flags) { // NO_UCD (unused code)
    754         int f = 0;
    755         if (flags.contains("i")) {
    756             f |= Pattern.CASE_INSENSITIVE;
    757         }
    758         if (flags.contains("s")) {
    759             f |= Pattern.DOTALL;
    760         }
    761         if (flags.contains("m")) {
    762             f |= Pattern.MULTILINE;
    763         }
     801        int f = parse_regex_flags(flags);
    764802        return Utils.getMatches(Pattern.compile(pattern, f).matcher(target));
    765803    }
    766804
  • test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSParserTest.java

     
    1212import java.util.Arrays;
    1313import java.util.List;
    1414
     15import org.junit.Assert;
    1516import org.junit.Rule;
    1617import org.junit.Test;
    1718import org.openstreetmap.josm.TestUtils;
     
    262263        assertFalse(c2.applies(new Environment(w2)));
    263264    }
    264265
     266    /**
     267     * Make certain that getting tags by regex works
     268     * @throws Exception if there is an assert error (or another error)
     269     */
    265270    @Test
     271    public void testTagRegex() throws Exception {
     272        DataSet ds = new DataSet();
     273        Way way1 = TestUtils.newWay("old_ref=A1 ref=A2", new Node(new LatLon(1, 1)), new Node(new LatLon(2, 2)));
     274        for (Node node : way1.getNodes()) {
     275            ds.addPrimitive(node);
     276        }
     277        ds.addPrimitive(way1);
     278
     279        tagRegex(way1, "way[ref][count(tag_regex(\"ref\")) > 1] {}", new Boolean[] {true, false, false, true, false});
     280        way1.keySet().stream().forEach(key -> way1.put(key, null));
     281        way1.put("old_ref", "A1");
     282        way1.put("ref", "A2");
     283        tagRegex(way1, "way[ref][count(tag_regex(\"ref\", \"i\")) > 1] {}", new Boolean[] {true, false, false, true, true});
     284    }
     285
     286    private void tagRegex(Way way, String parserString, Boolean[] expected) throws Exception {
     287        Selector selector = getParser(parserString).selector();
     288        Assert.assertEquals(expected[0], selector.matches(new Environment(way)));
     289        way.put("old_ref", null);
     290        Assert.assertEquals(expected[1], selector.matches(new Environment(way)));
     291        way.put("no_match_tag", "false");
     292        Assert.assertEquals(expected[2], selector.matches(new Environment(way)));
     293        way.put("old_ref", "A22");
     294        Assert.assertEquals(expected[3], selector.matches(new Environment(way)));
     295        way.put("old_ref", null);
     296        way.put("OLD_REF", "A23");
     297        Assert.assertEquals(expected[4], selector.matches(new Environment(way)));
     298    }
     299
     300    @Test
    266301    public void testParentTag() throws Exception {
    267302        Selector c1 = getParser("way[foo] > node[tag(\"foo\")=parent_tag(\"foo\")] {}").child_selector();
    268303        DataSet ds = new DataSet();