// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.pt_assistant.validation;
import static org.openstreetmap.josm.tools.I18n.tr;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import org.openstreetmap.josm.data.osm.OsmPrimitive;
import org.openstreetmap.josm.data.osm.Relation;
import org.openstreetmap.josm.data.validation.Severity;
import org.openstreetmap.josm.data.validation.Test;
import org.openstreetmap.josm.data.validation.TestError;
import org.openstreetmap.josm.data.validation.TestError.Builder;
import org.openstreetmap.josm.plugins.pt_assistant.utils.StopUtils;
/**
* Performs tests of the stop area relations
*
* @author
*
*/
public class StopChecker extends Checker {
Set<OsmPrimitive> members;
protected StopChecker(Relation relation, Test test) {
super(relation, test);
this.members = relation.getMemberPrimitives();
}
/**
* Checks if the given stop area relation has a stop position.
*/
protected void performStopAreaStopPositionTest() {
// No errors if there is a member tagged as stop position.
for (OsmPrimitive member : members) {
if (StopUtils.verifyStopAreaStopPosition(member)) {
return;
}
}
// Throw error message
List<OsmPrimitive> primitives = new ArrayList<>(1);
primitives.add(relation);
Builder builder = TestError.builder(this.test, Severity.WARNING, PTAssistantValidatorTest.ERROR_CODE_STOP_AREA_NO_STOPS);
builder.message(tr("PT: Stop area relation has no stop position"));
builder.primitives(primitives);
TestError e = builder.build();
errors.add(e);
}
/**
* Checks if the given stop area relation has a platform.
*/
protected void performStopAreaPlatformTest() {
// No errors if there is a member tagged as platform.
for (OsmPrimitive member : members) {
if (StopUtils.verifyStopAreaPlatform(member)) {
return;
}
}
// Throw error message
List<OsmPrimitive> primitives = new ArrayList<>(1);
primitives.add(relation);
Builder builder = TestError.builder(this.test, Severity.WARNING, PTAssistantValidatorTest.ERROR_CODE_STOP_AREA_NO_PLATFORM);
builder.message(tr("PT: Stop area relation has no platform"));
builder.primitives(primitives);
TestError e = builder.build();
errors.add(e);
}
/**
* Checks if the stop_position(s) of an stop area belong to the same route
* relations as its related platform(s).
*/
protected void performStopAreaRelationsTest() {
HashMap<Long, Long> stopPositionRelationIds = new HashMap<>();
HashMap<Long, Long> platformRelationIds = new HashMap<>();
// Loop through all members
for (OsmPrimitive member : members) {
// For stop positions...
if (StopUtils.verifyStopAreaStopPosition(member)) {
// Create a list of assigned route relations
for (Relation referrer : OsmPrimitive.getFilteredList(member.getReferrers(), Relation.class)) {
if (referrer.get("type") == "route") {
stopPositionRelationIds.put(referrer.getId(), referrer.getId());
}
}
// For platforms...
} else if (StopUtils.verifyStopAreaPlatform(member)) {
// Create a list of assigned route relations
for (Relation referrer : OsmPrimitive.getFilteredList(member.getReferrers(), Relation.class)) {
if (referrer.get("type") == "route") {
platformRelationIds.put(referrer.getId(), referrer.getId());
}
}
}
}
// Check if the stop_position has no referrers at all. If it has no
// referrers, then no error should be reported (changed on 11.08.2016 by
// darya):
if (stopPositionRelationIds.isEmpty()) {
return;
}
// Check if route relation lists are identical
if (stopPositionRelationIds.equals(platformRelationIds)) {
return;
}
// Throw error message
List<OsmPrimitive> primitives = new ArrayList<>(1);
primitives.add(relation);
Builder builder = TestError.builder(this.test, Severity.WARNING, PTAssistantValidatorTest.ERROR_CODE_STOP_AREA_COMPARE_RELATIONS);
builder.message(tr("PT: Route relations of stop position(s) and platform(s) of stop area members diverge"));
builder.primitives(primitives);
TestError e = builder.build();
errors.add(e);
}
}