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

Last change on this file since 12318 was 11129, checked in by simon04, 8 years ago

fix #13799 - Use builder pattern for TestError

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