RouteProfileConfiguration.java

/*  This file is part of Openrouteservice.
 *
 *  Openrouteservice is free software; you can redistribute it and/or modify it under the terms of the
 *  GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1
 *  of the License, or (at your option) any later version.

 *  This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
 *  without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 *  See the GNU Lesser General Public License for more details.

 *  You should have received a copy of the GNU Lesser General Public License along with this library;
 *  if not, see <https://www.gnu.org/licenses/>.
 */
package org.heigit.ors.routing.configuration;

import com.typesafe.config.Config;
import org.apache.commons.lang3.StringUtils;
import org.heigit.ors.routing.RoutingProfileType;
import org.locationtech.jts.geom.Envelope;

import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class RouteProfileConfiguration {
    private String name = "";
    private boolean enabled = true;
    private String profiles = ""; // comma separated
    private String graphPath;
    private Map<String, Map<String, String>> extStorages;
    private Map<String, Map<String, String>> graphBuilders;
    private Double maximumDistance = 0.0;
    private Double maximumDistanceDynamicWeights = 0.0;
    private Double maximumDistanceAvoidAreas = 0.0;
    private Double maximumDistanceAlternativeRoutes = 0.0;
    private Double maximumDistanceRoundTripRoutes = 0.0;
    private Integer maximumWayPoints = 0;
    private boolean instructions = true;
    private boolean optimize = false;

    private int encoderFlagsSize = 4;
    private String encoderOptions = "";
    private String gtfsFile = "";
    private Config isochronePreparationOpts;
    private Config preparationOpts;
    private Config executionOpts;

    private String elevationProvider = null;
    private String elevationCachePath = null;
    private String elevationDataAccess = "MMAP";
    private boolean elevationCacheClear = true;
    private boolean elevationSmoothing = true;
    private boolean interpolateBridgesAndTunnels = true;
    private int maximumSnappingRadius = 350;

    private Envelope extent;
    private boolean hasMaximumSnappingRadius = false;

    private int locationIndexResolution = 500;
    private int locationIndexSearchIterations = 4;

    private double maximumSpeedLowerBound = 80;

    private final int trafficExpirationMin = 15;

    private int maximumVisitedNodesPT = 1000000;

    private boolean turnCostEnabled = false;//FIXME: even though the field is read by external methods, its setter is never called.
    private boolean enforceTurnCosts = false;
    private String graphDataAccess = "";

    public RouteProfileConfiguration() {
        extStorages = new HashMap<>();
        graphBuilders = new HashMap<>();
    }

    public static boolean hasTurnCosts(String encoderOptions) {
        for (String option : encoderOptions.split("\\|")) {
            String[] keyValuePair = option.split("=");
            if (keyValuePair.length > 0 && keyValuePair[0].equals("turn_costs")) {
                return keyValuePair[1].equals("true");
            }
        }
        return false;
    }

    public Integer[] getProfilesTypes() {
        ArrayList<Integer> list = new ArrayList<>();

        String[] elements = profiles.split("\\s*,\\s*");

        for (String element : elements) {
            int profileType = RoutingProfileType.getFromString(element);

            if (profileType != RoutingProfileType.UNKNOWN) {
                list.add(profileType);
            }
        }

        return list.toArray(new Integer[0]);
    }

    public void setName(String value) {
        name = value;
    }

    public String getName() {
        return name;
    }

    public void setEnabled(Boolean value) {
        enabled = value;
    }

    public boolean getEnabled() {
        return enabled;
    }

    public void setProfiles(String value) {
        profiles = value;
    }

    public String getProfiles() {
        return profiles;
    }

    public void setGraphPath(String value) {
        if (StringUtils.isNotBlank(value))
            graphPath = Paths.get(value).toAbsolutePath().toString();
        else graphPath = value;
    }

    public String getGraphPath() {
        return graphPath;
    }

    public void setExtStorages(Map<String, Map<String, String>> value) {
        extStorages = value;
    }

    public Map<String, Map<String, String>> getExtStorages() {
        return extStorages;
    }

    public void setGraphBuilders(Map<String, Map<String, String>> value) {
        graphBuilders = value;
    }

    public Map<String, Map<String, String>> getGraphBuilders() {
        return graphBuilders;
    }

    public void setInstructions(Boolean value) {
        instructions = value;
    }

    public boolean getInstructions() {
        return instructions;
    }

    public void setMaximumDistance(Double value) {
        maximumDistance = value;
    }

    public Double getMaximumDistance() {
        return maximumDistance;
    }

    public void setMaximumDistanceDynamicWeights(Double value) {
        maximumDistanceDynamicWeights = value;
    }

    public Double getMaximumDistanceDynamicWeights() {
        return maximumDistanceDynamicWeights;
    }

    public void setMaximumDistanceAvoidAreas(Double value) {
        maximumDistanceAvoidAreas = value;
    }

    public Double getMaximumDistanceAvoidAreas() {
        return maximumDistanceAvoidAreas;
    }

    public Double getMaximumDistanceAlternativeRoutes() {
        return maximumDistanceAlternativeRoutes;
    }

    public void setMaximumDistanceAlternativeRoutes(Double maximumDistanceAlternativeRoutes) {
        this.maximumDistanceAlternativeRoutes = maximumDistanceAlternativeRoutes;
    }

    public Double getMaximumDistanceRoundTripRoutes() {
        return maximumDistanceRoundTripRoutes;
    }

    public void setMaximumDistanceRoundTripRoutes(Double maximumDistanceRoundTripRoutes) {
        this.maximumDistanceRoundTripRoutes = maximumDistanceRoundTripRoutes;
    }

    public void setMaximumWayPoints(Integer value) {
        maximumWayPoints = value;
    }

    public Integer getMaximumWayPoints() {
        return maximumWayPoints;
    }

    public void setEncoderFlagsSize(Integer value) {
        encoderFlagsSize = value;
    }

    public Integer getEncoderFlagsSize() {
        return encoderFlagsSize;
    }

    public void setEncoderOptions(String value) {
        encoderOptions = value;
        turnCostEnabled = hasTurnCosts(encoderOptions);
    }

    public String getEncoderOptions() {
        return encoderOptions;
    }

    public void setElevationProvider(String value) {
        elevationProvider = value;
    }

    public String getElevationProvider() {
        return elevationProvider;
    }

    public void setElevationCachePath(String value) {
        if (StringUtils.isNotBlank(value))
            elevationCachePath = Paths.get(value).toAbsolutePath().toString();
        else elevationCachePath = value;
    }

    public String getElevationCachePath() {
        return elevationCachePath;
    }

    public void setElevationDataAccess(String value) {
        elevationDataAccess = value;
    }

    public String getElevationDataAccess() {
        return elevationDataAccess;
    }

    public void setElevationCacheClear(Boolean value) {
        elevationCacheClear = value;
    }

    public boolean getElevationCacheClear() {
        return elevationCacheClear;
    }

    public boolean getElevationSmoothing() {
        return elevationSmoothing;
    }

    public void setElevationSmoothing(boolean elevationSmoothing) {
        this.elevationSmoothing = elevationSmoothing;
    }

    public boolean getInterpolateBridgesAndTunnels() {
        return interpolateBridgesAndTunnels;
    }

    public void setInterpolateBridgesAndTunnels(boolean interpolateBridgesAndTunnels) {
        this.interpolateBridgesAndTunnels = interpolateBridgesAndTunnels;
    }

    public Config getIsochronePreparationOpts() {
        return isochronePreparationOpts;
    }

    public void setIsochronePreparationOpts(Config isochronePreparationOpts) {
        this.isochronePreparationOpts = isochronePreparationOpts;
    }

    public Config getPreparationOpts() {
        return preparationOpts;
    }

    public void setPreparationOpts(Config preparationOpts) {
        this.preparationOpts = preparationOpts;
    }

    public Config getExecutionOpts() {
        return executionOpts;
    }

    public void setExecutionOpts(Config executionOpts) {
        this.executionOpts = executionOpts;
    }

    public boolean getOptimize() {
        return optimize;
    }

    public void setOptimize(boolean optimize) {
        this.optimize = optimize;
    }

    public boolean hasMaximumSnappingRadius() {
        return hasMaximumSnappingRadius;
    }

    public int getMaximumSnappingRadius() {
        return maximumSnappingRadius;
    }

    public void setMaximumSnappingRadius(int maximumSnappingRadius) {
        this.maximumSnappingRadius = maximumSnappingRadius;
        this.hasMaximumSnappingRadius = true;
    }

    public int getLocationIndexResolution() {
        return locationIndexResolution;
    }

    public void setLocationIndexResolution(int locationIndexResolution) {
        this.locationIndexResolution = locationIndexResolution;
    }

    public int getLocationIndexSearchIterations() {
        return locationIndexSearchIterations;
    }

    public void setLocationIndexSearchIterations(int locationIndexSearchIterations) {
        this.locationIndexSearchIterations = locationIndexSearchIterations;
    }

    public void setMaximumSpeedLowerBound(double maximumSpeedLowerBound) {
        this.maximumSpeedLowerBound = maximumSpeedLowerBound;
    }

    public double getMaximumSpeedLowerBound() {
        return maximumSpeedLowerBound;
    }

    public boolean isTurnCostEnabled() {
        return turnCostEnabled;
    }

    public void setTurnCostEnabled(boolean turnCostEnabled) {
        this.turnCostEnabled = turnCostEnabled;
    }

    public void setEnforceTurnCosts(boolean enforceTurnCosts) {
        this.enforceTurnCosts = enforceTurnCosts;
    }

    public boolean isEnforceTurnCosts() {
        return enforceTurnCosts;
    }

    public void setGtfsFile(String gtfsFile) {
        this.gtfsFile = gtfsFile;
    }

    public String getGtfsFile() {
        return this.gtfsFile;
    }

    public int getMaximumVisitedNodesPT() {
        return maximumVisitedNodesPT;
    }

    public void setMaximumVisitedNodesPT(int maximumVisitedNodesPT) {
        this.maximumVisitedNodesPT = maximumVisitedNodesPT;
    }

    public String getGraphDataAccess() {
        return graphDataAccess;
    }

    public void setGraphDataAccess(String graphDataAccess) {
        this.graphDataAccess = graphDataAccess;
    }

    @Override
    public String toString() {
        return "RouteProfileConfiguration{" +
                "name='" + name + '\'' +
                ", enabled=" + enabled +
                ", profiles='" + profiles + '\'' +
                ", graphPath='" + graphPath + '\'' +
                ", extStorages=" + extStorages +
                ", graphBuilders=" + graphBuilders +
                ", maximumDistance=" + maximumDistance +
                ", maximumDistanceDynamicWeights=" + maximumDistanceDynamicWeights +
                ", maximumDistanceAvoidAreas=" + maximumDistanceAvoidAreas +
                ", maximumDistanceAlternativeRoutes=" + maximumDistanceAlternativeRoutes +
                ", maximumDistanceRoundTripRoutes=" + maximumDistanceRoundTripRoutes +
                ", maximumWayPoints=" + maximumWayPoints +
                ", instructions=" + instructions +
                ", optimize=" + optimize +
                ", encoderFlagsSize=" + encoderFlagsSize +
                ", encoderOptions='" + encoderOptions + '\'' +
                ", gtfsFile='" + gtfsFile + '\'' +
                ", isochronePreparationOpts=" + isochronePreparationOpts +
                ", preparationOpts=" + preparationOpts +
                ", executionOpts=" + executionOpts +
                ", elevationProvider='" + elevationProvider + '\'' +
                ", elevationCachePath='" + elevationCachePath + '\'' +
                ", elevationDataAccess='" + elevationDataAccess + '\'' +
                ", elevationCacheClear=" + elevationCacheClear +
                ", elevationSmoothing=" + elevationSmoothing +
                ", interpolateBridgesAndTunnels=" + interpolateBridgesAndTunnels +
                ", maximumSnappingRadius=" + maximumSnappingRadius +
                ", extent=" + extent +
                ", hasMaximumSnappingRadius=" + hasMaximumSnappingRadius +
                ", locationIndexResolution=" + locationIndexResolution +
                ", locationIndexSearchIterations=" + locationIndexSearchIterations +
                ", maximumSpeedLowerBound=" + maximumSpeedLowerBound +
                ", trafficExpirationMin=" + trafficExpirationMin +
                ", maximumVisitedNodesPT=" + maximumVisitedNodesPT +
                ", turnCostEnabled=" + turnCostEnabled +
                ", enforceTurnCosts=" + enforceTurnCosts +
                ", graphDataAccess='" + graphDataAccess + '\'' +
                '}';
    }
}