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