source: josm/trunk/src/org/openstreetmap/josm/data/validation/tests/Lanes.java@ 6834

Last change on this file since 6834 was 6834, checked in by simon04, 10 years ago

see #8519 - Lanes validator: improve performance

File size: 3.4 KB
Line 
1// License: GPL. See LICENSE file for details.
2package org.openstreetmap.josm.data.validation.tests;
3
4import org.openstreetmap.josm.Main;
5import org.openstreetmap.josm.data.osm.OsmPrimitive;
6import org.openstreetmap.josm.data.validation.Severity;
7import org.openstreetmap.josm.data.validation.Test;
8import org.openstreetmap.josm.data.validation.TestError;
9import org.openstreetmap.josm.tools.Predicates;
10import org.openstreetmap.josm.tools.Utils;
11
12import java.util.Collection;
13import java.util.HashSet;
14import java.util.Set;
15import java.util.regex.Pattern;
16
17import static org.openstreetmap.josm.tools.I18n.tr;
18
19/**
20 * Test that validates {@code lane:} tags.
21 * @since 6592
22 */
23public class Lanes extends Test.TagTest {
24
25 /**
26 * Constructs a new {@code Lanes} test.
27 */
28 public Lanes() {
29 super(tr("Lane tags"));
30 }
31
32 static int getLanesCount(String value) {
33 return value.isEmpty() ? 0 : value.replaceAll("[^|]", "").length() + 1;
34 }
35
36 protected void checkNumberOfLanesByKey(final OsmPrimitive p, String lanesKey, String message) {
37 final Collection<String> keysForPattern = Utils.filter(p.keySet(),
38 Predicates.stringContainsPattern(Pattern.compile(":" + lanesKey + "$")));
39 if (keysForPattern.size() < 1) {
40 // nothing to check
41 return;
42 }
43 final Set<Integer> lanesCount = new HashSet<Integer>(Utils.transform(keysForPattern, new Utils.Function<String, Integer>() {
44 @Override
45 public Integer apply(String key) {
46 return getLanesCount(p.get(key));
47 }
48 }));
49 if (lanesCount.size() > 1) {
50 // if not all numbers are the same
51 errors.add(new TestError(this, Severity.WARNING, message, 3100, p));
52 } else if (lanesCount.size() == 1 && p.hasKey(lanesKey)) {
53 // ensure that lanes <= *:lanes
54 try {
55 if (Integer.parseInt(p.get(lanesKey)) > lanesCount.iterator().next()) {
56 errors.add(new TestError(this, Severity.WARNING, tr("Number of {0} greater than {1}", lanesKey, "*:" + lanesKey), 3100, p));
57 }
58 } catch (NumberFormatException ignore) {
59 Main.debug(ignore.getMessage());
60 }
61 }
62 }
63
64 protected void checkNumberOfLanes(final OsmPrimitive p) {
65 final String lanes = p.get("lanes");
66 if (lanes == null) return;
67 final String forward = Utils.firstNonNull(p.get("lanes:forward"), "0");
68 final String backward = Utils.firstNonNull(p.get("lanes:backward"), "0");
69 try {
70 if (Integer.parseInt(lanes) < Integer.parseInt(forward) + Integer.parseInt(backward)) {
71 errors.add(new TestError(this, Severity.WARNING,
72 tr("Number of {0} greater than {1}", tr("{0}+{1}", "lanes:forward", "lanes:backward"), "lanes"), 3101, p));
73 }
74 } catch (NumberFormatException ignore) {
75 Main.debug(ignore.getMessage());
76 }
77 }
78
79 @Override
80 public void check(OsmPrimitive p) {
81 checkNumberOfLanesByKey(p, "lanes", tr("Number of lane dependent values inconsistent"));
82 checkNumberOfLanesByKey(p, "lanes:forward", tr("Number of lane dependent values inconsistent in forward direction"));
83 checkNumberOfLanesByKey(p, "lanes:backward", tr("Number of lane dependent values inconsistent in backward direction"));
84 checkNumberOfLanes(p);
85 }
86}
Note: See TracBrowser for help on using the repository browser.