001    // License: GPL. See LICENSE file for details.
002    package org.openstreetmap.josm.data.validation.tests;
003    
004    import static org.openstreetmap.josm.tools.I18n.tr;
005    
006    import java.util.Collections;
007    
008    import org.openstreetmap.josm.data.osm.Way;
009    import org.openstreetmap.josm.data.validation.Severity;
010    import org.openstreetmap.josm.data.validation.Test;
011    import org.openstreetmap.josm.data.validation.TestError;
012    import org.openstreetmap.josm.tools.Geometry;
013    
014    /**
015     * Check cyclic ways for errors
016     *
017     * @author jrreid
018     */
019    public class WronglyOrderedWays extends Test {
020    
021        protected static final int WRONGLY_ORDERED_COAST = 1001;
022        //protected static int WRONGLY_ORDERED_WATER = 1002;
023        protected static final int WRONGLY_ORDERED_LAND  = 1003;
024    
025        /**
026         * Constructor
027         */
028        public WronglyOrderedWays() {
029            super(tr("Wrongly Ordered Ways"),
030                    tr("This test checks the direction of water, land and coastline ways."));
031        }
032    
033        @Override
034        public void visit(Way w) {
035    
036            if (!w.isUsable() || !w.isClosed())
037                return;
038    
039            String natural = w.get("natural");
040            if (natural == null)
041                return;
042            else if ("coastline".equals(natural) && Geometry.isClockwise(w)) {
043                reportError(w, tr("Reversed coastline: land not on left side"), WRONGLY_ORDERED_COAST);
044                /*} else if ("water".equals(natural) && !Geometry.isClockwise(w)) {
045                reportError(w, tr("Reversed water: land not on left side"), WRONGLY_ORDERED_WATER);*/
046            } else if ("land".equals(natural) && Geometry.isClockwise(w)) {
047                reportError(w, tr("Reversed land: land not on left side"), WRONGLY_ORDERED_LAND);
048            } else
049                return;
050    
051        }
052    
053        private void reportError(Way w, String msg, int type) {
054            errors.add(new TestError(this, Severity.WARNING, msg, type, Collections.singletonList(w)));
055        }
056    }