// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.data.validation.tests; import static org.openstreetmap.josm.tools.I18n.tr; import org.openstreetmap.josm.data.osm.Way; 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.tools.Geometry; /** * Check cyclic ways for errors * * @author jrreid */ public class WronglyOrderedWays extends Test { // CHECKSTYLE.OFF: SingleSpaceSeparator protected static final int WRONGLY_ORDERED_COAST = 1001; protected static final int WRONGLY_ORDERED_LAND = 1003; // CHECKSTYLE.ON: SingleSpaceSeparator /** * Constructor */ public WronglyOrderedWays() { super(tr("Wrongly Ordered Ways"), tr("This test checks the direction of water, land and coastline ways.")); } @Override public void visit(Way w) { if (!w.isUsable() || !w.isClosed()) return; String natural = w.get("natural"); if (natural == null) return; else if ("coastline".equals(natural) && Geometry.isClockwise(w)) { reportError(w, tr("Reversed coastline: land not on left side"), WRONGLY_ORDERED_COAST); } else if ("land".equals(natural) && Geometry.isClockwise(w)) { reportError(w, tr("Reversed land: land not on left side"), WRONGLY_ORDERED_LAND); } else return; } private void reportError(Way w, String msg, int type) { errors.add(TestError.builder(this, Severity.WARNING, type) .message(msg) .primitives(w) .build()); } }