From 792836f3a0541b68fef26e95eae10c35fd34789e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20J=C3=A4ckle?= Date: Wed, 14 Feb 2024 16:17:17 +0100 Subject: [PATCH] fix time:now placeholder truncation * an exception was thrown regarding special regex char "[" used in "split" * also fixed that fallback DittoJsonException for unknown exceptions could not be deserialized --- .../base/model/signals/GlobalErrorRegistry.java | 16 ++++++++++++---- .../placeholders/ImmutableTimePlaceholder.java | 15 +++++++++++---- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/base/model/src/main/java/org/eclipse/ditto/base/model/signals/GlobalErrorRegistry.java b/base/model/src/main/java/org/eclipse/ditto/base/model/signals/GlobalErrorRegistry.java index 124d87fdfd..0a79be055d 100644 --- a/base/model/src/main/java/org/eclipse/ditto/base/model/signals/GlobalErrorRegistry.java +++ b/base/model/src/main/java/org/eclipse/ditto/base/model/signals/GlobalErrorRegistry.java @@ -18,16 +18,17 @@ import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; +import org.eclipse.ditto.base.model.exceptions.DittoJsonException; +import org.eclipse.ditto.base.model.exceptions.DittoRuntimeException; +import org.eclipse.ditto.base.model.headers.DittoHeaders; +import org.eclipse.ditto.base.model.json.JsonParsableException; import org.eclipse.ditto.json.JsonFieldSelectorInvalidException; import org.eclipse.ditto.json.JsonKeyInvalidException; import org.eclipse.ditto.json.JsonMissingFieldException; import org.eclipse.ditto.json.JsonObject; import org.eclipse.ditto.json.JsonParseException; import org.eclipse.ditto.json.JsonPointerInvalidException; -import org.eclipse.ditto.base.model.exceptions.DittoJsonException; -import org.eclipse.ditto.base.model.exceptions.DittoRuntimeException; -import org.eclipse.ditto.base.model.headers.DittoHeaders; -import org.eclipse.ditto.base.model.json.JsonParsableException; +import org.eclipse.ditto.json.JsonRuntimeException; /** * Contains all strategies to deserialize subclasses of {@link org.eclipse.ditto.base.model.exceptions.DittoRuntimeException} from a combination of @@ -103,6 +104,13 @@ private static final class DittoJsonExceptionRegistry { private final Map> dittoJsonParseRegistries = new HashMap<>(); private DittoJsonExceptionRegistry() { + dittoJsonParseRegistries.put(DittoJsonException.FALLBACK_ERROR_CODE, + (jsonObject, dittoHeaders) -> new DittoJsonException( + JsonRuntimeException.newBuilder(DittoJsonException.FALLBACK_ERROR_CODE) + .message(getMessage(jsonObject)) + .description(getDescription(jsonObject)) + .build(), dittoHeaders)); + dittoJsonParseRegistries.put(JsonParseException.ERROR_CODE, (jsonObject, dittoHeaders) -> new DittoJsonException( JsonParseException.newBuilder() diff --git a/placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutableTimePlaceholder.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutableTimePlaceholder.java index 7d35c05042..b856efc9e6 100644 --- a/placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutableTimePlaceholder.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutableTimePlaceholder.java @@ -118,10 +118,9 @@ private boolean isValidTimeRange(final String timeRangeSuffix) { final String durationWithTruncate = timeRangeSuffix.substring(1); final String durationString; if (durationWithTruncate.contains(TRUNCATE_START) && durationWithTruncate.contains(TRUNCATE_END)) { - final String[] durationStringAndTruncateString = durationWithTruncate.split(TRUNCATE_START, 2); - durationString = durationStringAndTruncateString[0]; - final String truncateString = durationStringAndTruncateString[1]; - if (!isValidTruncateStatement(truncateString.substring(0, truncateString.lastIndexOf(TRUNCATE_END)))) { + durationString = durationWithTruncate + .substring(0, durationWithTruncate.indexOf(TRUNCATE_START)); + if (!isValidTruncation(durationWithTruncate)) { return false; } } else { @@ -133,11 +132,19 @@ private boolean isValidTimeRange(final String timeRangeSuffix) { } catch (final Exception e) { return false; } + } else if (timeRangeSuffix.contains(TRUNCATE_START) && timeRangeSuffix.contains(TRUNCATE_END)) { + return isValidTruncation(timeRangeSuffix); } else { return false; } } + private boolean isValidTruncation(final String durationWithTruncate) { + final String truncateString = durationWithTruncate + .substring(durationWithTruncate.indexOf(TRUNCATE_START) + 1); + return isValidTruncateStatement(truncateString.substring(0, truncateString.lastIndexOf(TRUNCATE_END))); + } + private boolean isValidTruncateStatement(final String truncateString) { return DittoDuration.DittoTimeUnit.forSuffix(truncateString).isPresent(); }