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}