From c1f81846eb0cbbc4ea6af948cea4367fc7faf42d Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 16 May 2026 15:57:06 -0700 Subject: [PATCH] Upgrade pattern matches --- .../java/org/traccar/BasePipelineFactory.java | 20 ++--- .../java/org/traccar/BaseProtocolDecoder.java | 13 ++- src/main/java/org/traccar/model/Calendar.java | 39 ++++----- .../protocol/FlespiProtocolDecoder.java | 20 +++-- .../protocol/OutsafeProtocolDecoder.java | 12 +-- .../traccar/session/cache/CacheManager.java | 40 +++++---- .../org/traccar/storage/DatabaseStorage.java | 54 +++++++----- .../org/traccar/storage/MemoryStorage.java | 87 +++++++++---------- .../org/traccar/storage/QueryBuilder.java | 20 ++--- 9 files changed, 147 insertions(+), 158 deletions(-) diff --git a/src/main/java/org/traccar/BasePipelineFactory.java b/src/main/java/org/traccar/BasePipelineFactory.java index fb525ec7c..27a7c85f9 100644 --- a/src/main/java/org/traccar/BasePipelineFactory.java +++ b/src/main/java/org/traccar/BasePipelineFactory.java @@ -64,11 +64,11 @@ public abstract class BasePipelineFactory extends ChannelInitializer { public static T getHandler(ChannelPipeline pipeline, Class clazz) { for (Map.Entry handlerEntry : pipeline) { ChannelHandler handler = handlerEntry.getValue(); - if (handler instanceof WrapperInboundHandler wrapperHandler) { - handler = wrapperHandler.getWrappedHandler(); - } else if (handler instanceof WrapperOutboundHandler wrapperHandler) { - handler = wrapperHandler.getWrappedHandler(); - } + handler = switch (handler) { + case WrapperInboundHandler wrapperHandler -> wrapperHandler.getWrappedHandler(); + case WrapperOutboundHandler wrapperHandler -> wrapperHandler.getWrappedHandler(); + default -> handler; + }; if (clazz.isAssignableFrom(handler.getClass())) { return (T) handler; } @@ -106,11 +106,11 @@ public abstract class BasePipelineFactory extends ChannelInitializer { if (handler instanceof BaseProtocolDecoder || handler instanceof BaseProtocolEncoder) { injectMembers(handler); } else { - if (handler instanceof ChannelInboundHandler channelHandler) { - handler = new WrapperInboundHandler(channelHandler); - } else if (handler instanceof ChannelOutboundHandler channelHandler) { - handler = new WrapperOutboundHandler(channelHandler); - } + handler = switch (handler) { + case ChannelInboundHandler channelHandler -> new WrapperInboundHandler(channelHandler); + case ChannelOutboundHandler channelHandler -> new WrapperOutboundHandler(channelHandler); + default -> handler; + }; } pipeline.addLast(handler); }); diff --git a/src/main/java/org/traccar/BaseProtocolDecoder.java b/src/main/java/org/traccar/BaseProtocolDecoder.java index da18bb4f0..79c4234d6 100644 --- a/src/main/java/org/traccar/BaseProtocolDecoder.java +++ b/src/main/java/org/traccar/BaseProtocolDecoder.java @@ -162,15 +162,14 @@ public abstract class BaseProtocolDecoder extends ExtendedObjectDecoder { statisticsManager.registerMessageReceived(); } Set deviceIds = new HashSet<>(); - if (decodedMessage != null) { - if (decodedMessage instanceof Position position) { - deviceIds.add(position.getDeviceId()); - } else if (decodedMessage instanceof Collection) { - Collection positions = (Collection) decodedMessage; - for (Position position : positions) { - deviceIds.add(position.getDeviceId()); + switch (decodedMessage) { + case Position position -> deviceIds.add(position.getDeviceId()); + case Collection positions -> { + for (Object position : positions) { + deviceIds.add(((Position) position).getDeviceId()); } } + case null, default -> { } } if (deviceIds.isEmpty()) { DeviceSession deviceSession = getDeviceSession(channel, remoteAddress); diff --git a/src/main/java/org/traccar/model/Calendar.java b/src/main/java/org/traccar/model/Calendar.java index 16f3b3243..f24e98373 100644 --- a/src/main/java/org/traccar/model/Calendar.java +++ b/src/main/java/org/traccar/model/Calendar.java @@ -93,33 +93,24 @@ public class Calendar extends ExtendedModel { } private static Temporal convertToMatchingTemporal(Instant instant, Temporal sample) { - if (sample instanceof LocalDate) { - return instant.atZone(ZoneOffset.UTC).toLocalDate(); - } else if (sample instanceof LocalDateTime) { - return instant.atZone(ZoneOffset.UTC).toLocalDateTime(); - } else if (sample instanceof ZonedDateTime zonedDateTime) { - return instant.atZone(zonedDateTime.getZone()); - } else if (sample instanceof OffsetDateTime offsetDateTime) { - return instant.atOffset(offsetDateTime.getOffset()); - } else { - return instant; - } + return switch (sample) { + case LocalDate ignored -> instant.atZone(ZoneOffset.UTC).toLocalDate(); + case LocalDateTime ignored -> instant.atZone(ZoneOffset.UTC).toLocalDateTime(); + case ZonedDateTime zonedDateTime -> instant.atZone(zonedDateTime.getZone()); + case OffsetDateTime offsetDateTime -> instant.atOffset(offsetDateTime.getOffset()); + default -> instant; + }; } private static Instant temporalToInstant(Temporal temporal) { - if (temporal instanceof ZonedDateTime zonedDateTime) { - return zonedDateTime.toInstant(); - } else if (temporal instanceof OffsetDateTime offsetDateTime) { - return offsetDateTime.toInstant(); - } else if (temporal instanceof LocalDateTime localDateTime) { - return localDateTime.toInstant(ZoneOffset.UTC); - } else if (temporal instanceof LocalDate localDate) { - return localDate.atStartOfDay(ZoneOffset.UTC).toInstant(); - } else if (temporal instanceof Instant instantValue) { - return instantValue; - } else { - throw new IllegalArgumentException("Unsupported Temporal type"); - } + return switch (temporal) { + case ZonedDateTime zonedDateTime -> zonedDateTime.toInstant(); + case OffsetDateTime offsetDateTime -> offsetDateTime.toInstant(); + case LocalDateTime localDateTime -> localDateTime.toInstant(ZoneOffset.UTC); + case LocalDate localDate -> localDate.atStartOfDay(ZoneOffset.UTC).toInstant(); + case Instant instantValue -> instantValue; + default -> throw new IllegalArgumentException("Unsupported Temporal type"); + }; } } diff --git a/src/main/java/org/traccar/protocol/FlespiProtocolDecoder.java b/src/main/java/org/traccar/protocol/FlespiProtocolDecoder.java index 798fc0ba3..63d33e852 100644 --- a/src/main/java/org/traccar/protocol/FlespiProtocolDecoder.java +++ b/src/main/java/org/traccar/protocol/FlespiProtocolDecoder.java @@ -288,17 +288,19 @@ public class FlespiProtocolDecoder extends BaseHttpProtocolDecoder { } private void decodeUnknownParam(String name, JsonValue value, Position position) { - if (value instanceof JsonNumber jsonNumber) { - if (jsonNumber.isIntegral()) { - position.set(name, jsonNumber.longValue()); - } else { + switch (value) { + case JsonNumber jsonNumber -> { + if (jsonNumber.isIntegral()) { + position.set(name, jsonNumber.longValue()); + } else { + position.set(name, jsonNumber.doubleValue()); + } position.set(name, jsonNumber.doubleValue()); } - position.set(name, jsonNumber.doubleValue()); - } else if (value instanceof JsonString jsonString) { - position.set(name, jsonString.getString()); - } else if (value == JsonValue.TRUE || value == JsonValue.FALSE) { - position.set(name, value == JsonValue.TRUE); + case JsonString jsonString -> position.set(name, jsonString.getString()); + case JsonValue v when v == JsonValue.TRUE || v == JsonValue.FALSE -> + position.set(name, v == JsonValue.TRUE); + default -> { } } } diff --git a/src/main/java/org/traccar/protocol/OutsafeProtocolDecoder.java b/src/main/java/org/traccar/protocol/OutsafeProtocolDecoder.java index 0a6026d91..0e6479da9 100644 --- a/src/main/java/org/traccar/protocol/OutsafeProtocolDecoder.java +++ b/src/main/java/org/traccar/protocol/OutsafeProtocolDecoder.java @@ -77,12 +77,12 @@ public class OutsafeProtocolDecoder extends BaseHttpProtocolDecoder { } private void decodeUnknownParam(String name, JsonValue value, Position position) { - if (value instanceof JsonNumber jsonNumber) { - position.set(name, jsonNumber.doubleValue()); - } else if (value instanceof JsonString jsonString) { - position.set(name, jsonString.getString()); - } else if (value == JsonValue.TRUE || value == JsonValue.FALSE) { - position.set(name, value == JsonValue.TRUE); + switch (value) { + case JsonNumber jsonNumber -> position.set(name, jsonNumber.doubleValue()); + case JsonString jsonString -> position.set(name, jsonString.getString()); + case JsonValue v when v == JsonValue.TRUE || v == JsonValue.FALSE -> + position.set(name, v == JsonValue.TRUE); + default -> { } } } diff --git a/src/main/java/org/traccar/session/cache/CacheManager.java b/src/main/java/org/traccar/session/cache/CacheManager.java index b3fd9d067..61d08ba3d 100644 --- a/src/main/java/org/traccar/session/cache/CacheManager.java +++ b/src/main/java/org/traccar/session/cache/CacheManager.java @@ -241,28 +241,32 @@ public class CacheManager implements BroadcastInterface { return; } - if (after instanceof GroupedModel afterGrouped) { - long beforeGroupId = ((GroupedModel) before).getGroupId(); - long afterGroupId = afterGrouped.getGroupId(); - if (beforeGroupId != afterGroupId) { - if (beforeGroupId > 0) { - invalidatePermission(clazz, id, Group.class, beforeGroupId, false); - } - if (afterGroupId > 0) { - invalidatePermission(clazz, id, Group.class, afterGroupId, true); + switch (after) { + case GroupedModel afterGrouped -> { + long beforeGroupId = ((GroupedModel) before).getGroupId(); + long afterGroupId = afterGrouped.getGroupId(); + if (beforeGroupId != afterGroupId) { + if (beforeGroupId > 0) { + invalidatePermission(clazz, id, Group.class, beforeGroupId, false); + } + if (afterGroupId > 0) { + invalidatePermission(clazz, id, Group.class, afterGroupId, true); + } } } - } else if (after instanceof Schedulable afterSchedulable) { - long beforeCalendarId = ((Schedulable) before).getCalendarId(); - long afterCalendarId = afterSchedulable.getCalendarId(); - if (beforeCalendarId != afterCalendarId) { - if (beforeCalendarId > 0) { - invalidatePermission(clazz, id, Calendar.class, beforeCalendarId, false); - } - if (afterCalendarId > 0) { - invalidatePermission(clazz, id, Calendar.class, afterCalendarId, true); + case Schedulable afterSchedulable -> { + long beforeCalendarId = ((Schedulable) before).getCalendarId(); + long afterCalendarId = afterSchedulable.getCalendarId(); + if (beforeCalendarId != afterCalendarId) { + if (beforeCalendarId > 0) { + invalidatePermission(clazz, id, Calendar.class, beforeCalendarId, false); + } + if (afterCalendarId > 0) { + invalidatePermission(clazz, id, Calendar.class, afterCalendarId, true); + } } } + default -> { } } graph.updateObject(after); diff --git a/src/main/java/org/traccar/storage/DatabaseStorage.java b/src/main/java/org/traccar/storage/DatabaseStorage.java index 4d0a392d8..b9b49c3b1 100644 --- a/src/main/java/org/traccar/storage/DatabaseStorage.java +++ b/src/main/java/org/traccar/storage/DatabaseStorage.java @@ -253,33 +253,39 @@ public class DatabaseStorage extends Storage { private List getConditionVariables(Condition genericCondition) { List results = new ArrayList<>(); - if (genericCondition instanceof Condition.Compare condition) { - results.add(condition.getValue()); - } else if (genericCondition instanceof Condition.Between condition) { - results.add(condition.getFromValue()); - results.add(condition.getToValue()); - } else if (genericCondition instanceof Condition.Binary condition) { - results.addAll(getConditionVariables(condition.getFirst())); - results.addAll(getConditionVariables(condition.getSecond())); - } else if (genericCondition instanceof Condition.Contains condition) { - String value = "%" + condition.getValue().toLowerCase(Locale.ROOT) + "%"; - results.addAll(Collections.nCopies(condition.getColumns().size(), value)); - } else if (genericCondition instanceof Condition.Permission condition) { - long conditionId = condition.getOwnerId() > 0 ? condition.getOwnerId() : condition.getPropertyId(); - results.add(conditionId); - if (condition.getIncludeGroups()) { - results.add(conditionId); + switch (genericCondition) { + case Condition.Compare condition -> results.add(condition.getValue()); + case Condition.Between condition -> { + results.add(condition.getFromValue()); + results.add(condition.getToValue()); } - } else if (genericCondition instanceof Condition.LatestPositions condition) { - if (condition.getDeviceId() > 0) { - results.add(condition.getDeviceId()); - results.add(condition.getDeviceId()); - } else { - long period = config.getLong(Keys.DATABASE_POSITION_PERIOD); - if (period > 0) { - results.add(new Date(System.currentTimeMillis() - period * 1000)); + case Condition.Binary condition -> { + results.addAll(getConditionVariables(condition.getFirst())); + results.addAll(getConditionVariables(condition.getSecond())); + } + case Condition.Contains condition -> { + String value = "%" + condition.getValue().toLowerCase(Locale.ROOT) + "%"; + results.addAll(Collections.nCopies(condition.getColumns().size(), value)); + } + case Condition.Permission condition -> { + long conditionId = condition.getOwnerId() > 0 ? condition.getOwnerId() : condition.getPropertyId(); + results.add(conditionId); + if (condition.getIncludeGroups()) { + results.add(conditionId); } } + case Condition.LatestPositions condition -> { + if (condition.getDeviceId() > 0) { + results.add(condition.getDeviceId()); + results.add(condition.getDeviceId()); + } else { + long period = config.getLong(Keys.DATABASE_POSITION_PERIOD); + if (period > 0) { + results.add(new Date(System.currentTimeMillis() - period * 1000)); + } + } + } + default -> { } } return results; } diff --git a/src/main/java/org/traccar/storage/MemoryStorage.java b/src/main/java/org/traccar/storage/MemoryStorage.java index dba9ee421..2464a053d 100644 --- a/src/main/java/org/traccar/storage/MemoryStorage.java +++ b/src/main/java/org/traccar/storage/MemoryStorage.java @@ -65,55 +65,46 @@ public class MemoryStorage extends Storage { if (genericCondition == null) { return true; } - - if (genericCondition instanceof Condition.Compare condition) { - - Object value = retrieveValue(object, condition.getColumn()); - int result = ((Comparable) value).compareTo(condition.getValue()); - return switch (condition.getOperator()) { - case "<" -> result < 0; - case "<=" -> result <= 0; - case ">" -> result > 0; - case ">=" -> result >= 0; - case "=" -> result == 0; - default -> throw new RuntimeException("Unsupported comparison condition"); - }; - - } else if (genericCondition instanceof Condition.Between condition) { - - Object fromValue = retrieveValue(object, condition.getColumn()); - int fromResult = ((Comparable) fromValue).compareTo(condition.getFromValue()); - Object toValue = retrieveValue(object, condition.getColumn()); - int toResult = ((Comparable) toValue).compareTo(condition.getToValue()); - return fromResult >= 0 && toResult <= 0; - - } else if (genericCondition instanceof Condition.Binary condition) { - - if (condition.getOperator().equals("AND")) { - return checkCondition(condition.getFirst(), object) && checkCondition(condition.getSecond(), object); - } else if (condition.getOperator().equals("OR")) { - return checkCondition(condition.getFirst(), object) || checkCondition(condition.getSecond(), object); + return switch (genericCondition) { + case Condition.Compare condition -> { + Object value = retrieveValue(object, condition.getColumn()); + int result = ((Comparable) value).compareTo(condition.getValue()); + yield switch (condition.getOperator()) { + case "<" -> result < 0; + case "<=" -> result <= 0; + case ">" -> result > 0; + case ">=" -> result >= 0; + case "=" -> result == 0; + default -> throw new RuntimeException("Unsupported comparison condition"); + }; } - - } else if (genericCondition instanceof Condition.Permission condition) { - - long id = (Long) retrieveValue(object, "id"); - return getPermissionsSet(condition.getOwnerClass(), condition.getPropertyClass()).stream() - .anyMatch(pair -> { - if (condition.getOwnerId() > 0) { - return pair.first() == condition.getOwnerId() && pair.second() == id; - } else { - return pair.first() == id && pair.second() == condition.getPropertyId(); - } - }); - - } else if (genericCondition instanceof Condition.LatestPositions) { - - return false; - - } - - return false; + case Condition.Between condition -> { + Object fromValue = retrieveValue(object, condition.getColumn()); + int fromResult = ((Comparable) fromValue).compareTo(condition.getFromValue()); + Object toValue = retrieveValue(object, condition.getColumn()); + int toResult = ((Comparable) toValue).compareTo(condition.getToValue()); + yield fromResult >= 0 && toResult <= 0; + } + case Condition.Binary condition -> switch (condition.getOperator()) { + case "AND" -> checkCondition(condition.getFirst(), object) + && checkCondition(condition.getSecond(), object); + case "OR" -> checkCondition(condition.getFirst(), object) + || checkCondition(condition.getSecond(), object); + default -> false; + }; + case Condition.Permission condition -> { + long id = (Long) retrieveValue(object, "id"); + yield getPermissionsSet(condition.getOwnerClass(), condition.getPropertyClass()).stream() + .anyMatch(pair -> { + if (condition.getOwnerId() > 0) { + return pair.first() == condition.getOwnerId() && pair.second() == id; + } else { + return pair.first() == id && pair.second() == condition.getPropertyId(); + } + }); + } + default -> false; + }; } private Object retrieveValue(Object object, String key) { diff --git a/src/main/java/org/traccar/storage/QueryBuilder.java b/src/main/java/org/traccar/storage/QueryBuilder.java index e663692b5..78c1feb1d 100644 --- a/src/main/java/org/traccar/storage/QueryBuilder.java +++ b/src/main/java/org/traccar/storage/QueryBuilder.java @@ -139,18 +139,14 @@ public final class QueryBuilder implements AutoCloseable { } public void setValue(int index, Object value) throws SQLException { - if (value instanceof Boolean booleanValue) { - setBoolean(index, booleanValue); - } else if (value instanceof Integer integerValue) { - setInteger(index, integerValue); - } else if (value instanceof Long longValue) { - setLong(index, longValue); - } else if (value instanceof Double doubleValue) { - setDouble(index, doubleValue); - } else if (value instanceof String stringValue) { - setString(index, stringValue); - } else if (value instanceof Date dateValue) { - setDate(index, dateValue); + switch (value) { + case Boolean booleanValue -> setBoolean(index, booleanValue); + case Integer integerValue -> setInteger(index, integerValue); + case Long longValue -> setLong(index, longValue); + case Double doubleValue -> setDouble(index, doubleValue); + case String stringValue -> setString(index, stringValue); + case Date dateValue -> setDate(index, dateValue); + default -> { } } }