// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.data.validation.tests; import static org.openstreetmap.josm.tools.I18n.tr; import org.openstreetmap.josm.data.osm.Way; import org.openstreetmap.josm.data.validation.Severity; import org.openstreetmap.josm.data.validation.Test; import org.openstreetmap.josm.data.validation.TestError; import org.openstreetmap.josm.gui.progress.NullProgressMonitor; import org.openstreetmap.josm.io.Capabilities; import org.openstreetmap.josm.io.OsmApi; /** * Performs validation tests against OSM API capabilities. This class does not test length * of key/values (limited to 255 characters) because it's done by {@code TagChecker}. * @since 7574 */ public class ApiCapabilitiesTest extends Test { private static final int MAX_WAY_NODES_ERROR = 3401; private long maxNodes = -1; /** * Constructs a new {@code ApiCapabilitiesTest}. */ public ApiCapabilitiesTest() { super(tr("API Capabilities"), tr("Checks for errors against API capabilities")); } @Override public void initialize() throws Exception { super.initialize(); OsmApi api = OsmApi.getOsmApi(); api.initialize(NullProgressMonitor.INSTANCE); Capabilities capabilities = api.getCapabilities(); if (capabilities != null) { maxNodes = capabilities.getMaxWayNodes(); } } @Override public void visit(Way w) { if (maxNodes > 1 && w.getNodesCount() > maxNodes) { String message; if (w.isClosed()) { message = tr("Way contains more than {0} nodes. It should be replaced by a multipolygon", maxNodes); } else { message = tr("Way contains more than {0} nodes. It should be split or simplified", maxNodes); } errors.add(TestError.builder(this, Severity.ERROR, MAX_WAY_NODES_ERROR) .message(message) .primitives(w) .build()); } } }