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        Double length = w.getLongestSegmentLength();
037        if (length > maxlength) {
038            length /= 1000.0;
039            errors.add(new TestError(this, Severity.WARNING, tr("Long segments"),
040                    tr("Very long segment of {0} kilometers", length.intValue()),
041                    String.format("Very long segment of %d kilometers", length.intValue()),
042                    LONG_SEGMENT, w));
043        }
044    }
045
046    @Override
047    public void startTest(ProgressMonitor monitor) {
048        super.startTest(monitor);
049        maxlength = Main.pref.getInteger("validator.maximum.segment.length", 15000);
050    }
051
052    @Override
053    public boolean isPrimitiveUsable(OsmPrimitive p) {
054        return p.isUsable() && p instanceof Way && ((Way) p).getNodesCount() > 1; // test only Ways with at least 2 nodes
055    }
056}