001// License: GPL. For details, see LICENSE file.
002package org.openstreetmap.josm.data.validation.tests;
003
004import static org.openstreetmap.josm.tools.I18n.marktr;
005import static org.openstreetmap.josm.tools.I18n.tr;
006
007import org.openstreetmap.josm.Main;
008import org.openstreetmap.josm.data.osm.OsmPrimitive;
009import org.openstreetmap.josm.data.osm.Way;
010import org.openstreetmap.josm.data.validation.Severity;
011import org.openstreetmap.josm.data.validation.Test;
012import org.openstreetmap.josm.data.validation.TestError;
013import org.openstreetmap.josm.gui.progress.ProgressMonitor;
014
015/**
016 * Checks for untagged ways
017 *
018 * @since 8320
019 */
020public class LongSegment extends Test {
021
022    /** Long segment error */
023    protected static final int LONG_SEGMENT = 3501;
024    /** Maximum segment length for this test */
025    protected int maxlength;
026
027    /**
028     * Constructor
029     */
030    public LongSegment() {
031        super(tr("Long segments"),
032              tr("This tests for long way segments, which are usually errors."));
033    }
034
035    @Override
036    public void visit(Way w) {
037        if ("ferry".equals(w.get("route"))) {
038            return;
039        }
040        Double length = w.getLongestSegmentLength();
041        if (length > maxlength) {
042            length /= 1000.0;
043            errors.add(TestError.builder(this, Severity.WARNING, LONG_SEGMENT)
044                    .message(tr("Long segments"), marktr("Very long segment of {0} kilometers"), length.intValue())
045                    .primitives(w)
046                    .build());
047        }
048    }
049
050    @Override
051    public void startTest(ProgressMonitor monitor) {
052        super.startTest(monitor);
053        maxlength = Main.pref.getInteger("validator.maximum.segment.length", 15_000);
054    }
055
056    @Override
057    public boolean isPrimitiveUsable(OsmPrimitive p) {
058        return p.isUsable() && p instanceof Way && ((Way) p).getNodesCount() > 1; // test only Ways with at least 2 nodes
059    }
060}