// License: GPL. For details, see LICENSE file.
package org.openstreetmap.josm.plugins.graphview.plugin.preferences;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;
import org.openstreetmap.josm.plugins.graphview.core.access.AccessParameters;
import org.openstreetmap.josm.plugins.graphview.core.access.AccessType;
import org.openstreetmap.josm.plugins.graphview.core.property.VehiclePropertyType;
/**
* implementation of AccessParameters that stores not only property values,
* but also the original property Strings just like the user entered them.
*/
public class PreferenceAccessParameters implements AccessParameters {
private final String accessClass;
private final Map<AccessType, Boolean> accessTypeUsableMap;
private final Map<VehiclePropertyType<?>, String> vehiclePropertyStrings;
private final Map<VehiclePropertyType<?>, Object> vehiclePropertyValues;
@Override
public String getAccessClass() {
return accessClass;
}
@Override
public boolean getAccessTypeUsable(AccessType accessType) {
assert accessType != null;
return accessTypeUsableMap.get(accessType);
}
@Override
public Collection<VehiclePropertyType<?>> getAvailableVehicleProperties() {
return vehiclePropertyValues.keySet();
}
/**
* returns the value for a vehicle property.
*
* @param <D> type of property value
* @param vehicleProperty property to get value for; != null
* @return value for vehicleProperty, null if no value is available.
* Guaranteed to be valid according to vehicleProperty's
* {@link VehiclePropertyType#isValidValue(Object)} method.
*/
@Override
public <D> D getVehiclePropertyValue(VehiclePropertyType<D> vehicleProperty) {
assert vehicleProperty != null;
@SuppressWarnings("unchecked")
D value = (D) vehiclePropertyValues.get(vehicleProperty);
return value;
}
/**
* returns the unparsed String for a vehicle property.
*
* @param vehicleProperty property to get String for; != null
* @return unparsed String, null if no value is available.
*/
public String getVehiclePropertyString(VehiclePropertyType<?> vehicleProperty) {
assert vehicleProperty != null;
return vehiclePropertyStrings.get(vehicleProperty);
}
/**
* @param vehiclePropertyStrings map from vehicle properties to string representations
* that will be parsed using {@link VehiclePropertyStringParser}
* to get the property values; != null
*
* @throws VehiclePropertyStringParser.PropertyValueSyntaxException
* if a String from vehiclePropertyStrings contains a syntax error
*/
public PreferenceAccessParameters(String accessClass,
Collection<AccessType> usableAccessTypes,
Map<VehiclePropertyType<?>, String> vehiclePropertyStrings)
throws VehiclePropertyStringParser.PropertyValueSyntaxException {
this.accessClass = accessClass;
accessTypeUsableMap = new EnumMap<>(AccessType.class);
for (AccessType accessType : AccessType.values()) {
accessTypeUsableMap.put(accessType, usableAccessTypes.contains(accessType));
}
/* check and use vehicle properties */
this.vehiclePropertyStrings = Collections.unmodifiableMap(
new HashMap<>(vehiclePropertyStrings));
this.vehiclePropertyValues = new HashMap<>();
for (VehiclePropertyType<?> vehiclePropertyType : vehiclePropertyStrings.keySet()) {
String propertyValueString = vehiclePropertyStrings.get(vehiclePropertyType);
Object propertyValue = VehiclePropertyStringParser.parsePropertyValue(
vehiclePropertyType, propertyValueString);
this.vehiclePropertyValues.put(vehiclePropertyType, propertyValue);
}
}
}