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}