source: josm/trunk/src/org/openstreetmap/josm/data/validation/tests/PublicTransportRouteTest.java@ 15121

Last change on this file since 15121 was 15121, checked in by Don-vip, 5 years ago

sonarqube, javadoc

File size: 3.7 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.ArrayList;
7import java.util.HashSet;
8import java.util.List;
9import java.util.Set;
10
11import org.openstreetmap.josm.data.osm.Node;
12import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
13import org.openstreetmap.josm.data.osm.Relation;
14import org.openstreetmap.josm.data.osm.RelationMember;
15import org.openstreetmap.josm.data.validation.Severity;
16import org.openstreetmap.josm.data.validation.Test;
17import org.openstreetmap.josm.data.validation.TestError;
18import org.openstreetmap.josm.gui.dialogs.relation.sort.WayConnectionType;
19import org.openstreetmap.josm.gui.dialogs.relation.sort.WayConnectionTypeCalculator;
20
21/**
22 * Tests for <a href="https://wiki.openstreetmap.org/wiki/Proposed_features/Public_Transport">public transport routes</a>.
23 */
24public class PublicTransportRouteTest extends Test {
25
26 private final WayConnectionTypeCalculator connectionTypeCalculator = new WayConnectionTypeCalculator();
27
28 /**
29 * Constructs a new {@code PublicTransportRouteTest}.
30 */
31 public PublicTransportRouteTest() {
32 super(tr("Public Transport Route"));
33 }
34
35 @Override
36 public void visit(Relation r) {
37 final boolean skip = r.hasIncompleteMembers()
38 || !r.hasTag("type", "route")
39 || !r.hasKey("route")
40 || !r.hasTag("public_transport:version", "2");
41 if (skip) {
42 return;
43 }
44
45 final List<RelationMember> membersToCheck = new ArrayList<>();
46 final Set<Node> routeNodes = new HashSet<>();
47 for (RelationMember member : r.getMembers()) {
48 if (member.hasRole("forward", "backward", "alternate")) {
49 errors.add(TestError.builder(this, Severity.ERROR, 3601)
50 .message(tr("Route relation contains a ''{0}'' role", "forward/backward/alternate"))
51 .primitives(r)
52 .build());
53 return;
54 } else if (member.hasRole("") && OsmPrimitiveType.WAY == member.getType()) {
55 membersToCheck.add(member);
56 routeNodes.addAll(member.getWay().getNodes());
57 }
58 }
59 if (membersToCheck.isEmpty()) {
60 return;
61 }
62
63 final List<WayConnectionType> links = connectionTypeCalculator.updateLinks(membersToCheck);
64 for (int i = 0; i < links.size(); i++) {
65 final WayConnectionType link = links.get(i);
66 final boolean hasError = !(i == 0 || link.linkPrev)
67 || !(i == links.size() - 1 || link.linkNext)
68 || link.direction == null
69 || WayConnectionType.Direction.NONE == link.direction;
70 if (hasError) {
71 errors.add(TestError.builder(this, Severity.WARNING, 3602)
72 .message(tr("Route relation contains a gap"))
73 .primitives(r)
74 .build());
75 return;
76 }
77 }
78
79 for (RelationMember member : r.getMembers()) {
80 if (member.hasRole("stop", "stop_exit_only", "stop_entry_only")
81 && OsmPrimitiveType.NODE == member.getType()
82 && !routeNodes.contains(member.getNode())) {
83 errors.add(TestError.builder(this, Severity.WARNING, 3603)
84 .message(tr("Stop position not part of route"))
85 .primitives(member.getMember(), r)
86 .build());
87 }
88 }
89 }
90
91 @Override
92 public void clear() {
93 connectionTypeCalculator.clear();
94 super.clear();
95 }
96}
Note: See TracBrowser for help on using the repository browser.