// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.plugins.graphview.core.property; import org.openstreetmap.josm.plugins.graphview.core.access.AccessParameters; import org.openstreetmap.josm.plugins.graphview.core.data.DataSource; import org.openstreetmap.josm.plugins.graphview.core.data.TagGroup; import org.openstreetmap.josm.plugins.graphview.core.util.ValueStringParser; /** * abstract superclass for road property types that define a limit for a vehicle property */ public abstract class RoadValueLimit implements RoadPropertyType<Float> { protected enum LimitType { MINIMUM, MAXIMUM } private final String keyName; private final VehiclePropertyType<Float> vehicleProperty; private final LimitType upperLimit; /** * @param keyName key that is used to add this property to a way; value must be in * format readable by {@link ValueStringParser#parseOsmDecimal(String)}; * != null * @param vehicleProperty vehicle property that is limited by this road property; != null * @param upperLimit type of limit; != null */ protected RoadValueLimit(String keyName, VehiclePropertyType<Float> vehicleProperty, LimitType upperLimit) { assert keyName != null && vehicleProperty != null && upperLimit != null; this.keyName = keyName; this.vehicleProperty = vehicleProperty; this.upperLimit = upperLimit; } protected abstract Float parse(String valueString); @Override public <N, W, R, M> Float evaluateW(W way, boolean forward, AccessParameters accessParameters, DataSource<N, W, R, M> dataSource) { assert way != null && accessParameters != null && dataSource != null; return evaluateTags(dataSource.getTagsW(way)); } @Override public <N, W, R, M> Float evaluateN(N node, AccessParameters accessParameters, DataSource<N, W, R, M> dataSource) { assert node != null && accessParameters != null && dataSource != null; return evaluateTags(dataSource.getTagsN(node)); } private Float evaluateTags(TagGroup tags) { String valueString = tags.getValue(keyName); if (valueString != null) { Float value = parse(valueString); return value; } else { return null; } } @Override public boolean isUsable(Object propertyValue, AccessParameters accessParameters) { assert propertyValue instanceof Float; Float vehicleValue = accessParameters.getVehiclePropertyValue(vehicleProperty); if (vehicleValue != null) { switch(upperLimit) { case MINIMUM: return vehicleValue >= (Float) propertyValue; case MAXIMUM: return vehicleValue <= (Float) propertyValue; default: throw new Error("Unhandled LimitType"); } } else { return true; } } }