From 476d1adf5b00dc6a3e43502ac6541b71b71d02c0 Mon Sep 17 00:00:00 2001 From: Julian Psotta Date: Wed, 31 Jul 2024 00:25:34 +0200 Subject: [PATCH] fix: Rework raw user settings hierarchy These changes allow that all settings are null in the beginning and only the raw settings from the users are initialized. This allows to later differentiate what settings have been given by the user and which not. What is missing is the remaining logic: Set the default_config as the next hierarchy and after all the remaining defaults, that are necessary. --- .../ors/config/ElevationProperties.java | 18 +- .../heigit/ors/config/EngineProperties.java | 58 +-- .../config/profile/PreparationProperties.java | 9 +- .../ors/config/profile/ProfileProperties.java | 78 +++- .../defaults/DefaultElevationProperties.java | 23 ++ .../DefaultEncoderOptionsProperties.java | 73 ++-- .../defaults/DefaultProfileProperties.java | 52 +-- .../DefaultProfilePropertiesBikeElectric.java | 9 +- .../DefaultProfilePropertiesBikeMountain.java | 9 +- .../DefaultProfilePropertiesBikeRegular.java | 9 +- .../DefaultProfilePropertiesBikeRoad.java | 9 +- .../defaults/DefaultProfilePropertiesCar.java | 14 +- .../defaults/DefaultProfilePropertiesHgv.java | 9 +- .../DefaultProfilePropertiesHiking.java | 9 +- ...faultProfilePropertiesPublicTransport.java | 19 +- .../DefaultProfilePropertiesWalking.java | 9 +- .../DefaultProfilePropertiesWheelchair.java | 13 +- .../profile/defaults/DefaultProfiles.java | 28 ++ .../ors/config/EnginePropertiesTest.java | 373 +++++++----------- 19 files changed, 460 insertions(+), 361 deletions(-) create mode 100644 ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultElevationProperties.java create mode 100644 ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfiles.java diff --git a/ors-engine/src/main/java/org/heigit/ors/config/ElevationProperties.java b/ors-engine/src/main/java/org/heigit/ors/config/ElevationProperties.java index fdbb18a9d1..352d7c9142 100644 --- a/ors-engine/src/main/java/org/heigit/ors/config/ElevationProperties.java +++ b/ors-engine/src/main/java/org/heigit/ors/config/ElevationProperties.java @@ -11,20 +11,24 @@ import org.heigit.ors.config.utils.PathSerializer; import java.nio.file.Path; -import java.nio.file.Paths; @Getter -@Setter(AccessLevel.PACKAGE) +@Setter(AccessLevel.PROTECTED) public class ElevationProperties { - private boolean preprocessed = false; + @Getter + private Boolean preprocessed; @JsonProperty("data_access") - private DataAccessEnum dataAccess = DataAccessEnum.MMAP; + private DataAccessEnum dataAccess; @JsonProperty("cache_clear") - private boolean cacheClear = false; + private Boolean cacheClear; @JsonProperty("provider") - private String provider = "multi"; + private String provider; @JsonProperty("cache_path") @JsonDeserialize(using = PathDeserializer.class) @JsonSerialize(using = PathSerializer.class) - private Path cachePath = Paths.get("./elevation_cache"); + private Path cachePath; + + public Boolean isPreprocessed() { + return preprocessed; + } } \ No newline at end of file diff --git a/ors-engine/src/main/java/org/heigit/ors/config/EngineProperties.java b/ors-engine/src/main/java/org/heigit/ors/config/EngineProperties.java index c88d12f601..2104115e05 100644 --- a/ors-engine/src/main/java/org/heigit/ors/config/EngineProperties.java +++ b/ors-engine/src/main/java/org/heigit/ors/config/EngineProperties.java @@ -9,7 +9,9 @@ import lombok.Setter; import org.heigit.ors.common.DataAccessEnum; import org.heigit.ors.config.profile.ProfileProperties; -import org.heigit.ors.config.profile.defaults.*; +import org.heigit.ors.config.profile.defaults.DefaultElevationProperties; +import org.heigit.ors.config.profile.defaults.DefaultProfileProperties; +import org.heigit.ors.config.profile.defaults.DefaultProfiles; import org.heigit.ors.config.utils.PathDeserializer; import org.heigit.ors.config.utils.PathSerializer; import org.heigit.ors.routing.configuration.RouteProfileConfiguration; @@ -22,46 +24,54 @@ import java.util.Map; @Getter -@Setter(AccessLevel.PACKAGE) +@Setter(AccessLevel.PROTECTED) public class EngineProperties { - private static final Map DEFAULT_PROFILES = new LinkedHashMap<>(); - static { - DEFAULT_PROFILES.put("car", new DefaultProfilePropertiesCar()); - DEFAULT_PROFILES.put("hgv", new DefaultProfilePropertiesHgv()); - DEFAULT_PROFILES.put("bike-regular", new DefaultProfilePropertiesBikeRegular()); - DEFAULT_PROFILES.put("bike-electric", new DefaultProfilePropertiesBikeElectric()); - DEFAULT_PROFILES.put("bike-mountain", new DefaultProfilePropertiesBikeMountain()); - DEFAULT_PROFILES.put("bike-road", new DefaultProfilePropertiesBikeRoad()); - DEFAULT_PROFILES.put("walking", new DefaultProfilePropertiesWalking()); - DEFAULT_PROFILES.put("hiking", new DefaultProfilePropertiesHiking()); - DEFAULT_PROFILES.put("wheelchair", new DefaultProfilePropertiesWheelchair()); - DEFAULT_PROFILES.put("public-transport", new DefaultProfilePropertiesPublicTransport()); - } + @JsonIgnore + private Map default_profiles = new LinkedHashMap<>(); @JsonProperty("source_file") @JsonDeserialize(using = PathDeserializer.class) @JsonSerialize(using = PathSerializer.class) - private Path sourceFile = Paths.get(""); + private Path sourceFile; @JsonProperty("init_threads") - private Integer initThreads = 1; + private Integer initThreads; @JsonProperty("preparation_mode") - private Boolean preparationMode = false; + private Boolean preparationMode; @JsonProperty("config_output_mode") - private Boolean configOutputMode = false; + private Boolean configOutputMode; @JsonProperty("graphs_root_path") @JsonDeserialize(using = PathDeserializer.class) @JsonSerialize(using = PathSerializer.class) - private Path graphsRootPath = Paths.get("./graphs"); + private Path graphsRootPath; @JsonProperty("graphs_data_access") - private DataAccessEnum graphsDataAccess = DataAccessEnum.RAM_STORE; + private DataAccessEnum graphsDataAccess; @JsonProperty("elevation") - private ElevationProperties elevation = new ElevationProperties(); + private ElevationProperties elevation; @JsonProperty("profile_default") - private ProfileProperties profileDefault = new DefaultProfileProperties(); + private ProfileProperties profileDefault; @JsonProperty("profiles") - private Map profiles = DEFAULT_PROFILES; + private Map profiles; + + public EngineProperties() { + this(false); + } + + public EngineProperties(Boolean setDefaults) { + setProfiles(new LinkedHashMap<>()); + setProfileDefault(new DefaultProfileProperties(setDefaults)); + setDefault_profiles(new DefaultProfiles(setDefaults).getProfiles()); + setElevation(new DefaultElevationProperties(setDefaults)); + if (setDefaults) { + setSourceFile(Paths.get("")); + setInitThreads(1); + setPreparationMode(false); + setConfigOutputMode(false); + setGraphsRootPath(Paths.get("./graphs")); + setGraphsDataAccess(DataAccessEnum.RAM_STORE); + } + } @JsonIgnore public RouteProfileConfiguration[] getConvertedProfiles() { diff --git a/ors-engine/src/main/java/org/heigit/ors/config/profile/PreparationProperties.java b/ors-engine/src/main/java/org/heigit/ors/config/profile/PreparationProperties.java index 672f9cae32..a7ad73fb39 100644 --- a/ors-engine/src/main/java/org/heigit/ors/config/profile/PreparationProperties.java +++ b/ors-engine/src/main/java/org/heigit/ors/config/profile/PreparationProperties.java @@ -3,7 +3,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AccessLevel; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; @@ -53,7 +52,7 @@ public MethodsProperties(Boolean setDefaults) { @Setter @JsonInclude(JsonInclude.Include.NON_NULL) public static class CHProperties { - @Getter(AccessLevel.NONE) + @JsonProperty("enabled") private Boolean enabled; private Integer threads; private String weightings; @@ -68,7 +67,7 @@ public Boolean isEnabled() { @Setter @JsonInclude(JsonInclude.Include.NON_NULL) public static class LMProperties { - @Getter(AccessLevel.NONE) + @JsonProperty("enabled") private Boolean enabled; private Integer threads; private String weightings; @@ -84,7 +83,7 @@ public Boolean isEnabled() { @Setter @JsonInclude(JsonInclude.Include.NON_NULL) public static class CoreProperties { - @Getter(AccessLevel.NONE) + @JsonProperty("enabled") private Boolean enabled; private Integer threads; private String weightings; @@ -101,7 +100,7 @@ public Boolean isEnabled() { @Setter @JsonInclude(JsonInclude.Include.NON_NULL) public static class FastIsochroneProperties { - @Getter(AccessLevel.NONE) + @JsonProperty("enabled") private Boolean enabled; private Integer threads; private String weightings; diff --git a/ors-engine/src/main/java/org/heigit/ors/config/profile/ProfileProperties.java b/ors-engine/src/main/java/org/heigit/ors/config/profile/ProfileProperties.java index 2c537f9f9a..4b81e94cda 100644 --- a/ors-engine/src/main/java/org/heigit/ors/config/profile/ProfileProperties.java +++ b/ors-engine/src/main/java/org/heigit/ors/config/profile/ProfileProperties.java @@ -99,49 +99,91 @@ public abstract class ProfileProperties { private Map extStorages = new HashMap<>(); protected ProfileProperties() { - encoderOptions = new DefaultEncoderOptionsProperties(); - preparation = new PreparationProperties(); - execution = new ExecutionProperties(); + this(false); + } + + protected ProfileProperties(Boolean setDefaults) { + if (setDefaults) { + encoderOptions = new DefaultEncoderOptionsProperties(); + preparation = new DefaultPreparationProperties(); + execution = new DefaultExecutionProperties(); + } else { + encoderOptions = new EncoderOptionsProperties(); + preparation = new PreparationProperties(); + execution = new ExecutionProperties(); + } } @JsonSetter("encoder_options") public void setEncoderOptions(EncoderOptionsProperties encoderOptions) { - if (encoderOptions != null) { + // TODO if null apply default values as is + // TODO after deserialization apply the profile_default values -> maybe move setter to getter logic + // TODO add getgraphpath override to the profile property classes + this.encoderOptions = encoderOptions; + } + + + public EncoderOptionsProperties getEncoderOptions(Boolean mergeWithDefault) { + if (mergeWithDefault) { DefaultEncoderOptionsProperties defaultEncoderOptionsProperties = new DefaultEncoderOptionsProperties(this.getEncoderName()); - encoderOptions = (EncoderOptionsProperties) PropertyUtils.deepCopyObjectsProperties(defaultEncoderOptionsProperties, encoderOptions, false, false); + if (this.encoderOptions == null) { + return defaultEncoderOptionsProperties; + } + EncoderOptionsProperties test = (EncoderOptionsProperties) PropertyUtils.deepCopyObjectsProperties(defaultEncoderOptionsProperties, this.encoderOptions, false, false); + return test; } - this.encoderOptions = encoderOptions; + return this.encoderOptions; } @JsonSetter("preparation") public void setPreparation(PreparationProperties preparation) { - if (preparation != null) { + this.preparation = preparation; + } + + public PreparationProperties getPreparation(Boolean mergeWithDefault) { + if (mergeWithDefault) { DefaultPreparationProperties defaultPreparationProperties = new DefaultPreparationProperties(this.getEncoderName()); - preparation = (PreparationProperties) PropertyUtils.deepCopyObjectsProperties(defaultPreparationProperties, preparation, false, false); + if (this.preparation == null) { + return defaultPreparationProperties; + } + PreparationProperties test = (PreparationProperties) PropertyUtils.deepCopyObjectsProperties(defaultPreparationProperties, this.preparation, false, false); + return test; } - this.preparation = preparation; + return this.preparation; } @JsonSetter("execution") public void setExecution(ExecutionProperties execution) { - if (execution != null) { + this.execution = execution; + } + + public ExecutionProperties getExecution(Boolean mergeWithDefault) { + if (mergeWithDefault) { DefaultExecutionProperties defaultExecutionProperties = new DefaultExecutionProperties(this.getEncoderName()); - execution = (ExecutionProperties) PropertyUtils.deepCopyObjectsProperties(defaultExecutionProperties, execution, false, false); + if (this.execution == null) { + return defaultExecutionProperties; + } + ExecutionProperties test = (ExecutionProperties) PropertyUtils.deepCopyObjectsProperties(defaultExecutionProperties, this.execution, false, false); + return test; } - this.execution = execution; + return this.execution; } @JsonSetter("ext_storages") public void setExtStorages(Map extStorages) { - if (extStorages == null) { - this.extStorages = new HashMap<>(); - } else { + this.extStorages = extStorages; + } + + public Map getExtStorages(Boolean mergeWithDefault) { + if (mergeWithDefault) { DefaultExtendedStoragesProperties defaultExtendedStoragesProperties = new DefaultExtendedStoragesProperties(this.getEncoderName()); - extStorages = PropertyUtils.deepCopyMapsProperties(defaultExtendedStoragesProperties.getExtStorages(), extStorages, false, false, false); - if (extStorages != null) { - this.extStorages = extStorages; + if (this.extStorages == null) { + return defaultExtendedStoragesProperties.getExtStorages(); } + Map test = PropertyUtils.deepCopyMapsProperties(defaultExtendedStoragesProperties.getExtStorages(), this.extStorages, false, false, false); + return test; } + return this.extStorages; } @JsonIgnore diff --git a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultElevationProperties.java b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultElevationProperties.java new file mode 100644 index 0000000000..af0509b0ed --- /dev/null +++ b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultElevationProperties.java @@ -0,0 +1,23 @@ +package org.heigit.ors.config.profile.defaults; + +import org.heigit.ors.common.DataAccessEnum; +import org.heigit.ors.config.ElevationProperties; + +import java.nio.file.Paths; + +public class DefaultElevationProperties extends ElevationProperties { + + public DefaultElevationProperties() { + this(false); + } + + public DefaultElevationProperties(Boolean setDefaults) { + if (setDefaults) { + setPreprocessed(false); + setDataAccess(DataAccessEnum.MMAP); + setCacheClear(false); + setProvider("multi"); + setCachePath(Paths.get("./elevation_cache")); + } + } +} diff --git a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultEncoderOptionsProperties.java b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultEncoderOptionsProperties.java index 7a78d688dc..0b963a0ceb 100644 --- a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultEncoderOptionsProperties.java +++ b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultEncoderOptionsProperties.java @@ -5,47 +5,52 @@ import org.heigit.ors.config.profile.EncoderOptionsProperties; public class DefaultEncoderOptionsProperties extends EncoderOptionsProperties { - public DefaultEncoderOptionsProperties() { - setBlockFords(false); - setTurnCosts(true); - setConsiderElevation(false); - setUseAcceleration(false); - setConditionalAccess(false); // Default from EncodingManager.java - setMaximumGradeLevel(null); // TODO find default - setPreferredSpeedFactor(null); // TODO find default - setProblematicSpeedFactor(null); // TODO find default - setConditionalSpeed(false); // TODO find default + public DefaultEncoderOptionsProperties() { + this(false, null); } - public DefaultEncoderOptionsProperties(EncoderNameEnum encoderName) { - this(); - if (encoderName == null) { - encoderName = EncoderNameEnum.UNKNOWN; + public DefaultEncoderOptionsProperties(Boolean setDefaults, EncoderNameEnum encoderName) { + this(encoderName); + if (setDefaults) { + setBlockFords(false); + setTurnCosts(true); + setConsiderElevation(false); + setUseAcceleration(false); + setConditionalAccess(false); // Default from EncodingManager.java + setMaximumGradeLevel(null); // TODO find default + setPreferredSpeedFactor(null); // TODO find default + setProblematicSpeedFactor(null); // TODO find default + setConditionalSpeed(false); // TODO find default } + } - switch (encoderName) { - case DRIVING_CAR -> { - // Just set the ones from below - setTurnCosts(true); - setBlockFords(false); - setUseAcceleration(true); - setConsiderElevation(false); - } - case DRIVING_HGV -> { - setTurnCosts(true); - setBlockFords(false); - setUseAcceleration(true); - } - case CYCLING_REGULAR, CYCLING_MOUNTAIN, CYCLING_ROAD, CYCLING_ELECTRIC -> { - setConsiderElevation(true); - setTurnCosts(true); - setBlockFords(false); - } - case FOOT_HIKING, FOOT_WALKING, WHEELCHAIR, PUBLIC_TRANSPORT -> // Just set the ones from below + public DefaultEncoderOptionsProperties(EncoderNameEnum encoderName) { + if (encoderName != null) { + switch (encoderName) { + case DRIVING_CAR -> { + // Just set the ones from below + setTurnCosts(true); + setBlockFords(false); + setUseAcceleration(true); + setConsiderElevation(false); + } + case DRIVING_HGV -> { + setTurnCosts(true); setBlockFords(false); - default -> { + setUseAcceleration(true); + } + case CYCLING_REGULAR, CYCLING_MOUNTAIN, CYCLING_ROAD, CYCLING_ELECTRIC -> { + setConsiderElevation(true); + setTurnCosts(true); + setBlockFords(false); + } + case FOOT_HIKING, FOOT_WALKING, WHEELCHAIR, PUBLIC_TRANSPORT -> // Just set the ones from below + setBlockFords(false); + default -> { + } } } + } } \ No newline at end of file diff --git a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfileProperties.java b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfileProperties.java index ca8b62fd68..e4b533ee61 100644 --- a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfileProperties.java +++ b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfileProperties.java @@ -4,28 +4,36 @@ import org.heigit.ors.config.profile.ProfileProperties; public class DefaultProfileProperties extends ProfileProperties { + public DefaultProfileProperties() { - super(); - this.setEncoderName(EncoderNameEnum.UNKNOWN); - setEnabled(false); - setElevation(true); - setElevationSmoothing(true); - setEncoderFlagsSize(8); - setInstructions(true); - setOptimize(false); - setTraffic(false); - setInterpolateBridgesAndTunnels(true); - setForceTurnCosts(false); - setLocationIndexResolution(500); - setLocationIndexSearchIterations(4); - setMaximumDistance(100000d); - setMaximumDistanceDynamicWeights(100000d); - setMaximumDistanceAvoidAreas(100000d); - setMaximumDistanceAlternativeRoutes(100000d); - setMaximumDistanceRoundTripRoutes(100000d); - setMaximumSpeedLowerBound(80d); - setMaximumWayPoints(50); - setMaximumSnappingRadius(400); - setMaximumVisitedNodes(1000000); + this(false); + } + + public DefaultProfileProperties(Boolean setDefaults) { + super(setDefaults); + if (setDefaults) { + this.setEncoderName(EncoderNameEnum.UNKNOWN); + setEncoderOptions(new DefaultEncoderOptionsProperties()); + setEnabled(false); + setElevation(true); + setElevationSmoothing(true); + setEncoderFlagsSize(8); + setInstructions(true); + setOptimize(false); + setTraffic(false); + setInterpolateBridgesAndTunnels(true); + setForceTurnCosts(false); + setLocationIndexResolution(500); + setLocationIndexSearchIterations(4); + setMaximumDistance(100000d); + setMaximumDistanceDynamicWeights(100000d); + setMaximumDistanceAvoidAreas(100000d); + setMaximumDistanceAlternativeRoutes(100000d); + setMaximumDistanceRoundTripRoutes(100000d); + setMaximumSpeedLowerBound(80d); + setMaximumWayPoints(50); + setMaximumSnappingRadius(400); + setMaximumVisitedNodes(1000000); + } } } diff --git a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesBikeElectric.java b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesBikeElectric.java index 9cd95a7c2e..de1f4ff401 100644 --- a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesBikeElectric.java +++ b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesBikeElectric.java @@ -1,10 +1,15 @@ package org.heigit.ors.config.profile.defaults; import org.heigit.ors.common.EncoderNameEnum; +import org.heigit.ors.config.profile.ProfileProperties; -public class DefaultProfilePropertiesBikeElectric extends DefaultProfileProperties { +public class DefaultProfilePropertiesBikeElectric extends ProfileProperties { public DefaultProfilePropertiesBikeElectric() { - super(); + this(false); + } + + public DefaultProfilePropertiesBikeElectric(Boolean setDefaults) { + super(setDefaults); this.setEncoderName(EncoderNameEnum.CYCLING_ELECTRIC); } } diff --git a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesBikeMountain.java b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesBikeMountain.java index a7f8cd6368..c80d3356d5 100644 --- a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesBikeMountain.java +++ b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesBikeMountain.java @@ -1,10 +1,15 @@ package org.heigit.ors.config.profile.defaults; import org.heigit.ors.common.EncoderNameEnum; +import org.heigit.ors.config.profile.ProfileProperties; -public class DefaultProfilePropertiesBikeMountain extends DefaultProfileProperties { +public class DefaultProfilePropertiesBikeMountain extends ProfileProperties { public DefaultProfilePropertiesBikeMountain() { - super(); + this(false); + } + + public DefaultProfilePropertiesBikeMountain(Boolean setDefaults) { + super(setDefaults); this.setEncoderName(EncoderNameEnum.CYCLING_MOUNTAIN); } } diff --git a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesBikeRegular.java b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesBikeRegular.java index ead272c244..675ee61653 100644 --- a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesBikeRegular.java +++ b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesBikeRegular.java @@ -1,10 +1,15 @@ package org.heigit.ors.config.profile.defaults; import org.heigit.ors.common.EncoderNameEnum; +import org.heigit.ors.config.profile.ProfileProperties; -public class DefaultProfilePropertiesBikeRegular extends DefaultProfileProperties { +public class DefaultProfilePropertiesBikeRegular extends ProfileProperties { public DefaultProfilePropertiesBikeRegular() { - super(); + this(false); + } + + public DefaultProfilePropertiesBikeRegular(Boolean setDefaults) { + super(setDefaults); this.setEncoderName(EncoderNameEnum.CYCLING_REGULAR); } } diff --git a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesBikeRoad.java b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesBikeRoad.java index a9150f699a..49da882649 100644 --- a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesBikeRoad.java +++ b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesBikeRoad.java @@ -1,10 +1,15 @@ package org.heigit.ors.config.profile.defaults; import org.heigit.ors.common.EncoderNameEnum; +import org.heigit.ors.config.profile.ProfileProperties; -public class DefaultProfilePropertiesBikeRoad extends DefaultProfileProperties { +public class DefaultProfilePropertiesBikeRoad extends ProfileProperties { public DefaultProfilePropertiesBikeRoad() { - super(); + this(false); + } + + public DefaultProfilePropertiesBikeRoad(Boolean setDefaults) { + super(setDefaults); this.setEncoderName(EncoderNameEnum.CYCLING_ROAD); } } diff --git a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesCar.java b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesCar.java index cb39ab9488..cccdc8fa5a 100644 --- a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesCar.java +++ b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesCar.java @@ -1,11 +1,21 @@ package org.heigit.ors.config.profile.defaults; import org.heigit.ors.common.EncoderNameEnum; +import org.heigit.ors.config.profile.ProfileProperties; -public class DefaultProfilePropertiesCar extends DefaultProfileProperties { +public class DefaultProfilePropertiesCar extends ProfileProperties { public DefaultProfilePropertiesCar() { - super(); + this(false); + } + + public DefaultProfilePropertiesCar(Boolean setDefaults) { + super(setDefaults); this.setEncoderName(EncoderNameEnum.DRIVING_CAR); + if (setDefaults) { + // Set the default extended storage properties + DefaultExtendedStoragesProperties defaultExtendedStoragesProperties = new DefaultExtendedStoragesProperties(this.getEncoderName()); + setExtStorages(defaultExtendedStoragesProperties.getExtStorages()); + } } } diff --git a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesHgv.java b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesHgv.java index 46b7bc453f..e4a4779508 100644 --- a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesHgv.java +++ b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesHgv.java @@ -1,10 +1,15 @@ package org.heigit.ors.config.profile.defaults; import org.heigit.ors.common.EncoderNameEnum; +import org.heigit.ors.config.profile.ProfileProperties; -public class DefaultProfilePropertiesHgv extends DefaultProfileProperties { +public class DefaultProfilePropertiesHgv extends ProfileProperties { public DefaultProfilePropertiesHgv() { - super(); + this(false); + } + + public DefaultProfilePropertiesHgv(Boolean setDefaults) { + super(setDefaults); this.setEncoderName(EncoderNameEnum.DRIVING_HGV); } } diff --git a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesHiking.java b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesHiking.java index e890b59c7e..03165e6e4f 100644 --- a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesHiking.java +++ b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesHiking.java @@ -1,10 +1,15 @@ package org.heigit.ors.config.profile.defaults; import org.heigit.ors.common.EncoderNameEnum; +import org.heigit.ors.config.profile.ProfileProperties; -public class DefaultProfilePropertiesHiking extends DefaultProfileProperties { +public class DefaultProfilePropertiesHiking extends ProfileProperties { public DefaultProfilePropertiesHiking() { - super(); + this(false); + } + + public DefaultProfilePropertiesHiking(Boolean setDefaults) { + super(setDefaults); this.setEncoderName(EncoderNameEnum.FOOT_HIKING); } } diff --git a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesPublicTransport.java b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesPublicTransport.java index 2edaf9b121..030ae6130a 100644 --- a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesPublicTransport.java +++ b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesPublicTransport.java @@ -2,16 +2,25 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import org.heigit.ors.common.EncoderNameEnum; +import org.heigit.ors.config.profile.ProfileProperties; import java.nio.file.Path; @JsonIgnoreProperties({"ext_storages"}) -public class DefaultProfilePropertiesPublicTransport extends DefaultProfileProperties { +public class DefaultProfilePropertiesPublicTransport extends ProfileProperties { public DefaultProfilePropertiesPublicTransport() { - super(); + this(false); + } + + public DefaultProfilePropertiesPublicTransport(Boolean setDefaults) { + super(setDefaults); this.setEncoderName(EncoderNameEnum.PUBLIC_TRANSPORT); - setElevation(true); - setMaximumVisitedNodes(1000000); - setGtfsFile(Path.of("")); + + if (setDefaults) { + this.setEncoderName(EncoderNameEnum.PUBLIC_TRANSPORT); + setElevation(true); + setMaximumVisitedNodes(1000000); + setGtfsFile(Path.of("")); + } } } diff --git a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesWalking.java b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesWalking.java index 441fa3a2cd..a48a66eec2 100644 --- a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesWalking.java +++ b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesWalking.java @@ -1,10 +1,15 @@ package org.heigit.ors.config.profile.defaults; import org.heigit.ors.common.EncoderNameEnum; +import org.heigit.ors.config.profile.ProfileProperties; -public class DefaultProfilePropertiesWalking extends DefaultProfileProperties { +public class DefaultProfilePropertiesWalking extends ProfileProperties { public DefaultProfilePropertiesWalking() { - super(); + this(false); + } + + public DefaultProfilePropertiesWalking(Boolean setDefaults) { + super(setDefaults); this.setEncoderName(EncoderNameEnum.FOOT_WALKING); } } diff --git a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesWheelchair.java b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesWheelchair.java index a3aaa5e8c7..9f9793454e 100644 --- a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesWheelchair.java +++ b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfilePropertiesWheelchair.java @@ -1,11 +1,18 @@ package org.heigit.ors.config.profile.defaults; import org.heigit.ors.common.EncoderNameEnum; +import org.heigit.ors.config.profile.ProfileProperties; -public class DefaultProfilePropertiesWheelchair extends DefaultProfileProperties { +public class DefaultProfilePropertiesWheelchair extends ProfileProperties { public DefaultProfilePropertiesWheelchair() { - super(); + this(false); + } + + public DefaultProfilePropertiesWheelchair(Boolean setDefaults) { + super(setDefaults); this.setEncoderName(EncoderNameEnum.WHEELCHAIR); - setMaximumSnappingRadius(50); + + if (setDefaults) setMaximumSnappingRadius(50); + } } diff --git a/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfiles.java b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfiles.java new file mode 100644 index 0000000000..0fee2d03b4 --- /dev/null +++ b/ors-engine/src/main/java/org/heigit/ors/config/profile/defaults/DefaultProfiles.java @@ -0,0 +1,28 @@ +package org.heigit.ors.config.profile.defaults; + +import lombok.Getter; +import org.heigit.ors.config.profile.ProfileProperties; + +import java.util.HashMap; +import java.util.Map; + +@Getter +public class DefaultProfiles { + Map profiles = new HashMap<>(); + + public DefaultProfiles(Boolean setDefaults) { + if (setDefaults) { + profiles.put("driving-car", new DefaultProfileProperties(true)); + profiles.put("driving-hgv", new DefaultProfileProperties(true)); + profiles.put("cycling-regular", new DefaultProfileProperties(true)); + profiles.put("cycling-mountain", new DefaultProfileProperties(true)); + profiles.put("cycling-road", new DefaultProfileProperties(true)); + profiles.put("cycling-electric", new DefaultProfileProperties(true)); + profiles.put("foot-walking", new DefaultProfileProperties(true)); + profiles.put("foot-hiking", new DefaultProfileProperties(true)); + profiles.put("wheelchair", new DefaultProfileProperties(true)); + profiles.put("public-transport", new DefaultProfileProperties(true)); + } + } + +} diff --git a/ors-engine/src/test/java/org/heigit/ors/config/EnginePropertiesTest.java b/ors-engine/src/test/java/org/heigit/ors/config/EnginePropertiesTest.java index a8cfe6c52d..ce40f5a812 100644 --- a/ors-engine/src/test/java/org/heigit/ors/config/EnginePropertiesTest.java +++ b/ors-engine/src/test/java/org/heigit/ors/config/EnginePropertiesTest.java @@ -4,17 +4,17 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.heigit.ors.common.DataAccessEnum; import org.heigit.ors.common.EncoderNameEnum; +import org.heigit.ors.config.profile.EncoderOptionsProperties; import org.heigit.ors.config.profile.ExecutionProperties; import org.heigit.ors.config.profile.PreparationProperties; import org.heigit.ors.config.profile.ProfileProperties; -import org.heigit.ors.config.profile.defaults.DefaultProfileProperties; -import org.heigit.ors.config.profile.storages.ExtendedStorage; -import org.heigit.ors.config.profile.storages.ExtendedStorageRoadAccessRestrictions; -import org.heigit.ors.config.profile.storages.ExtendedStorageWayCategory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.lang.reflect.Field; import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import static org.junit.jupiter.api.Assertions.*; @@ -22,75 +22,20 @@ class EnginePropertiesTest { private EngineProperties engineProperties; + private String testJson; @BeforeEach void setUp() { engineProperties = new EngineProperties(); + testJson = "{\n" + " \"graphs_data_access\": \"MMAP\",\n" + " \"elevation\": {},\n" + " \"profile_default\": {\n" + " \"preparation\": {\n" + " \"min_network_size\": 300,\n" + " \"methods\": {\n" + " \"lm\": {\n" + " \"enabled\": false,\n" + " \"threads\": 4,\n" + " \"weightings\": \"shortest\",\n" + " \"landmarks\": 2\n" + " }\n" + " }\n" + " },\n" + " \"execution\": {\n" + " \"methods\": {\n" + " \"lm\": {\n" + " \"active_landmarks\": 8\n" + " }\n" + " }\n" + " }\n" + " },\n" + " \"profiles\": {\n" + " \"car\": {\n" + " \"encoder_name\": \"driving-car\",\n" + " \"enabled\": true,\n" + " \"encoder_options\": {},\n" + " \"preparation\": {" + " \"methods\": {\n" + " \"lm\": {\n" + " \"enabled\": true,\n" + " \"threads\": 1\n" + " }\n" + " }\n" + " },\n" + " \"execution\": {\n" + " \"methods\": {" + " \"lm\": {" + " \"active_landmarks\": 2" + " }\n" + " }\n" + " },\n" + " \"ext_storages\": {}\n" + " }\n" + " }\n" + "}"; } @Test - void sourceFile_DefaultValue() { - assertEquals(Paths.get(""), engineProperties.getSourceFile()); - } - - @Test - void initThreads_DefaultValue() { - assertEquals(1, engineProperties.getInitThreads()); - } - - @Test - void preparationMode_DefaultValue() { - assertFalse(engineProperties.getPreparationMode()); - } - - @Test - void configOutputMode_DefaultValue() { - assertFalse(engineProperties.getConfigOutputMode()); - } - - @Test - void graphsRootPath_DefaultValue() { - assertEquals(Paths.get("./graphs"), engineProperties.getGraphsRootPath()); - } - - @Test - void graphsDataAccess_DefaultValue() { - assertEquals(DataAccessEnum.RAM_STORE, engineProperties.getGraphsDataAccess()); - } - - @Test - void elevation_DefaultValue() { - assertNotNull(engineProperties.getElevation()); - } - - @Test - void profileDefault_DefaultValue() { - assertNotNull(engineProperties.getProfileDefault()); - } - - @Test - void profiles_DefaultValue() { - Map profiles = engineProperties.getProfiles(); - assertNotNull(profiles); - assertEquals(10, profiles.size()); - assertTrue(profiles.containsKey("car")); - assertTrue(profiles.containsKey("hgv")); - assertTrue(profiles.containsKey("bike-regular")); - assertTrue(profiles.containsKey("bike-electric")); - assertTrue(profiles.containsKey("bike-mountain")); - assertTrue(profiles.containsKey("bike-road")); - assertTrue(profiles.containsKey("walking")); - assertTrue(profiles.containsKey("hiking")); - assertTrue(profiles.containsKey("wheelchair")); - assertTrue(profiles.containsKey("public-transport")); - } - - @Test - void testSerializeDefaultEngineProperties() throws JsonProcessingException { + void testSerializeEmptyDefaultEngineProperties() throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); String json = objectMapper.writeValueAsString(engineProperties); assertNotNull(json); - String expectedJson = "{\"source_file\":\"\",\"init_threads\":1,\"preparation_mode\":false,\"config_output_mode\":false,\"graphs_root_path\":\"./graphs\",\"graphs_data_access\":\"RAM_STORE\",\"elevation\":{\"preprocessed\":false,\"data_access\":\"MMAP\",\"cache_clear\":false,\"provider\":\"multi\",\"cache_path\":\"./elevation_cache\"},\"profile_default\":{\"enabled\":false,\"encoder_name\":\"unknown\",\"elevation\":true,\"elevation_smoothing\":true,\"encoder_flags_size\":8,\"instructions\":true,\"optimize\":false,\"traffic\":false,\"interpolate_bridges_and_tunnels\":true,\"force_turn_costs\":false,\"location_index_resolution\":500,\"location_index_search_iterations\":4,\"maximum_distance\":100000.0,\"maximum_distance_dynamic_weights\":100000.0,\"maximum_distance_avoid_areas\":100000.0,\"maximum_distance_alternative_routes\":100000.0,\"maximum_distance_round_trip_routes\":100000.0,\"maximum_speed_lower_bound\":80.0,\"maximum_way_points\":50,\"maximum_snapping_radius\":400,\"maximum_visited_nodes\":1000000,\"ext_storages\":{}},\"profiles\":{\"car\":{\"enabled\":false,\"encoder_name\":\"driving-car\",\"elevation\":true,\"elevation_smoothing\":true,\"encoder_flags_size\":8,\"instructions\":true,\"optimize\":false,\"traffic\":false,\"interpolate_bridges_and_tunnels\":true,\"force_turn_costs\":false,\"location_index_resolution\":500,\"location_index_search_iterations\":4,\"maximum_distance\":100000.0,\"maximum_distance_dynamic_weights\":100000.0,\"maximum_distance_avoid_areas\":100000.0,\"maximum_distance_alternative_routes\":100000.0,\"maximum_distance_round_trip_routes\":100000.0,\"maximum_speed_lower_bound\":80.0,\"maximum_way_points\":50,\"maximum_snapping_radius\":400,\"maximum_visited_nodes\":1000000,\"ext_storages\":{}},\"hgv\":{\"enabled\":false,\"encoder_name\":\"driving-hgv\",\"elevation\":true,\"elevation_smoothing\":true,\"encoder_flags_size\":8,\"instructions\":true,\"optimize\":false,\"traffic\":false,\"interpolate_bridges_and_tunnels\":true,\"force_turn_costs\":false,\"location_index_resolution\":500,\"location_index_search_iterations\":4,\"maximum_distance\":100000.0,\"maximum_distance_dynamic_weights\":100000.0,\"maximum_distance_avoid_areas\":100000.0,\"maximum_distance_alternative_routes\":100000.0,\"maximum_distance_round_trip_routes\":100000.0,\"maximum_speed_lower_bound\":80.0,\"maximum_way_points\":50,\"maximum_snapping_radius\":400,\"maximum_visited_nodes\":1000000,\"ext_storages\":{}},\"bike-regular\":{\"enabled\":false,\"encoder_name\":\"cycling-regular\",\"elevation\":true,\"elevation_smoothing\":true,\"encoder_flags_size\":8,\"instructions\":true,\"optimize\":false,\"traffic\":false,\"interpolate_bridges_and_tunnels\":true,\"force_turn_costs\":false,\"location_index_resolution\":500,\"location_index_search_iterations\":4,\"maximum_distance\":100000.0,\"maximum_distance_dynamic_weights\":100000.0,\"maximum_distance_avoid_areas\":100000.0,\"maximum_distance_alternative_routes\":100000.0,\"maximum_distance_round_trip_routes\":100000.0,\"maximum_speed_lower_bound\":80.0,\"maximum_way_points\":50,\"maximum_snapping_radius\":400,\"maximum_visited_nodes\":1000000,\"ext_storages\":{}},\"bike-electric\":{\"enabled\":false,\"encoder_name\":\"cycling-electric\",\"elevation\":true,\"elevation_smoothing\":true,\"encoder_flags_size\":8,\"instructions\":true,\"optimize\":false,\"traffic\":false,\"interpolate_bridges_and_tunnels\":true,\"force_turn_costs\":false,\"location_index_resolution\":500,\"location_index_search_iterations\":4,\"maximum_distance\":100000.0,\"maximum_distance_dynamic_weights\":100000.0,\"maximum_distance_avoid_areas\":100000.0,\"maximum_distance_alternative_routes\":100000.0,\"maximum_distance_round_trip_routes\":100000.0,\"maximum_speed_lower_bound\":80.0,\"maximum_way_points\":50,\"maximum_snapping_radius\":400,\"maximum_visited_nodes\":1000000,\"ext_storages\":{}},\"bike-mountain\":{\"enabled\":false,\"encoder_name\":\"cycling-mountain\",\"elevation\":true,\"elevation_smoothing\":true,\"encoder_flags_size\":8,\"instructions\":true,\"optimize\":false,\"traffic\":false,\"interpolate_bridges_and_tunnels\":true,\"force_turn_costs\":false,\"location_index_resolution\":500,\"location_index_search_iterations\":4,\"maximum_distance\":100000.0,\"maximum_distance_dynamic_weights\":100000.0,\"maximum_distance_avoid_areas\":100000.0,\"maximum_distance_alternative_routes\":100000.0,\"maximum_distance_round_trip_routes\":100000.0,\"maximum_speed_lower_bound\":80.0,\"maximum_way_points\":50,\"maximum_snapping_radius\":400,\"maximum_visited_nodes\":1000000,\"ext_storages\":{}},\"bike-road\":{\"enabled\":false,\"encoder_name\":\"cycling-road\",\"elevation\":true,\"elevation_smoothing\":true,\"encoder_flags_size\":8,\"instructions\":true,\"optimize\":false,\"traffic\":false,\"interpolate_bridges_and_tunnels\":true,\"force_turn_costs\":false,\"location_index_resolution\":500,\"location_index_search_iterations\":4,\"maximum_distance\":100000.0,\"maximum_distance_dynamic_weights\":100000.0,\"maximum_distance_avoid_areas\":100000.0,\"maximum_distance_alternative_routes\":100000.0,\"maximum_distance_round_trip_routes\":100000.0,\"maximum_speed_lower_bound\":80.0,\"maximum_way_points\":50,\"maximum_snapping_radius\":400,\"maximum_visited_nodes\":1000000,\"ext_storages\":{}},\"walking\":{\"enabled\":false,\"encoder_name\":\"foot-walking\",\"elevation\":true,\"elevation_smoothing\":true,\"encoder_flags_size\":8,\"instructions\":true,\"optimize\":false,\"traffic\":false,\"interpolate_bridges_and_tunnels\":true,\"force_turn_costs\":false,\"location_index_resolution\":500,\"location_index_search_iterations\":4,\"maximum_distance\":100000.0,\"maximum_distance_dynamic_weights\":100000.0,\"maximum_distance_avoid_areas\":100000.0,\"maximum_distance_alternative_routes\":100000.0,\"maximum_distance_round_trip_routes\":100000.0,\"maximum_speed_lower_bound\":80.0,\"maximum_way_points\":50,\"maximum_snapping_radius\":400,\"maximum_visited_nodes\":1000000,\"ext_storages\":{}},\"hiking\":{\"enabled\":false,\"encoder_name\":\"foot-hiking\",\"elevation\":true,\"elevation_smoothing\":true,\"encoder_flags_size\":8,\"instructions\":true,\"optimize\":false,\"traffic\":false,\"interpolate_bridges_and_tunnels\":true,\"force_turn_costs\":false,\"location_index_resolution\":500,\"location_index_search_iterations\":4,\"maximum_distance\":100000.0,\"maximum_distance_dynamic_weights\":100000.0,\"maximum_distance_avoid_areas\":100000.0,\"maximum_distance_alternative_routes\":100000.0,\"maximum_distance_round_trip_routes\":100000.0,\"maximum_speed_lower_bound\":80.0,\"maximum_way_points\":50,\"maximum_snapping_radius\":400,\"maximum_visited_nodes\":1000000,\"ext_storages\":{}},\"wheelchair\":{\"enabled\":false,\"encoder_name\":\"wheelchair\",\"elevation\":true,\"elevation_smoothing\":true,\"encoder_flags_size\":8,\"instructions\":true,\"optimize\":false,\"traffic\":false,\"interpolate_bridges_and_tunnels\":true,\"force_turn_costs\":false,\"location_index_resolution\":500,\"location_index_search_iterations\":4,\"maximum_distance\":100000.0,\"maximum_distance_dynamic_weights\":100000.0,\"maximum_distance_avoid_areas\":100000.0,\"maximum_distance_alternative_routes\":100000.0,\"maximum_distance_round_trip_routes\":100000.0,\"maximum_speed_lower_bound\":80.0,\"maximum_way_points\":50,\"maximum_snapping_radius\":50,\"maximum_visited_nodes\":1000000,\"ext_storages\":{}},\"public-transport\":{\"enabled\":false,\"encoder_name\":\"public-transport\",\"elevation\":true,\"elevation_smoothing\":true,\"encoder_flags_size\":8,\"instructions\":true,\"optimize\":false,\"traffic\":false,\"interpolate_bridges_and_tunnels\":true,\"force_turn_costs\":false,\"location_index_resolution\":500,\"location_index_search_iterations\":4,\"maximum_distance\":100000.0,\"maximum_distance_dynamic_weights\":100000.0,\"maximum_distance_avoid_areas\":100000.0,\"maximum_distance_alternative_routes\":100000.0,\"maximum_distance_round_trip_routes\":100000.0,\"maximum_speed_lower_bound\":80.0,\"maximum_way_points\":50,\"maximum_snapping_radius\":400,\"maximum_visited_nodes\":1000000}}}"; + String expectedJson = "{\"source_file\":null,\"init_threads\":null,\"preparation_mode\":null,\"config_output_mode\":null,\"graphs_root_path\":null,\"graphs_data_access\":null,\"elevation\":{\"preprocessed\":null,\"data_access\":null,\"cache_clear\":null,\"provider\":null,\"cache_path\":null},\"profile_default\":{\"ext_storages\":{}},\"profiles\":{}}"; assertEquals(expectedJson, json); } @@ -167,177 +112,151 @@ void testDeserialize() throws JsonProcessingException { assertTrue(hgvProfile.getExtStorages().isEmpty()); } + Boolean assertAllNull(Object o, ArrayList ignoreList) { + for (Field field : o.getClass().getDeclaredFields()) { + field.setAccessible(true); + try { + if (ignoreList.contains(field.getName())) { + continue; + } + Object value = field.get(o); + if (value == null) { + continue; + } + return false; + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + } + return true; + } + @Test - void deserializeOneCompleteProfile() throws JsonProcessingException { - DefaultProfileProperties defaultProfileProperties = new DefaultProfileProperties(); - // Cast to (ExtendedStorageWayCategoryTest) - String json = "{\n" + - " \"source_file\": \"ors-api/src/test/files/heidelberg.osm.gz\",\n" + - " \"config_output_mode\": true,\n" + - " \"graphs_root_path\": \"./graphs\",\n" + - " \"graphs_data_access\": \"RAM_STORE\",\n" + - " \"elevation\": {\n" + - " \"cache_path\": \"./elevation_cache\"\n" + - " },\n" + - " \"profile_default\": {\n" + - " \"enabled\": true,\n" + - " \"preparation\": {\n" + - " \"min_network_size\": 300,\n" + - " \"methods\": {\n" + - " \"lm\": {\n" + - " \"enabled\": true,\n" + - " \"threads\": 4,\n" + - " \"weightings\": \"shortest\",\n" + - " \"landmarks\": 2\n" + - " }\n" + - " }\n" + - " },\n" + - " \"execution\": {\n" + - " \"methods\": {\n" + - " \"lm\": {\n" + - " \"active_landmarks\": 8\n" + - " }\n" + - " }\n" + - " }\n" + - " },\n" + - " \"profiles\": {\n" + - " \"car\": {\n" + - " \"enabled\": true,\n" + - " \"encoder_name\": \"driving-car\",\n" + - " \"encoder_options\": {\n" + - " \"turn_costs\": true\n" + - " },\n" + - " \"preparation\": {\n" + - " \"min_network_size\": 900,\n" + - " \"methods\": {\n" + - " \"ch\": {\n" + - " \"enabled\": true,\n" + - " \"threads\": 1,\n" + - " \"weightings\": \"fastest\"\n" + - " }\n" + - " }\n" + - " },\n" + - " \"execution\": {\n" + - " \"methods\": {\n" + - " \"lm\": {\n" + - " \"active_landmarks\": 2\n" + - " },\n" + - " \"core\": {\n" + - " \"active_landmarks\": 6\n" + - " }\n" + - " }\n" + - " },\n" + - " \"ext_storages\": {\n" + - " \"WayCategory\": {},\n" + - " \"RoadAccessRestrictions\": {\n" + - " \"use_for_warnings\": true\n" + - " }\n" + - " }\n" + - " }\n" + - " }\n" + - "}"; - ObjectMapper objectMapper = new ObjectMapper(); - EngineProperties deserializedEngineProperties = objectMapper.readValue(json, EngineProperties.class); - assertNotNull(deserializedEngineProperties); - assertEquals(Paths.get("ors-api/src/test/files/heidelberg.osm.gz").toAbsolutePath(), deserializedEngineProperties.getSourceFile()); - assertFalse(deserializedEngineProperties.getPreparationMode()); - assertTrue(deserializedEngineProperties.getConfigOutputMode()); - assertEquals(Paths.get("./graphs").toAbsolutePath(), deserializedEngineProperties.getGraphsRootPath()); - assertEquals(DataAccessEnum.RAM_STORE, deserializedEngineProperties.getGraphsDataAccess()); - assertNotNull(deserializedEngineProperties.getElevation()); - assertNotNull(deserializedEngineProperties.getProfileDefault()); + void testRawSettingEverythingElseNullDefaultProfiles() throws JsonProcessingException, IllegalAccessException, NoSuchFieldException { + ObjectMapper mapper = new ObjectMapper(); + EngineProperties foo = mapper.readValue(testJson, EngineProperties.class); - ProfileProperties deserializedDefaultProfile = deserializedEngineProperties.getProfileDefault(); - // Check default overrides - assertTrue(deserializedDefaultProfile.getEnabled()); - assertEquals(300, deserializedDefaultProfile.getPreparation().getMinNetworkSize()); - assertNull(deserializedDefaultProfile.getPreparation().getMethods().getCh()); - assertNull(deserializedDefaultProfile.getPreparation().getMethods().getCore()); - assertNull(deserializedDefaultProfile.getPreparation().getMethods().getFastisochrones()); - - // Check Defaults - assertEquals(defaultProfileProperties.getElevation(), deserializedDefaultProfile.getElevation()); - assertEquals(defaultProfileProperties.getElevationSmoothing(), deserializedDefaultProfile.getElevationSmoothing()); - assertEquals(defaultProfileProperties.getEncoderFlagsSize(), deserializedDefaultProfile.getEncoderFlagsSize()); - assertEquals(defaultProfileProperties.getInstructions(), deserializedDefaultProfile.getInstructions()); - assertEquals(defaultProfileProperties.getOptimize(), deserializedDefaultProfile.getOptimize()); - assertEquals(defaultProfileProperties.getTraffic(), deserializedDefaultProfile.getTraffic()); - assertEquals(defaultProfileProperties.getInterpolateBridgesAndTunnels(), deserializedDefaultProfile.getInterpolateBridgesAndTunnels()); - assertEquals(defaultProfileProperties.getForceTurnCosts(), deserializedDefaultProfile.getForceTurnCosts()); - assertEquals(defaultProfileProperties.getLocationIndexResolution(), deserializedDefaultProfile.getLocationIndexResolution()); - assertEquals(defaultProfileProperties.getLocationIndexSearchIterations(), deserializedDefaultProfile.getLocationIndexSearchIterations()); - assertEquals(defaultProfileProperties.getMaximumDistance(), deserializedDefaultProfile.getMaximumDistance()); - assertEquals(defaultProfileProperties.getMaximumDistanceDynamicWeights(), deserializedDefaultProfile.getMaximumDistanceDynamicWeights()); - assertEquals(defaultProfileProperties.getMaximumDistanceAvoidAreas(), deserializedDefaultProfile.getMaximumDistanceAvoidAreas()); - assertEquals(defaultProfileProperties.getMaximumDistanceAlternativeRoutes(), deserializedDefaultProfile.getMaximumDistanceAlternativeRoutes()); - assertEquals(defaultProfileProperties.getMaximumDistanceRoundTripRoutes(), deserializedDefaultProfile.getMaximumDistanceRoundTripRoutes()); - assertEquals(defaultProfileProperties.getMaximumSpeedLowerBound(), deserializedDefaultProfile.getMaximumSpeedLowerBound()); - assertEquals(defaultProfileProperties.getMaximumWayPoints(), deserializedDefaultProfile.getMaximumWayPoints()); - assertEquals(defaultProfileProperties.getMaximumSnappingRadius(), deserializedDefaultProfile.getMaximumSnappingRadius()); - assertEquals(defaultProfileProperties.getMaximumVisitedNodes(), deserializedDefaultProfile.getMaximumVisitedNodes()); - assertEquals(0, deserializedDefaultProfile.getExtStorages().size()); - - - PreparationProperties.MethodsProperties lmMethods = deserializedDefaultProfile.getPreparation().getMethods(); - assertNotNull(lmMethods); - assertTrue(lmMethods.getLm().isEnabled()); - assertEquals(4, lmMethods.getLm().getThreads()); - assertEquals("shortest", lmMethods.getLm().getWeightings()); - assertEquals(2, lmMethods.getLm().getLandmarks()); - - assertNull(deserializedDefaultProfile.getExecution().getMethods().getAstar()); - assertNull(deserializedDefaultProfile.getExecution().getMethods().getCore()); - - ExecutionProperties.MethodsProperties lmExecutionMethods = deserializedDefaultProfile.getExecution().getMethods(); - assertNotNull(lmExecutionMethods); - assertEquals(8, lmExecutionMethods.getLm().getActiveLandmarks()); + Map defaultProfiles = foo.getDefault_profiles(); + assertEquals(0, defaultProfiles.size()); + } - Map profiles = deserializedEngineProperties.getProfiles(); - assertNotNull(profiles); + @Test + void testRawSettingEverythingElseNullGraphsDataAccess() throws JsonProcessingException, IllegalAccessException, NoSuchFieldException { + ObjectMapper mapper = new ObjectMapper(); + EngineProperties foo = mapper.readValue(testJson, EngineProperties.class); + assertEquals(DataAccessEnum.MMAP, foo.getGraphsDataAccess()); + } + + @Test + void testRawSettingEverythingElseNullElevationProperties() throws JsonProcessingException, IllegalAccessException, NoSuchFieldException { + ObjectMapper mapper = new ObjectMapper(); + EngineProperties foo = mapper.readValue(testJson, EngineProperties.class); + + ElevationProperties elevationProperties = foo.getElevation(); + assertTrue(assertAllNull(elevationProperties, new ArrayList<>())); + } + + @Test + void testRawSettingEverythingElseNullProfileDefaultProperties() throws JsonProcessingException, IllegalAccessException, NoSuchFieldException { + ObjectMapper mapper = new ObjectMapper(); + EngineProperties foo = mapper.readValue(testJson, EngineProperties.class); + + ProfileProperties profileProperties = foo.getProfileDefault(); + + assertTrue(assertAllNull(profileProperties, new ArrayList<>())); + + EncoderOptionsProperties encoderOptions = profileProperties.getEncoderOptions(); + assertTrue(assertAllNull(encoderOptions, new ArrayList<>())); + + PreparationProperties preparationProperties = profileProperties.getPreparation(); + assertEquals(300, preparationProperties.getMinNetworkSize()); + assertNull(preparationProperties.getMinOneWayNetworkSize()); + + PreparationProperties.MethodsProperties methodsProperties = preparationProperties.getMethods(); + assertTrue(assertAllNull(methodsProperties, new ArrayList<>(List.of("lm")))); + + PreparationProperties.MethodsProperties.LMProperties lmProperties = methodsProperties.getLm(); + assertFalse(lmProperties.isEnabled()); + assertEquals(4, lmProperties.getThreads()); + assertEquals("shortest", lmProperties.getWeightings()); + assertEquals(2, lmProperties.getLandmarks()); + + ExecutionProperties executionProperties = profileProperties.getExecution(); + assertTrue(assertAllNull(executionProperties.getMethods(), new ArrayList<>(List.of("lm")))); + + ExecutionProperties.MethodsProperties.LMProperties lmExecutionProperties = executionProperties.getMethods().getLm(); + assertEquals(8, lmExecutionProperties.getActiveLandmarks()); + assertEquals(0, profileProperties.getExtStorages().size()); + } + + @Test + void testRawSettingEverythingElseNullCarProfileProperties() throws JsonProcessingException, IllegalAccessException, NoSuchFieldException { + ObjectMapper mapper = new ObjectMapper(); + EngineProperties foo = mapper.readValue(testJson, EngineProperties.class); + + Map profiles = foo.getProfiles(); assertEquals(1, profiles.size()); assertTrue(profiles.containsKey("car")); - ProfileProperties deserializedCarProfile = profiles.get("car"); - assertNotNull(deserializedCarProfile); - assertTrue(deserializedCarProfile.getEnabled()); - assertEquals(EncoderNameEnum.DRIVING_CAR, deserializedCarProfile.getEncoderName()); - assertNotNull(deserializedCarProfile.getEncoderOptions()); - assertTrue(deserializedCarProfile.getEncoderOptions().getTurnCosts()); - assertEquals(900, deserializedCarProfile.getPreparation().getMinNetworkSize()); - assertNull(deserializedCarProfile.getPreparation().getMethods().getLm()); - assertNull(deserializedCarProfile.getPreparation().getMethods().getFastisochrones()); - assertNotNull(deserializedCarProfile.getPreparation().getMethods().getCh()); - - PreparationProperties.MethodsProperties.CHProperties ch = deserializedCarProfile.getPreparation().getMethods().getCh(); - assertNotNull(ch); - assertTrue(ch.isEnabled()); - assertEquals(1, ch.getThreads()); - assertEquals("fastest", ch.getWeightings()); - - ExecutionProperties.MethodsProperties executionMethods = deserializedCarProfile.getExecution().getMethods(); - assertNotNull(executionMethods); - assertNull(executionMethods.getAstar()); - assertNotNull(executionMethods.getLm()); - assertEquals(2, executionMethods.getLm().getActiveLandmarks()); - assertNotNull(executionMethods.getCore()); - assertEquals(6, executionMethods.getCore().getActiveLandmarks()); - - - Map extStorages = deserializedCarProfile.getExtStorages(); - assertNotNull(extStorages); - assertEquals(2, extStorages.size()); - assertTrue(extStorages.containsKey("WayCategory")); - assertTrue(extStorages.containsKey("RoadAccessRestrictions")); - - ExtendedStorageWayCategory wayCategory = (ExtendedStorageWayCategory) extStorages.get("WayCategory"); - assertNotNull(wayCategory); - assertTrue(wayCategory.getEnabled()); - - ExtendedStorageRoadAccessRestrictions roadAccessRestrictions = (ExtendedStorageRoadAccessRestrictions) extStorages.get("RoadAccessRestrictions"); - assertNotNull(roadAccessRestrictions); - assertTrue(roadAccessRestrictions.getEnabled()); - assertTrue(roadAccessRestrictions.getUseForWarnings()); + ProfileProperties carProfile = profiles.get("car"); + assertTrue(carProfile.getEnabled()); + assertEquals(EncoderNameEnum.DRIVING_CAR, carProfile.getEncoderName()); + + assertTrue(assertAllNull(carProfile, new ArrayList<>(List.of("encoderName", "enabled", "encoderOptions", "preparation", "execution", "extStorages")))); + + EncoderOptionsProperties carEncoderOptions = carProfile.getEncoderOptions(); + assertTrue(assertAllNull(carEncoderOptions, new ArrayList<>())); + + PreparationProperties carPreparation = carProfile.getPreparation(); + assertTrue(assertAllNull(carPreparation, new ArrayList<>(List.of("methods")))); + + PreparationProperties.MethodsProperties carMethods = carPreparation.getMethods(); + assertTrue(assertAllNull(carMethods, new ArrayList<>(List.of("lm")))); + PreparationProperties.MethodsProperties.LMProperties carLm = carMethods.getLm(); + assertTrue(assertAllNull(carLm, new ArrayList<>(List.of("enabled", "threads")))); + assertTrue(carLm.isEnabled()); + assertEquals(1, carLm.getThreads()); + + ExecutionProperties carExecution = carProfile.getExecution(); + assertTrue(assertAllNull(carExecution.getMethods(), new ArrayList<>(List.of("lm")))); + + ExecutionProperties.MethodsProperties.LMProperties carLmExecution = carExecution.getMethods().getLm(); + assertEquals(2, carLmExecution.getActiveLandmarks()); + assertEquals(0, carProfile.getExtStorages().size()); } + @Test + void testDefaultEngineProperties() { +// EngineProperties defaultEngineProperties = new EngineProperties(true); +// // DONE! TODO finish logic that the user settings are the only thing set without the default booleans true. everything else null. +// // TODO find a way so that the profile defaults only get the profile related differences. everything else null -> in progress +// // Todo initialize the ProfileDefault with everything except the ext_storages +// +// +// // Assure the root level is intact and set to default +// assertEquals(DataAccessEnum.MMAP, foo.getGraphsDataAccess()); +// +// // Check that the nested object elevation is set from defaults +// assertEquals(defaultEngineProperties.getElevation().getProvider(), foo.getElevation().getProvider()); +// assertEquals(defaultEngineProperties.getElevation().getCachePath(), foo.getElevation().getCachePath()); +// assertEquals(defaultEngineProperties.getElevation().getDataAccess(), foo.getElevation().getDataAccess()); +// assertEquals(defaultEngineProperties.getElevation().isPreprocessed(), foo.getElevation().isPreprocessed()); +// assertEquals(defaultEngineProperties.getElevation().getCacheClear(), foo.getElevation().getCacheClear()); +// +// // Check that the profile default is set correctly +// assertEquals(defaultEngineProperties.getProfileDefault().getEnabled(), foo.getProfileDefault().getEnabled()); +// assertEquals(defaultEngineProperties.getProfileDefault().getElevation(), foo.getProfileDefault().getElevation()); +// assertEquals(defaultEngineProperties.getProfileDefault().getEncoderOptions().getBlockFords(), foo.getProfileDefault().getEncoderOptions().getBlockFords()); +// +// // Ensure preparation is only default on the min_one_way_network_size and the nested methods section and not the min_network_size since that was set manually. +// assertEquals(300, foo.getProfileDefault().getPreparation().getMinNetworkSize()); +// assertEquals(defaultEngineProperties.getProfileDefault().getPreparation().getMinOneWayNetworkSize(), foo.getProfileDefault().getPreparation().getMinOneWayNetworkSize()); +// assertEquals(defaultEngineProperties.getProfileDefault().getPreparation().getMethods(), foo.getProfileDefault().getPreparation().getMethods()); +// +// +// // Check profile default +// ProfileProperties profileDefault = foo.getProfileDefault(); +// assertNotNull(profileDefault); + } } \ No newline at end of file