From ea0e6285be71112c5049d4712a2a31c8348dc9cc Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Mon, 28 Dec 2020 14:26:47 -0800 Subject: Refactor config keys --- src/main/java/org/traccar/config/ConfigKey.java | 20 +- src/main/java/org/traccar/config/ConfigSuffix.java | 22 +- src/main/java/org/traccar/config/KeyType.java | 23 ++ src/main/java/org/traccar/config/Keys.java | 393 ++++++++++++--------- 4 files changed, 285 insertions(+), 173 deletions(-) create mode 100644 src/main/java/org/traccar/config/KeyType.java (limited to 'src/main/java') diff --git a/src/main/java/org/traccar/config/ConfigKey.java b/src/main/java/org/traccar/config/ConfigKey.java index b9f54bcca..926b46851 100644 --- a/src/main/java/org/traccar/config/ConfigKey.java +++ b/src/main/java/org/traccar/config/ConfigKey.java @@ -15,22 +15,26 @@ */ package org.traccar.config; -public class ConfigKey { +import java.util.List; + +public class ConfigKey { private final String key; - private final Class clazz; + private final List types; + private final T defaultValue; + + ConfigKey(String key, List types) { + this(key, types, null); + } - ConfigKey(String key, Class clazz) { + ConfigKey(String key, List types, T defaultValue) { this.key = key; - this.clazz = clazz; + this.types = types; + this.defaultValue = defaultValue; } String getKey() { return key; } - Class getValueClass() { - return clazz; - } - } diff --git a/src/main/java/org/traccar/config/ConfigSuffix.java b/src/main/java/org/traccar/config/ConfigSuffix.java index 11218ddad..ede4c107d 100644 --- a/src/main/java/org/traccar/config/ConfigSuffix.java +++ b/src/main/java/org/traccar/config/ConfigSuffix.java @@ -15,14 +15,26 @@ */ package org.traccar.config; -public class ConfigSuffix extends ConfigKey { +import java.util.List; - ConfigSuffix(String key, Class clazz) { - super(key, clazz); +public class ConfigSuffix { + + private final String keySuffix; + private final List types; + private final T defaultValue; + + ConfigSuffix(String keySuffix, List types) { + this(keySuffix, types, null); + } + + ConfigSuffix(String keySuffix, List types, T defaultValue) { + this.keySuffix = keySuffix; + this.types = types; + this.defaultValue = defaultValue; } - public ConfigKey withPrefix(String prefix) { - return new ConfigKey(prefix + getKey(), getValueClass()); + public ConfigKey withPrefix(String prefix) { + return new ConfigKey<>(prefix + keySuffix, types, defaultValue); } } diff --git a/src/main/java/org/traccar/config/KeyType.java b/src/main/java/org/traccar/config/KeyType.java new file mode 100644 index 000000000..35f958be6 --- /dev/null +++ b/src/main/java/org/traccar/config/KeyType.java @@ -0,0 +1,23 @@ +/* + * Copyright 2020 Anton Tananaev (anton@traccar.org) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.traccar.config; + +public enum KeyType { + FILE, + SERVER, + USER, + DEVICE, +} diff --git a/src/main/java/org/traccar/config/Keys.java b/src/main/java/org/traccar/config/Keys.java index c8d3f4ccc..b6b78d4d7 100644 --- a/src/main/java/org/traccar/config/Keys.java +++ b/src/main/java/org/traccar/config/Keys.java @@ -15,6 +15,8 @@ */ package org.traccar.config; +import java.util.Collections; + public final class Keys { /** @@ -23,158 +25,176 @@ public final class Keys { * problems with establishing new connections when number of devices is high or devices data connections are * unstable. */ - public static final ConfigSuffix PROTOCOL_TIMEOUT = new ConfigSuffix( - ".timeout", Integer.class); + public static final ConfigSuffix PROTOCOL_TIMEOUT = new ConfigSuffix<>( + ".timeout", + Collections.singletonList(KeyType.FILE)); /** * Server wide connection timeout value in seconds. See protocol timeout for more information. */ - public static final ConfigKey SERVER_TIMEOUT = new ConfigKey( - "server.timeout", Integer.class); + public static final ConfigKey SERVER_TIMEOUT = new ConfigKey<>( + "server.timeout", + Collections.singletonList(KeyType.FILE)); /** * Address for uploading aggregated anonymous usage statistics. Uploaded information is the same you can see on the * statistics screen in the web app. It does not include any sensitive (e.g. locations). */ - public static final ConfigKey SERVER_STATISTICS = new ConfigKey( - "server.statistics", Boolean.class); + public static final ConfigKey SERVER_STATISTICS = new ConfigKey<>( + "server.statistics", + Collections.singletonList(KeyType.FILE)); /** * Enable events subsystem. Flag to enable all events handlers. */ - public static final ConfigKey EVENT_ENABLE = new ConfigKey( - "event.enable", Boolean.class); + public static final ConfigKey EVENT_ENABLE = new ConfigKey<>( + "event.enable", + Collections.singletonList(KeyType.FILE)); /** * If true, the event is generated once at the beginning of overspeeding period. */ - public static final ConfigKey EVENT_OVERSPEED_NOT_REPEAT = new ConfigKey( - "event.overspeed.notRepeat", Boolean.class); + public static final ConfigKey EVENT_OVERSPEED_NOT_REPEAT = new ConfigKey<>( + "event.overspeed.notRepeat", + Collections.singletonList(KeyType.FILE)); /** * Minimal over speed duration to trigger the event. Value in seconds. */ - public static final ConfigKey EVENT_OVERSPEED_MINIMAL_DURATION = new ConfigKey( - "event.overspeed.minimalDuration", Long.class); + public static final ConfigKey EVENT_OVERSPEED_MINIMAL_DURATION = new ConfigKey<>( + "event.overspeed.minimalDuration", + Collections.singletonList(KeyType.FILE)); /** * Relevant only for geofence speed limits. Use lowest speed limits from all geofences. */ - public static final ConfigKey EVENT_OVERSPEED_PREFER_LOWEST = new ConfigKey( - "event.overspeed.preferLowest", Boolean.class); + public static final ConfigKey EVENT_OVERSPEED_PREFER_LOWEST = new ConfigKey<>( + "event.overspeed.preferLowest", + Collections.singletonList(KeyType.FILE)); /** * Do not generate alert event if same alert was present in last known location. */ - public static final ConfigKey EVENT_IGNORE_DUPLICATE_ALERTS = new ConfigKey( - "event.ignoreDuplicateAlerts", Boolean.class); + public static final ConfigKey EVENT_IGNORE_DUPLICATE_ALERTS = new ConfigKey<>( + "event.ignoreDuplicateAlerts", + Collections.singletonList(KeyType.FILE)); /** * If set to true, invalid positions will be considered for motion logic. */ - public static final ConfigKey EVENT_MOTION_PROCESS_INVALID_POSITIONS = new ConfigKey( - "event.motion.processInvalidPositions", Boolean.class); + public static final ConfigKey EVENT_MOTION_PROCESS_INVALID_POSITIONS = new ConfigKey<>( + "event.motion.processInvalidPositions", + Collections.singletonList(KeyType.FILE)); /** * If the speed is above specified value, the object is considered to be in motion. Default value is 0.01 knots. */ - public static final ConfigKey EVENT_MOTION_SPEED_THRESHOLD = new ConfigKey( - "event.motion.speedThreshold", Double.class); + public static final ConfigKey EVENT_MOTION_SPEED_THRESHOLD = new ConfigKey<>( + "event.motion.speedThreshold", + Collections.singletonList(KeyType.FILE)); /** * Global polyline geofence distance. Within that distance from the polyline, point is considered within the * geofence. Each individual geofence can also has 'polylineDistance' attribute which will take precedence. */ - public static final ConfigKey GEOFENCE_POLYLINE_DISTANCE = new ConfigKey( - "geofence.polylineDistance", Double.class); - - /** - * List of external handler classes to use in Netty pipeline. - */ - public static final ConfigKey EXTRA_HANDLERS = new ConfigKey( - "extra.handlers", String.class); + public static final ConfigKey GEOFENCE_POLYLINE_DISTANCE = new ConfigKey<>( + "geofence.polylineDistance", + Collections.singletonList(KeyType.FILE)); /** * Path to the database driver JAR file. Traccar includes drivers for MySQL, PostgreSQL and H2 databases. If you use * one of those, you don't need to specify this parameter. */ - public static final ConfigKey DATABASE_DRIVER_FILE = new ConfigKey( - "database.driverFile", String.class); + public static final ConfigKey DATABASE_DRIVER_FILE = new ConfigKey<>( + "database.driverFile", + Collections.singletonList(KeyType.FILE)); /** * Database driver Java class. For H2 use 'org.h2.Driver'. MySQL driver class name is 'com.mysql.jdbc.Driver'. */ - public static final ConfigKey DATABASE_DRIVER = new ConfigKey( - "database.driver", String.class); + public static final ConfigKey DATABASE_DRIVER = new ConfigKey<>( + "database.driver", + Collections.singletonList(KeyType.FILE)); /** * Database connection URL. By default Traccar uses H2 database. */ - public static final ConfigKey DATABASE_URL = new ConfigKey( - "database.url", String.class); + public static final ConfigKey DATABASE_URL = new ConfigKey<>( + "database.url", + Collections.singletonList(KeyType.FILE)); /** * Database user name. Default administrator user for H2 database is 'sa'. */ - public static final ConfigKey DATABASE_USER = new ConfigKey( - "database.user", String.class); + public static final ConfigKey DATABASE_USER = new ConfigKey<>( + "database.user", + Collections.singletonList(KeyType.FILE)); /** * Database user password. Default password for H2 admin (sa) user is empty. */ - public static final ConfigKey DATABASE_PASSWORD = new ConfigKey( - "database.password", String.class); + public static final ConfigKey DATABASE_PASSWORD = new ConfigKey<>( + "database.password", + Collections.singletonList(KeyType.FILE)); /** * Path to Liquibase master changelog file. */ - public static final ConfigKey DATABASE_CHANGELOG = new ConfigKey( - "database.changelog", String.class); + public static final ConfigKey DATABASE_CHANGELOG = new ConfigKey<>( + "database.changelog", + Collections.singletonList(KeyType.FILE)); /** * SQL query to check connection status. Default value is 'SELECT 1'. For Oracle database you can use * 'SELECT 1 FROM DUAL'. */ - public static final ConfigKey DATABASE_CHECK_CONNECTION = new ConfigKey( - "database.checkConnection", String.class); + public static final ConfigKey DATABASE_CHECK_CONNECTION = new ConfigKey<>( + "database.checkConnection", + Collections.singletonList(KeyType.FILE)); /** * Store original HEX or string data as "raw" attribute in the corresponding position. */ - public static final ConfigKey DATABASE_SAVE_ORIGINAL = new ConfigKey( - "database.saveOriginal", Boolean.class); + public static final ConfigKey DATABASE_SAVE_ORIGINAL = new ConfigKey<>( + "database.saveOriginal", + Collections.singletonList(KeyType.FILE)); /** * Enable positions forwarding to other web server. */ - public static final ConfigKey FORWARD_ENABLE = new ConfigKey( - "forward.enable", Boolean.class); + public static final ConfigKey FORWARD_ENABLE = new ConfigKey<>( + "forward.enable", + Collections.singletonList(KeyType.FILE)); /** * URL to forward positions. Data is passed through URL parameters. For example, {uniqueId} for device identifier, * {latitude} and {longitude} for coordinates. */ - public static final ConfigKey FORWARD_URL = new ConfigKey( - "forward.url", String.class); + public static final ConfigKey FORWARD_URL = new ConfigKey<>( + "forward.url", + Collections.singletonList(KeyType.FILE)); /** * Additional HTTP header, can be used for authorization. */ - public static final ConfigKey FORWARD_HEADER = new ConfigKey( - "forward.header", String.class); + public static final ConfigKey FORWARD_HEADER = new ConfigKey<>( + "forward.header", + Collections.singletonList(KeyType.FILE)); /** * Boolean value to enable forwarding in JSON format. */ - public static final ConfigKey FORWARD_JSON = new ConfigKey( - "forward.json", Boolean.class); + public static final ConfigKey FORWARD_JSON = new ConfigKey<>( + "forward.json", + Collections.singletonList(KeyType.FILE)); /** * Boolean value to enable URL parameters in json mode. For example, {uniqueId} for device identifier, * {latitude} and {longitude} for coordinates. */ - public static final ConfigKey FORWARD_URL_VARIABLES = new ConfigKey( - "forward.urlVariables", Boolean.class); + public static final ConfigKey FORWARD_URL_VARIABLES = new ConfigKey<>( + "forward.urlVariables", + Collections.singletonList(KeyType.FILE)); /** * Position forwarding retrying enable. When enabled, additional attempts are made to deliver positions. If initial @@ -183,317 +203,366 @@ public final class Keys { * If forwarding is retried for 'forward.retry.count', retrying is canceled and the position is dropped. Positions * pending to be delivered are limited to 'forward.retry.limit'. If this limit is reached, positions get discarded. */ - public static final ConfigKey FORWARD_RETRY_ENABLE = new ConfigKey( - "forward.retry.enable", Boolean.class); + public static final ConfigKey FORWARD_RETRY_ENABLE = new ConfigKey<>( + "forward.retry.enable", + Collections.singletonList(KeyType.FILE)); /** * Position forwarding retry first delay in milliseconds. * Can be set to anything greater than 0. Defaults to 100 milliseconds. */ - public static final ConfigKey FORWARD_RETRY_DELAY = new ConfigKey( - "forward.retry.delay", Integer.class); + public static final ConfigKey FORWARD_RETRY_DELAY = new ConfigKey<>( + "forward.retry.delay", + Collections.singletonList(KeyType.FILE)); /** * Position forwarding retry maximum retries. * Can be set to anything greater than 0. Defaults to 10 retries. */ - public static final ConfigKey FORWARD_RETRY_COUNT = new ConfigKey( - "forward.retry.count", Integer.class); + public static final ConfigKey FORWARD_RETRY_COUNT = new ConfigKey<>( + "forward.retry.count", + Collections.singletonList(KeyType.FILE)); /** * Position forwarding retry pending positions limit. * Can be set to anything greater than 0. Defaults to 100 positions. */ - public static final ConfigKey FORWARD_RETRY_LIMIT = new ConfigKey( - "forward.retry.limit", Integer.class); + public static final ConfigKey FORWARD_RETRY_LIMIT = new ConfigKey<>( + "forward.retry.limit", + Collections.singletonList(KeyType.FILE)); /** * Boolean flag to enable or disable position filtering. */ - public static final ConfigKey FILTER_ENABLE = new ConfigKey( - "filter.enable", Boolean.class); + public static final ConfigKey FILTER_ENABLE = new ConfigKey<>( + "filter.enable", + Collections.singletonList(KeyType.FILE)); /** * Filter invalid (valid field is set to false) positions. */ - public static final ConfigKey FILTER_INVALID = new ConfigKey( - "filter.invalid", Boolean.class); + public static final ConfigKey FILTER_INVALID = new ConfigKey<>( + "filter.invalid", + Collections.singletonList(KeyType.FILE)); /** * Filter zero coordinates. Zero latitude and longitude are theoretically valid values, but it practice it usually * indicates invalid GPS data. */ - public static final ConfigKey FILTER_ZERO = new ConfigKey( - "filter.zero", Boolean.class); + public static final ConfigKey FILTER_ZERO = new ConfigKey<>( + "filter.zero", + Collections.singletonList(KeyType.FILE)); /** * Filter duplicate records (duplicates are detected by time value). */ - public static final ConfigKey FILTER_DUPLICATE = new ConfigKey( - "filter.duplicate", Boolean.class); + public static final ConfigKey FILTER_DUPLICATE = new ConfigKey<>( + "filter.duplicate", + Collections.singletonList(KeyType.FILE)); /** * Filter records with fix time in future. The values is specified in seconds. Records that have fix time more than * specified number of seconds later than current server time would be filtered out. */ - public static final ConfigKey FILTER_FUTURE = new ConfigKey( - "filter.future", Long.class); + public static final ConfigKey FILTER_FUTURE = new ConfigKey<>( + "filter.future", + Collections.singletonList(KeyType.FILE)); /** * Filter positions with accuracy less than specified value in meters. */ - public static final ConfigKey FILTER_ACCURACY = new ConfigKey( - "filter.accuracy", Integer.class); + public static final ConfigKey FILTER_ACCURACY = new ConfigKey<>( + "filter.accuracy", + Collections.singletonList(KeyType.FILE)); /** * Filter cell and wifi locations that are coming from geolocation provider. */ - public static final ConfigKey FILTER_APPROXIMATE = new ConfigKey( - "filter.approximate", Boolean.class); + public static final ConfigKey FILTER_APPROXIMATE = new ConfigKey<>( + "filter.approximate", + Collections.singletonList(KeyType.FILE)); /** * Filter positions with exactly zero speed values. */ - public static final ConfigKey FILTER_STATIC = new ConfigKey( - "filter.static", Boolean.class); + public static final ConfigKey FILTER_STATIC = new ConfigKey<>( + "filter.static", + Collections.singletonList(KeyType.FILE)); /** * Filter records by distance. The values is specified in meters. If the new position is less far than this value * from the last one it gets filtered out. */ - public static final ConfigKey FILTER_DISTANCE = new ConfigKey( - "filter.distance", Integer.class); + public static final ConfigKey FILTER_DISTANCE = new ConfigKey<>( + "filter.distance", + Collections.singletonList(KeyType.FILE)); /** * Filter records by Maximum Speed value in knots. Can be used to filter jumps to far locations even if they're * marked as valid. Shouldn't be too low. Start testing with values at about 25000. */ - public static final ConfigKey FILTER_MAX_SPEED = new ConfigKey( - "filter.maxSpeed", Integer.class); + public static final ConfigKey FILTER_MAX_SPEED = new ConfigKey<>( + "filter.maxSpeed", + Collections.singletonList(KeyType.FILE)); /** * Filter position if time from previous position is less than specified value in seconds. */ - public static final ConfigKey FILTER_MIN_PERIOD = new ConfigKey( - "filter.minPeriod", Integer.class); + public static final ConfigKey FILTER_MIN_PERIOD = new ConfigKey<>( + "filter.minPeriod", + Collections.singletonList(KeyType.FILE)); /** * Time limit for the filtering in seconds. If the time difference between last position and a new one is more than * this limit, the new position will not be filtered out. */ - public static final ConfigKey FILTER_SKIP_LIMIT = new ConfigKey( - "filter.skipLimit", Long.class); + public static final ConfigKey FILTER_SKIP_LIMIT = new ConfigKey<>( + "filter.skipLimit", + Collections.singletonList(KeyType.FILE)); /** * Enable attributes skipping. Attribute skipping can be enabled in the config or device attributes. */ - public static final ConfigKey FILTER_SKIP_ATTRIBUTES_ENABLE = new ConfigKey( - "filter.skipAttributes.enable", Boolean.class); + public static final ConfigKey FILTER_SKIP_ATTRIBUTES_ENABLE = new ConfigKey<>( + "filter.skipAttributes.enable", + Collections.singletonList(KeyType.FILE)); /** * Override device time. Possible values are 'deviceTime' and 'serverTime' */ - public static final ConfigKey TIME_OVERRIDE = new ConfigKey( - "time.override", String.class); + public static final ConfigKey TIME_OVERRIDE = new ConfigKey<>( + "time.override", + Collections.singletonList(KeyType.FILE)); /** * List of protocols for overriding time. If not specified override is applied globally. List consist of protocol * names that can be separated by comma or single space character. */ - public static final ConfigKey TIME_PROTOCOLS = new ConfigKey( - "time.protocols", String.class); + public static final ConfigKey TIME_PROTOCOLS = new ConfigKey<>( + "time.protocols", + Collections.singletonList(KeyType.FILE)); /** * Replaces coordinates with last known if change is less than a 'coordinates.minError' meters * or more than a 'coordinates.maxError' meters. Helps to avoid coordinates jumps during parking period * or jumps to zero coordinates. */ - public static final ConfigKey COORDINATES_FILTER = new ConfigKey( - "coordinates.filter", Boolean.class); + public static final ConfigKey COORDINATES_FILTER = new ConfigKey<>( + "coordinates.filter", + Collections.singletonList(KeyType.FILE)); /** * Distance in meters. Distances below this value gets handled like explained in 'coordinates.filter'. */ - public static final ConfigKey COORDINATES_MIN_ERROR = new ConfigKey( - "coordinates.minError", Integer.class); + public static final ConfigKey COORDINATES_MIN_ERROR = new ConfigKey<>( + "coordinates.minError", + Collections.singletonList(KeyType.FILE)); /** * Distance in meters. Distances above this value gets handled like explained in 'coordinates.filter', but only if * Position is also marked as 'invalid'. */ - public static final ConfigKey COORDINATES_MAX_ERROR = new ConfigKey( - "coordinates.maxError", Integer.class); + public static final ConfigKey COORDINATES_MAX_ERROR = new ConfigKey<>( + "coordinates.maxError", + Collections.singletonList(KeyType.FILE)); /** * Enable to save device IP addresses information. Disabled by default. */ - public static final ConfigKey PROCESSING_REMOTE_ADDRESS_ENABLE = new ConfigKey( - "processing.remoteAddress.enable", Boolean.class); + public static final ConfigKey PROCESSING_REMOTE_ADDRESS_ENABLE = new ConfigKey<>( + "processing.remoteAddress.enable", + Collections.singletonList(KeyType.FILE)); /** * Enable engine hours calculation on the server side. It uses ignition value to determine engine state. */ - public static final ConfigKey PROCESSING_ENGINE_HOURS_ENABLE = new ConfigKey( - "processing.engineHours.enable", Boolean.class); + public static final ConfigKey PROCESSING_ENGINE_HOURS_ENABLE = new ConfigKey<>( + "processing.engineHours.enable", + Collections.singletonList(KeyType.FILE)); /** * Enable copying of missing attributes from last position to the current one. Might be useful if device doesn't * send some values in every message. */ - public static final ConfigKey PROCESSING_COPY_ATTRIBUTES_ENABLE = new ConfigKey( - "processing.copyAttributes.enable", Boolean.class); + public static final ConfigKey PROCESSING_COPY_ATTRIBUTES_ENABLE = new ConfigKey<>( + "processing.copyAttributes.enable", + Collections.singletonList(KeyType.FILE)); /** * Enable computed attributes processing. */ - public static final ConfigKey PROCESSING_COMPUTED_ATTRIBUTES_ENABLE = new ConfigKey( - "processing.computedAttributes.enable", Boolean.class); + public static final ConfigKey PROCESSING_COMPUTED_ATTRIBUTES_ENABLE = new ConfigKey<>( + "processing.computedAttributes.enable", + Collections.singletonList(KeyType.FILE)); /** * Enable computed attributes processing. */ - public static final ConfigKey PROCESSING_COMPUTED_ATTRIBUTES_DEVICE_ATTRIBUTES = new ConfigKey( - "processing.computedAttributes.deviceAttributes", Boolean.class); + public static final ConfigKey PROCESSING_COMPUTED_ATTRIBUTES_DEVICE_ATTRIBUTES = new ConfigKey<>( + "processing.computedAttributes.deviceAttributes", + Collections.singletonList(KeyType.FILE)); /** * Boolean flag to enable or disable reverse geocoder. */ - public static final ConfigKey GEOCODER_ENABLE = new ConfigKey( - "geocoder.enable", Boolean.class); + public static final ConfigKey GEOCODER_ENABLE = new ConfigKey<>( + "geocoder.enable", + Collections.singletonList(KeyType.FILE)); /** * Reverse geocoder type. Check reverse geocoding documentation for more info. By default (if the value is not * specified) server uses Google API. */ - public static final ConfigKey GEOCODER_TYPE = new ConfigKey( - "geocoder.type", String.class); + public static final ConfigKey GEOCODER_TYPE = new ConfigKey<>( + "geocoder.type", + Collections.singletonList(KeyType.FILE)); /** * Geocoder server URL. Applicable only to Nominatim and Gisgraphy providers. */ - public static final ConfigKey GEOCODER_URL = new ConfigKey( - "geocoder.url", String.class); + public static final ConfigKey GEOCODER_URL = new ConfigKey<>( + "geocoder.url", + Collections.singletonList(KeyType.FILE)); /** * App id for use with Here provider. */ - public static final ConfigKey GEOCODER_ID = new ConfigKey( - "geocoder.id", String.class); + public static final ConfigKey GEOCODER_ID = new ConfigKey<>( + "geocoder.id", + Collections.singletonList(KeyType.FILE)); /** * Provider API key. Most providers require API keys. */ - public static final ConfigKey GEOCODER_KEY = new ConfigKey( - "geocoder.key", String.class); + public static final ConfigKey GEOCODER_KEY = new ConfigKey<>( + "geocoder.key", + Collections.singletonList(KeyType.FILE)); /** * Language parameter for providers that support localization (e.g. Google and Nominatim). */ - public static final ConfigKey GEOCODER_LANGUAGE = new ConfigKey( - "geocoder.language", String.class); + public static final ConfigKey GEOCODER_LANGUAGE = new ConfigKey<>( + "geocoder.language", + Collections.singletonList(KeyType.FILE)); /** * Address format string. Default value is %h %r, %t, %s, %c. See AddressFormat for more info. */ - public static final ConfigKey GEOCODER_FORMAT = new ConfigKey( - "geocoder.format", String.class); + public static final ConfigKey GEOCODER_FORMAT = new ConfigKey<>( + "geocoder.format", + Collections.singletonList(KeyType.FILE)); /** * Cache size for geocoding results. */ - public static final ConfigKey GEOCODER_CACHE_SIZE = new ConfigKey( - "geocoder.cacheSize", Integer.class); + public static final ConfigKey GEOCODER_CACHE_SIZE = new ConfigKey<>( + "geocoder.cacheSize", + Collections.singletonList(KeyType.FILE)); /** * Disable automatic reverse geocoding requests for all positions. */ - public static final ConfigKey GEOCODER_IGNORE_POSITIONS = new ConfigKey( - "geocoder.ignorePositions", Boolean.class); + public static final ConfigKey GEOCODER_IGNORE_POSITIONS = new ConfigKey<>( + "geocoder.ignorePositions", + Collections.singletonList(KeyType.FILE)); /** * Boolean flag to apply reverse geocoding to invalid positions. */ - public static final ConfigKey GEOCODER_PROCESS_INVALID_POSITIONS = new ConfigKey( - "geocoder.processInvalidPositions", Boolean.class); + public static final ConfigKey GEOCODER_PROCESS_INVALID_POSITIONS = new ConfigKey<>( + "geocoder.processInvalidPositions", + Collections.singletonList(KeyType.FILE)); /** * Optional parameter to specify minimum distance for new reverse geocoding request. If distance is less than * specified value (in meters), then Traccar will reuse last known address. */ - public static final ConfigKey GEOCODER_REUSE_DISTANCE = new ConfigKey( - "geocoder.reuseDistance", Integer.class); + public static final ConfigKey GEOCODER_REUSE_DISTANCE = new ConfigKey<>( + "geocoder.reuseDistance", + Collections.singletonList(KeyType.FILE)); /** * Boolean flag to enable LBS location resolution. Some devices send cell towers information and WiFi point when GPS * location is not available. Traccar can determine coordinates based on that information using third party * services. Default value is false. */ - public static final ConfigKey GEOLOCATION_ENABLE = new ConfigKey( - "geolocation.enable", Boolean.class); + public static final ConfigKey GEOLOCATION_ENABLE = new ConfigKey<>( + "geolocation.enable", + Collections.singletonList(KeyType.FILE)); /** * Provider to use for LBS location. Available options: google, mozilla and opencellid. By default opencellid is * used. You have to supply a key that you get from corresponding provider. For more information see LBS geolocation * documentation. */ - public static final ConfigKey GEOLOCATION_TYPE = new ConfigKey( - "geolocation.type", String.class); + public static final ConfigKey GEOLOCATION_TYPE = new ConfigKey<>( + "geolocation.type", + Collections.singletonList(KeyType.FILE)); /** * Geolocation provider API URL address. Not required for most providers. */ - public static final ConfigKey GEOLOCATION_URL = new ConfigKey( - "geolocation.url", String.class); + public static final ConfigKey GEOLOCATION_URL = new ConfigKey<>( + "geolocation.url", + Collections.singletonList(KeyType.FILE)); /** * Provider API key. OpenCellID service requires API key. */ - public static final ConfigKey GEOLOCATION_KEY = new ConfigKey( - "geolocation.key", String.class); + public static final ConfigKey GEOLOCATION_KEY = new ConfigKey<>( + "geolocation.key", + Collections.singletonList(KeyType.FILE)); /** * Boolean flag to apply geolocation to invalid positions. */ - public static final ConfigKey GEOLOCATION_PROCESS_INVALID_POSITIONS = new ConfigKey( - "geolocation.processInvalidPositions", Boolean.class); + public static final ConfigKey GEOLOCATION_PROCESS_INVALID_POSITIONS = new ConfigKey<>( + "geolocation.processInvalidPositions", + Collections.singletonList(KeyType.FILE)); /** * Boolean flag to enable speed limit API to get speed limit values depending on location. Default value is false. */ - public static final ConfigKey SPEED_LIMIT_ENABLE = new ConfigKey( - "speedLimit.enable", Boolean.class); + public static final ConfigKey SPEED_LIMIT_ENABLE = new ConfigKey<>( + "speedLimit.enable", + Collections.singletonList(KeyType.FILE)); /** * Provider to use for speed limit. Available options: overpass. By default overpass is used. */ - public static final ConfigKey SPEED_LIMIT_TYPE = new ConfigKey( - "speedLimit.type", String.class); + public static final ConfigKey SPEED_LIMIT_TYPE = new ConfigKey<>( + "speedLimit.type", + Collections.singletonList(KeyType.FILE)); /** * Speed limit provider API URL address. */ - public static final ConfigKey SPEED_LIMIT_URL = new ConfigKey( - "speedLimit.url", String.class); + public static final ConfigKey SPEED_LIMIT_URL = new ConfigKey<>( + "speedLimit.url", + Collections.singletonList(KeyType.FILE)); /** * Override latitude sign / hemisphere. Useful in cases where value is incorrect because of device bug. Value can be * N for North or S for South. */ - public static final ConfigKey LOCATION_LATITUDE_HEMISPHERE = new ConfigKey( - "location.latitudeHemisphere", Boolean.class); + public static final ConfigKey LOCATION_LATITUDE_HEMISPHERE = new ConfigKey<>( + "location.latitudeHemisphere", + Collections.singletonList(KeyType.FILE)); /** * Override longitude sign / hemisphere. Useful in cases where value is incorrect because of device bug. Value can * be E for East or W for West. */ - public static final ConfigKey LOCATION_LONGITUDE_HEMISPHERE = new ConfigKey( - "location.longitudeHemisphere", Boolean.class); + public static final ConfigKey LOCATION_LONGITUDE_HEMISPHERE = new ConfigKey<>( + "location.longitudeHemisphere", + Collections.singletonList(KeyType.FILE)); /** * Enable Jetty Request Log. */ - public static final ConfigKey WEB_REQUEST_LOG_ENABLE = new ConfigKey( - "web.requestLog.enable", Boolean.class); + public static final ConfigKey WEB_REQUEST_LOG_ENABLE = new ConfigKey<>( + "web.requestLog.enable", + Collections.singletonList(KeyType.FILE)); /** * Jetty Request Log Path. @@ -501,27 +570,31 @@ public final class Keys { * over the file. * Example: ./logs/jetty-yyyy_mm_dd.request.log */ - public static final ConfigKey WEB_REQUEST_LOG_PATH = new ConfigKey( - "web.requestLog.path", String.class); + public static final ConfigKey WEB_REQUEST_LOG_PATH = new ConfigKey<>( + "web.requestLog.path", + Collections.singletonList(KeyType.FILE)); /** * Set the number of days before rotated request log files are deleted. */ - public static final ConfigKey WEB_REQUEST_LOG_RETAIN_DAYS = new ConfigKey( - "web.requestLog.retainDays", Integer.class); + public static final ConfigKey WEB_REQUEST_LOG_RETAIN_DAYS = new ConfigKey<>( + "web.requestLog.retainDays", + Collections.singletonList(KeyType.FILE)); /** * Disable systemd health checks. */ - public static final ConfigKey WEB_DISABLE_HEALTH_CHECK = new ConfigKey( - "web.disableHealthCheck", Boolean.class); + public static final ConfigKey WEB_DISABLE_HEALTH_CHECK = new ConfigKey<>( + "web.disableHealthCheck", + Collections.singletonList(KeyType.FILE)); /** * Sets SameSite cookie attribute value. * Supported options: Lax, Strict, None. */ - public static final ConfigKey WEB_SAME_SITE_COOKIE = new ConfigKey( - "web.sameSiteCookie", String.class); + public static final ConfigKey WEB_SAME_SITE_COOKIE = new ConfigKey<>( + "web.sameSiteCookie", + Collections.singletonList(KeyType.FILE)); private Keys() { } -- cgit v1.2.3