diff --git a/bom/pom.xml b/bom/pom.xml index 172d0a8c8e..52d67ef84b 100755 --- a/bom/pom.xml +++ b/bom/pom.xml @@ -481,7 +481,7 @@ org.eclipse.ditto - ditto-internal-models-placeholders + ditto-placeholders ${project.version} diff --git a/concierge/service/src/main/java/org/eclipse/ditto/concierge/service/enforcement/placeholders/HeaderBasedPlaceholderSubstitutionAlgorithm.java b/concierge/service/src/main/java/org/eclipse/ditto/concierge/service/enforcement/placeholders/HeaderBasedPlaceholderSubstitutionAlgorithm.java index 42d490e4c5..6fa44fa085 100644 --- a/concierge/service/src/main/java/org/eclipse/ditto/concierge/service/enforcement/placeholders/HeaderBasedPlaceholderSubstitutionAlgorithm.java +++ b/concierge/service/src/main/java/org/eclipse/ditto/concierge/service/enforcement/placeholders/HeaderBasedPlaceholderSubstitutionAlgorithm.java @@ -26,9 +26,9 @@ import org.eclipse.ditto.base.model.headers.DittoHeaders; import org.eclipse.ditto.base.model.headers.WithDittoHeaders; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; -import org.eclipse.ditto.internal.models.placeholders.PipelineElement; import org.eclipse.ditto.base.model.signals.commands.exceptions.GatewayPlaceholderNotResolvableException; +import org.eclipse.ditto.placeholders.ExpressionResolver; +import org.eclipse.ditto.placeholders.PipelineElement; /** * An algorithm for placeholder substitution based on {@link DittoHeaders}. diff --git a/concierge/service/src/test/java/org/eclipse/ditto/concierge/service/starter/ConciergeServiceGlobalErrorRegistryTest.java b/concierge/service/src/test/java/org/eclipse/ditto/concierge/service/starter/ConciergeServiceGlobalErrorRegistryTest.java index cec9f4a8b3..814883fed6 100644 --- a/concierge/service/src/test/java/org/eclipse/ditto/concierge/service/starter/ConciergeServiceGlobalErrorRegistryTest.java +++ b/concierge/service/src/test/java/org/eclipse/ditto/concierge/service/starter/ConciergeServiceGlobalErrorRegistryTest.java @@ -26,9 +26,9 @@ import org.eclipse.ditto.base.model.signals.commands.exceptions.PathUnknownException; import org.eclipse.ditto.connectivity.model.ConnectionConfigurationInvalidException; import org.eclipse.ditto.connectivity.model.signals.commands.exceptions.ConnectionConflictException; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFunctionSignatureInvalidException; import org.eclipse.ditto.internal.utils.test.GlobalErrorRegistryTestCases; import org.eclipse.ditto.messages.model.AuthorizationSubjectBlockedException; +import org.eclipse.ditto.placeholders.PlaceholderFunctionSignatureInvalidException; import org.eclipse.ditto.policies.model.PolicyEntryInvalidException; import org.eclipse.ditto.policies.model.PolicyIdInvalidException; import org.eclipse.ditto.policies.model.signals.commands.exceptions.PolicyConflictException; diff --git a/connectivity/api/pom.xml b/connectivity/api/pom.xml index a8287667b9..0e6bade608 100644 --- a/connectivity/api/pom.xml +++ b/connectivity/api/pom.xml @@ -35,7 +35,7 @@ org.eclipse.ditto - ditto-internal-models-placeholders + ditto-placeholders org.eclipse.ditto diff --git a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/EnforcementFactoryFactory.java b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/EnforcementFactoryFactory.java index 5f71f6f48a..5b81c1bbd4 100644 --- a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/EnforcementFactoryFactory.java +++ b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/EnforcementFactoryFactory.java @@ -16,11 +16,11 @@ import java.util.List; import org.eclipse.ditto.base.model.entity.id.EntityId; +import org.eclipse.ditto.base.model.signals.Signal; +import org.eclipse.ditto.connectivity.api.placeholders.ConnectivityPlaceholders; import org.eclipse.ditto.connectivity.model.Enforcement; import org.eclipse.ditto.connectivity.model.EnforcementFilterFactory; -import org.eclipse.ditto.connectivity.api.placeholders.ConnectivityPlaceholders; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; -import org.eclipse.ditto.base.model.signals.Signal; +import org.eclipse.ditto.placeholders.Placeholder; /** * Factory class that creates instances of {@link EnforcementFilterFactory}s. diff --git a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/SignalEnforcementFilter.java b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/SignalEnforcementFilter.java index 0b519f3489..46c129e2bc 100644 --- a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/SignalEnforcementFilter.java +++ b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/SignalEnforcementFilter.java @@ -24,13 +24,13 @@ import org.eclipse.ditto.base.model.entity.id.EntityId; import org.eclipse.ditto.base.model.entity.id.WithEntityId; import org.eclipse.ditto.base.model.headers.DittoHeaders; +import org.eclipse.ditto.base.model.signals.Signal; import org.eclipse.ditto.connectivity.model.ConnectionSignalIdEnforcementFailedException; import org.eclipse.ditto.connectivity.model.Enforcement; import org.eclipse.ditto.connectivity.model.EnforcementFilter; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFilter; -import org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException; -import org.eclipse.ditto.base.model.signals.Signal; +import org.eclipse.ditto.placeholders.Placeholder; +import org.eclipse.ditto.placeholders.PlaceholderFilter; +import org.eclipse.ditto.placeholders.UnresolvedPlaceholderException; /** * Implementation of an {@link EnforcementFilter} which is applicable to signals. diff --git a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/SignalEnforcementFilterFactory.java b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/SignalEnforcementFilterFactory.java index f1f7e62867..a3c92549f2 100644 --- a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/SignalEnforcementFilterFactory.java +++ b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/SignalEnforcementFilterFactory.java @@ -17,13 +17,13 @@ import javax.annotation.concurrent.Immutable; import org.eclipse.ditto.base.model.entity.id.EntityId; +import org.eclipse.ditto.base.model.signals.Signal; import org.eclipse.ditto.connectivity.model.Enforcement; import org.eclipse.ditto.connectivity.model.EnforcementFilter; import org.eclipse.ditto.connectivity.model.EnforcementFilterFactory; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFilter; -import org.eclipse.ditto.base.model.signals.Signal; +import org.eclipse.ditto.placeholders.Placeholder; +import org.eclipse.ditto.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.PlaceholderFilter; /** * Factory that creates instances of EnforcementFilterFactory. diff --git a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/ConnectionIdPlaceholder.java b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/ConnectionIdPlaceholder.java index 7df921949f..bf79ce7d44 100644 --- a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/ConnectionIdPlaceholder.java +++ b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/ConnectionIdPlaceholder.java @@ -13,10 +13,10 @@ package org.eclipse.ditto.connectivity.api.placeholders; import org.eclipse.ditto.connectivity.model.ConnectionId; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; +import org.eclipse.ditto.placeholders.Placeholder; /** - * A {@link org.eclipse.ditto.internal.models.placeholders.Placeholder} that requires a {@code String} + * A {@link org.eclipse.ditto.placeholders.Placeholder} that requires a {@code String} * (a valid Connection ID) to resolve its placeholders. * * @since 1.4.0 diff --git a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/ConnectivityPlaceholders.java b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/ConnectivityPlaceholders.java index f12901e1e2..8dc28de94a 100644 --- a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/ConnectivityPlaceholders.java +++ b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/ConnectivityPlaceholders.java @@ -13,7 +13,8 @@ package org.eclipse.ditto.connectivity.api.placeholders; import org.eclipse.ditto.base.model.auth.AuthorizationContext; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; +import org.eclipse.ditto.placeholders.Placeholder; +import org.eclipse.ditto.protocol.placeholders.TopicPathPlaceholder; public final class ConnectivityPlaceholders { @@ -60,7 +61,7 @@ public static Placeholder newRequestPlaceholder() { * @return the singleton instance of {@link TopicPathPlaceholder} */ public static TopicPathPlaceholder newTopicPathPlaceholder() { - return ImmutableTopicPathPlaceholder.INSTANCE; + return TopicPathPlaceholder.getInstance(); } /** diff --git a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/EntityIdPlaceholder.java b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/EntityIdPlaceholder.java index 0c659cc693..31c8380259 100644 --- a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/EntityIdPlaceholder.java +++ b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/EntityIdPlaceholder.java @@ -13,10 +13,10 @@ package org.eclipse.ditto.connectivity.api.placeholders; import org.eclipse.ditto.base.model.entity.id.EntityId; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; +import org.eclipse.ditto.placeholders.Placeholder; /** - * A {@link org.eclipse.ditto.internal.models.placeholders.Placeholder} that requires a {@code String} + * A {@link org.eclipse.ditto.placeholders.Placeholder} that requires a {@code String} * (a valid Entity ID) to resolve its placeholders. */ public interface EntityIdPlaceholder extends Placeholder { diff --git a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/FeaturePlaceholder.java b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/FeaturePlaceholder.java index 1c68f3066f..b5aa06a777 100644 --- a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/FeaturePlaceholder.java +++ b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/FeaturePlaceholder.java @@ -12,12 +12,12 @@ */ package org.eclipse.ditto.connectivity.api.placeholders; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; +import org.eclipse.ditto.placeholders.Placeholder; /** - * A {@link org.eclipse.ditto.internal.models.placeholders.Placeholder} that requires a {@code String} + * A {@link org.eclipse.ditto.placeholders.Placeholder} that requires a {@code String} * (a valid Feature ID) to resolve its placeholders. - * A {@link org.eclipse.ditto.internal.models.placeholders.Placeholder} that requires a {@code String} (a valid Feature ID) to resolve its placeholders. + * A {@link org.eclipse.ditto.placeholders.Placeholder} that requires a {@code String} (a valid Feature ID) to resolve its placeholders. * * @since 1.5.0 */ diff --git a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/ImmutableRequestPlaceholder.java b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/ImmutableRequestPlaceholder.java index 627fd48ab2..c6db60e01b 100644 --- a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/ImmutableRequestPlaceholder.java +++ b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/ImmutableRequestPlaceholder.java @@ -21,7 +21,7 @@ import org.eclipse.ditto.base.model.auth.AuthorizationContext; import org.eclipse.ditto.base.model.auth.AuthorizationSubject; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; +import org.eclipse.ditto.placeholders.Placeholder; /** * Placeholder implementation that replaces {@code request} related things based on an {@link AuthorizationContext}. diff --git a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/PolicyPlaceholder.java b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/PolicyPlaceholder.java index 0742d55672..e45ace4f43 100644 --- a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/PolicyPlaceholder.java +++ b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/PolicyPlaceholder.java @@ -13,10 +13,10 @@ package org.eclipse.ditto.connectivity.api.placeholders; import org.eclipse.ditto.base.model.entity.id.EntityId; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; +import org.eclipse.ditto.placeholders.Placeholder; /** - * A {@link org.eclipse.ditto.internal.models.placeholders.Placeholder} that requires a {@code String} + * A {@link org.eclipse.ditto.placeholders.Placeholder} that requires a {@code String} * (a valid Policy ID) to resolve its placeholders. */ public interface PolicyPlaceholder extends Placeholder { diff --git a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/SourceAddressPlaceholder.java b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/SourceAddressPlaceholder.java index 7be3c40548..fa366e6918 100644 --- a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/SourceAddressPlaceholder.java +++ b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/SourceAddressPlaceholder.java @@ -13,10 +13,10 @@ package org.eclipse.ditto.connectivity.api.placeholders; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; +import org.eclipse.ditto.placeholders.Placeholder; /** - * A {@link org.eclipse.ditto.internal.models.placeholders.Placeholder} that requires a {@code String} + * A {@link org.eclipse.ditto.placeholders.Placeholder} that requires a {@code String} * (a {@link org.eclipse.ditto.connectivity.model.Source} {@code address}) to resolve its placeholders. */ public interface SourceAddressPlaceholder extends Placeholder { diff --git a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/ThingPlaceholder.java b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/ThingPlaceholder.java index 06b74decb3..98826aa73c 100644 --- a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/ThingPlaceholder.java +++ b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/ThingPlaceholder.java @@ -13,10 +13,10 @@ package org.eclipse.ditto.connectivity.api.placeholders; import org.eclipse.ditto.base.model.entity.id.EntityId; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; +import org.eclipse.ditto.placeholders.Placeholder; /** - * A {@link org.eclipse.ditto.internal.models.placeholders.Placeholder} that requires a {@code String} + * A {@link org.eclipse.ditto.placeholders.Placeholder} that requires a {@code String} * (a valid Thing ID) to resolve its placeholders. */ public interface ThingPlaceholder extends Placeholder { diff --git a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/TopicPathPlaceholder.java b/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/TopicPathPlaceholder.java deleted file mode 100644 index d663b3a3f1..0000000000 --- a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/TopicPathPlaceholder.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2017 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0 - * - * SPDX-License-Identifier: EPL-2.0 - */ -package org.eclipse.ditto.connectivity.api.placeholders; - -import org.eclipse.ditto.protocol.TopicPath; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; - -/** - * A {@link org.eclipse.ditto.internal.models.placeholders.Placeholder} that requires the {@link TopicPath} - * to resolve its placeholders. - */ -public interface TopicPathPlaceholder extends Placeholder { - -} diff --git a/connectivity/api/src/test/java/org/eclipse/ditto/connectivity/api/SignalEnforcementFilterTest.java b/connectivity/api/src/test/java/org/eclipse/ditto/connectivity/api/SignalEnforcementFilterTest.java index 7cf705fb1a..c6d5548d4e 100644 --- a/connectivity/api/src/test/java/org/eclipse/ditto/connectivity/api/SignalEnforcementFilterTest.java +++ b/connectivity/api/src/test/java/org/eclipse/ditto/connectivity/api/SignalEnforcementFilterTest.java @@ -22,19 +22,19 @@ import org.eclipse.ditto.base.model.entity.id.AbstractNamespacedEntityId; import org.eclipse.ditto.base.model.entity.id.NamespacedEntityId; import org.eclipse.ditto.base.model.headers.DittoHeaders; +import org.eclipse.ditto.base.model.signals.Signal; +import org.eclipse.ditto.base.model.signals.SignalWithEntityId; import org.eclipse.ditto.connectivity.model.ConnectionSignalIdEnforcementFailedException; import org.eclipse.ditto.connectivity.model.ConnectivityModelFactory; import org.eclipse.ditto.connectivity.model.Enforcement; import org.eclipse.ditto.connectivity.model.EnforcementFilter; import org.eclipse.ditto.connectivity.model.EnforcementFilterFactory; +import org.eclipse.ditto.placeholders.Placeholder; +import org.eclipse.ditto.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.UnresolvedPlaceholderException; import org.eclipse.ditto.policies.model.PolicyId; import org.eclipse.ditto.things.model.ThingConstants; import org.eclipse.ditto.things.model.ThingId; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; -import org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException; -import org.eclipse.ditto.base.model.signals.Signal; -import org.eclipse.ditto.base.model.signals.SignalWithEntityId; import org.junit.Test; import org.mutabilitydetector.unittesting.AllowedReason; import org.mutabilitydetector.unittesting.MutabilityAssert; diff --git a/connectivity/api/src/test/java/org/eclipse/ditto/connectivity/api/SimplePlaceholder.java b/connectivity/api/src/test/java/org/eclipse/ditto/connectivity/api/SimplePlaceholder.java index ab48b9d98e..ece4941eb1 100644 --- a/connectivity/api/src/test/java/org/eclipse/ditto/connectivity/api/SimplePlaceholder.java +++ b/connectivity/api/src/test/java/org/eclipse/ditto/connectivity/api/SimplePlaceholder.java @@ -16,7 +16,7 @@ import java.util.List; import java.util.Optional; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; +import org.eclipse.ditto.placeholders.Placeholder; /** * Simple placeholder for test purposes. diff --git a/connectivity/api/src/test/java/org/eclipse/ditto/connectivity/api/placeholders/ConnectionIdPlaceholderTest.java b/connectivity/api/src/test/java/org/eclipse/ditto/connectivity/api/placeholders/ConnectionIdPlaceholderTest.java index 3665c9d3c4..88efab0a68 100644 --- a/connectivity/api/src/test/java/org/eclipse/ditto/connectivity/api/placeholders/ConnectionIdPlaceholderTest.java +++ b/connectivity/api/src/test/java/org/eclipse/ditto/connectivity/api/placeholders/ConnectionIdPlaceholderTest.java @@ -17,9 +17,9 @@ import java.util.Collections; import org.eclipse.ditto.connectivity.model.ConnectionId; - import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; - import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; - import org.eclipse.ditto.internal.models.placeholders.PlaceholderResolver; + import org.eclipse.ditto.placeholders.ExpressionResolver; + import org.eclipse.ditto.placeholders.PlaceholderFactory; + import org.eclipse.ditto.placeholders.PlaceholderResolver; import org.junit.Test; public final class ConnectionIdPlaceholderTest { diff --git a/connectivity/api/src/test/java/org/eclipse/ditto/connectivity/api/placeholders/TopicPlaceholderTest.java b/connectivity/api/src/test/java/org/eclipse/ditto/connectivity/api/placeholders/TopicPlaceholderTest.java index 34ea0f791f..a27378f8a2 100644 --- a/connectivity/api/src/test/java/org/eclipse/ditto/connectivity/api/placeholders/TopicPlaceholderTest.java +++ b/connectivity/api/src/test/java/org/eclipse/ditto/connectivity/api/placeholders/TopicPlaceholderTest.java @@ -17,14 +17,15 @@ import java.util.Collections; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFilter; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderResolver; -import org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException; -import org.eclipse.ditto.things.model.ThingId; +import org.eclipse.ditto.placeholders.ExpressionResolver; +import org.eclipse.ditto.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.PlaceholderFilter; +import org.eclipse.ditto.placeholders.PlaceholderResolver; +import org.eclipse.ditto.placeholders.UnresolvedPlaceholderException; import org.eclipse.ditto.protocol.ProtocolFactory; import org.eclipse.ditto.protocol.TopicPath; +import org.eclipse.ditto.protocol.placeholders.TopicPathPlaceholder; +import org.eclipse.ditto.things.model.ThingId; import org.junit.Test; public final class TopicPlaceholderTest { diff --git a/connectivity/service/pom.xml b/connectivity/service/pom.xml index 34b5c7d2fd..0dc409dec8 100644 --- a/connectivity/service/pom.xml +++ b/connectivity/service/pom.xml @@ -46,18 +46,18 @@ org.eclipse.ditto ditto-base-service - org.eclipse.ditto - ditto-internal-models-acks + ditto-placeholders + org.eclipse.ditto - ditto-internal-models-signalenrichment + ditto-internal-models-acks org.eclipse.ditto - ditto-internal-models-placeholders + ditto-internal-models-signalenrichment org.eclipse.ditto diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/mapping/ConnectionStatusMessageMapper.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/mapping/ConnectionStatusMessageMapper.java index 9bfad243d8..ee33fc9329 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/mapping/ConnectionStatusMessageMapper.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/mapping/ConnectionStatusMessageMapper.java @@ -20,29 +20,29 @@ import javax.annotation.Nullable; -import org.eclipse.ditto.connectivity.service.config.mapping.MappingConfig; -import org.eclipse.ditto.json.JsonFactory; -import org.eclipse.ditto.json.JsonPointer; -import org.eclipse.ditto.json.JsonValue; import org.eclipse.ditto.base.model.common.Placeholders; import org.eclipse.ditto.base.model.headers.DittoHeaders; import org.eclipse.ditto.base.model.headers.WithDittoHeaders; +import org.eclipse.ditto.connectivity.api.ExternalMessage; import org.eclipse.ditto.connectivity.model.MessageMapperConfigurationInvalidException; import org.eclipse.ditto.connectivity.model.MessageMappingFailedException; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; -import org.eclipse.ditto.internal.models.placeholders.HeadersPlaceholder; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFilter; +import org.eclipse.ditto.connectivity.service.config.mapping.MappingConfig; +import org.eclipse.ditto.internal.utils.akka.logging.DittoLogger; +import org.eclipse.ditto.internal.utils.akka.logging.DittoLoggerFactory; +import org.eclipse.ditto.json.JsonFactory; +import org.eclipse.ditto.json.JsonPointer; +import org.eclipse.ditto.json.JsonValue; +import org.eclipse.ditto.placeholders.ExpressionResolver; +import org.eclipse.ditto.placeholders.HeadersPlaceholder; +import org.eclipse.ditto.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.PlaceholderFilter; +import org.eclipse.ditto.protocol.Adaptable; +import org.eclipse.ditto.protocol.adapter.DittoProtocolAdapter; import org.eclipse.ditto.things.model.Feature; import org.eclipse.ditto.things.model.FeatureDefinition; import org.eclipse.ditto.things.model.FeatureProperties; import org.eclipse.ditto.things.model.ThingId; import org.eclipse.ditto.things.model.ThingIdInvalidException; -import org.eclipse.ditto.protocol.Adaptable; -import org.eclipse.ditto.protocol.adapter.DittoProtocolAdapter; -import org.eclipse.ditto.connectivity.api.ExternalMessage; -import org.eclipse.ditto.internal.utils.akka.logging.DittoLogger; -import org.eclipse.ditto.internal.utils.akka.logging.DittoLoggerFactory; import org.eclipse.ditto.things.model.signals.commands.modify.ModifyFeature; import org.eclipse.ditto.things.model.signals.commands.modify.ModifyFeatureProperty; diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/mapping/ImplicitThingCreationMessageMapper.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/mapping/ImplicitThingCreationMessageMapper.java index b7fd057564..8526cae767 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/mapping/ImplicitThingCreationMessageMapper.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/mapping/ImplicitThingCreationMessageMapper.java @@ -32,16 +32,16 @@ import org.eclipse.ditto.connectivity.api.ExternalMessage; import org.eclipse.ditto.connectivity.model.MessageMapperConfigurationInvalidException; import org.eclipse.ditto.connectivity.service.config.mapping.MappingConfig; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; -import org.eclipse.ditto.internal.models.placeholders.HeadersPlaceholder; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFilter; import org.eclipse.ditto.internal.utils.akka.logging.DittoLogger; import org.eclipse.ditto.internal.utils.akka.logging.DittoLoggerFactory; import org.eclipse.ditto.json.JsonFactory; import org.eclipse.ditto.json.JsonField; import org.eclipse.ditto.json.JsonObject; import org.eclipse.ditto.json.JsonValue; +import org.eclipse.ditto.placeholders.ExpressionResolver; +import org.eclipse.ditto.placeholders.HeadersPlaceholder; +import org.eclipse.ditto.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.PlaceholderFilter; import org.eclipse.ditto.policies.model.Policy; import org.eclipse.ditto.policies.model.PolicyId; import org.eclipse.ditto.protocol.Adaptable; diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/mapping/RawMessageMapper.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/mapping/RawMessageMapper.java index 7290f5340c..317e263900 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/mapping/RawMessageMapper.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/mapping/RawMessageMapper.java @@ -32,8 +32,6 @@ import org.eclipse.ditto.connectivity.model.ConnectivityModelFactory; import org.eclipse.ditto.connectivity.model.MappingContext; import org.eclipse.ditto.connectivity.service.config.mapping.MappingConfig; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; import org.eclipse.ditto.json.JsonArray; import org.eclipse.ditto.json.JsonCollectors; import org.eclipse.ditto.json.JsonFactory; @@ -48,6 +46,8 @@ import org.eclipse.ditto.messages.model.MessageHeaders; import org.eclipse.ditto.messages.model.MessagesModelFactory; import org.eclipse.ditto.messages.model.signals.commands.MessageDeserializer; +import org.eclipse.ditto.placeholders.ExpressionResolver; +import org.eclipse.ditto.placeholders.PlaceholderFactory; import org.eclipse.ditto.protocol.Adaptable; import org.eclipse.ditto.protocol.MessagePath; import org.eclipse.ditto.protocol.Payload; diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/AbstractMappingProcessor.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/AbstractMappingProcessor.java index f9d8e8e992..790f567be4 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/AbstractMappingProcessor.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/AbstractMappingProcessor.java @@ -23,6 +23,7 @@ import javax.annotation.Nullable; import org.eclipse.ditto.base.model.headers.DittoHeaders; +import org.eclipse.ditto.connectivity.api.placeholders.ConnectivityPlaceholders; import org.eclipse.ditto.connectivity.model.ConnectionId; import org.eclipse.ditto.connectivity.model.ConnectionType; import org.eclipse.ditto.connectivity.model.MessageMappingFailedException; @@ -30,11 +31,10 @@ import org.eclipse.ditto.connectivity.service.mapping.MessageMapper; import org.eclipse.ditto.connectivity.service.mapping.MessageMapperRegistry; import org.eclipse.ditto.connectivity.service.messaging.mappingoutcome.MappingOutcome; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFilter; -import org.eclipse.ditto.connectivity.api.placeholders.ConnectivityPlaceholders; import org.eclipse.ditto.internal.utils.akka.logging.ThreadSafeDittoLoggingAdapter; +import org.eclipse.ditto.placeholders.ExpressionResolver; +import org.eclipse.ditto.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.PlaceholderFilter; /** * Abstract implementation for mapping one type to another. diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/BasePublisherActor.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/BasePublisherActor.java index 2f995de9b8..9da7044296 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/BasePublisherActor.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/BasePublisherActor.java @@ -71,15 +71,15 @@ import org.eclipse.ditto.connectivity.service.messaging.monitoring.logs.ConnectionLogger; import org.eclipse.ditto.connectivity.service.messaging.validation.ConnectionValidator; import org.eclipse.ditto.connectivity.service.util.ConnectivityMdcEntryKey; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; import org.eclipse.ditto.internal.utils.akka.logging.DittoLoggerFactory; import org.eclipse.ditto.internal.utils.akka.logging.ThreadSafeDittoLoggingAdapter; import org.eclipse.ditto.internal.utils.config.DefaultScopedConfig; +import org.eclipse.ditto.internal.utils.config.InstanceIdentifierSupplier; import org.eclipse.ditto.internal.utils.tracing.DittoTracing; import org.eclipse.ditto.internal.utils.tracing.instruments.trace.StartedTrace; -import org.eclipse.ditto.internal.utils.config.InstanceIdentifierSupplier; import org.eclipse.ditto.messages.model.signals.commands.MessageCommand; +import org.eclipse.ditto.placeholders.ExpressionResolver; +import org.eclipse.ditto.placeholders.PlaceholderFactory; import org.eclipse.ditto.protocol.adapter.ProtocolAdapter; import org.eclipse.ditto.things.model.signals.commands.ThingCommand; import org.eclipse.ditto.thingsearch.model.signals.events.SubscriptionEvent; diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/InboundDispatchingSink.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/InboundDispatchingSink.java index 2e2317275f..d8c0857f8a 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/InboundDispatchingSink.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/InboundDispatchingSink.java @@ -68,14 +68,14 @@ import org.eclipse.ditto.internal.models.acks.AcknowledgementAggregatorActor; import org.eclipse.ditto.internal.models.acks.AcknowledgementAggregatorActorStarter; import org.eclipse.ditto.internal.models.acks.config.AcknowledgementConfig; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFilter; import org.eclipse.ditto.internal.utils.akka.logging.DittoLoggerFactory; import org.eclipse.ditto.internal.utils.akka.logging.ThreadSafeDittoLogger; import org.eclipse.ditto.internal.utils.config.DefaultScopedConfig; import org.eclipse.ditto.messages.model.signals.commands.MessageCommand; import org.eclipse.ditto.messages.model.signals.commands.acks.MessageCommandAckRequestSetter; +import org.eclipse.ditto.placeholders.ExpressionResolver; +import org.eclipse.ditto.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.PlaceholderFilter; import org.eclipse.ditto.protocol.HeaderTranslator; import org.eclipse.ditto.protocol.ProtocolFactory; import org.eclipse.ditto.protocol.TopicPath; diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/OutboundMappingProcessorActor.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/OutboundMappingProcessorActor.java index 742389fe24..8d1c07a9b7 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/OutboundMappingProcessorActor.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/OutboundMappingProcessorActor.java @@ -80,6 +80,11 @@ import org.eclipse.ditto.json.JsonFieldSelector; import org.eclipse.ditto.json.JsonObject; import org.eclipse.ditto.json.JsonValue; +import org.eclipse.ditto.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.PlaceholderResolver; +import org.eclipse.ditto.protocol.TopicPath; +import org.eclipse.ditto.protocol.adapter.DittoProtocolAdapter; +import org.eclipse.ditto.protocol.placeholders.TopicPathPlaceholder; import org.eclipse.ditto.rql.parser.RqlPredicateParser; import org.eclipse.ditto.rql.query.criteria.Criteria; import org.eclipse.ditto.rql.query.filter.QueryFilterCriteriaFactory; @@ -118,6 +123,9 @@ public final class OutboundMappingProcessorActor */ private static final String MESSAGE_MAPPING_PROCESSOR_DISPATCHER = "message-mapping-processor-dispatcher"; + private static final DittoProtocolAdapter DITTO_PROTOCOL_ADAPTER = DittoProtocolAdapter.newInstance(); + private static final TopicPathPlaceholder TOPIC_PATH_PLACEHOLDER = TopicPathPlaceholder.getInstance(); + private final ThreadSafeDittoLoggingAdapter dittoLoggingAdapter; private final ActorRef clientActor; @@ -181,9 +189,7 @@ public static void issueWeakAcknowledgements(final Signal signal, final boolean customAckRequested = requestedAcks.stream() .anyMatch(request -> !DittoAcknowledgementLabel.contains(request.getLabel())); - final Optional entityIdWithType = extractEntityId(signal) - .filter(EntityId.class::isInstance) - .map(EntityId.class::cast); + final Optional entityIdWithType = extractEntityId(signal); if (customAckRequested && entityIdWithType.isPresent()) { final List weakAckLabels = requestedAcks.stream() .map(AcknowledgementRequest::getLabel) @@ -638,13 +644,17 @@ private Collection applyFilter(final OutboundSignalWit if (filter.isPresent() && extraFields.isPresent()) { // evaluate filter criteria again if signal enrichment is involved. final Signal signal = outboundSignalWithExtra.getSource(); + final TopicPath topicPath = DITTO_PROTOCOL_ADAPTER.toTopicPath(signal); + final PlaceholderResolver topicPathPlaceholderResolver = PlaceholderFactory.newPlaceholderResolver( + TOPIC_PATH_PLACEHOLDER, topicPath); final DittoHeaders dittoHeaders = signal.getDittoHeaders(); - final Criteria criteria = QueryFilterCriteriaFactory.modelBased(RqlPredicateParser.getInstance()) - .filterCriteria(filter.get(), dittoHeaders); + final Criteria criteria = QueryFilterCriteriaFactory.modelBased(RqlPredicateParser.getInstance(), + topicPathPlaceholderResolver + ).filterCriteria(filter.get(), dittoHeaders); return outboundSignalWithExtra.getExtra() .flatMap(extra -> ThingEventToThingConverter .mergeThingWithExtraFields(signal, extraFields.get(), extra) - .filter(ThingPredicateVisitor.apply(criteria)) + .filter(ThingPredicateVisitor.apply(criteria, topicPathPlaceholderResolver)) .map(thing -> outboundSignalWithExtra)) .map(Collections::singletonList) .orElse(List.of()); diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/OutboundSignalToExternalMessage.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/OutboundSignalToExternalMessage.java index b85d7fb689..96a9c3aae6 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/OutboundSignalToExternalMessage.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/OutboundSignalToExternalMessage.java @@ -22,14 +22,14 @@ import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; -import org.eclipse.ditto.connectivity.model.HeaderMapping; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFilter; import org.eclipse.ditto.connectivity.api.ExternalMessage; import org.eclipse.ditto.connectivity.api.ExternalMessageFactory; import org.eclipse.ditto.connectivity.api.OutboundSignal; +import org.eclipse.ditto.connectivity.model.HeaderMapping; import org.eclipse.ditto.internal.utils.akka.logging.DittoLoggerFactory; import org.eclipse.ditto.internal.utils.akka.logging.ThreadSafeDittoLogger; +import org.eclipse.ditto.placeholders.ExpressionResolver; +import org.eclipse.ditto.placeholders.PlaceholderFilter; /** * Applies an optional "header mapping" potentially configured on a target on a passed {@link OutboundSignal.Mapped}. diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/RequestedAcksFilter.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/RequestedAcksFilter.java index cbced837e8..762c57f499 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/RequestedAcksFilter.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/RequestedAcksFilter.java @@ -19,10 +19,10 @@ import org.eclipse.ditto.base.model.headers.DittoHeaderDefinition; import org.eclipse.ditto.base.model.headers.DittoHeaders; -import org.eclipse.ditto.connectivity.model.ConnectionId; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; -import org.eclipse.ditto.connectivity.api.ExternalMessage; import org.eclipse.ditto.base.model.signals.Signal; +import org.eclipse.ditto.connectivity.api.ExternalMessage; +import org.eclipse.ditto.connectivity.model.ConnectionId; +import org.eclipse.ditto.placeholders.ExpressionResolver; /** * Execute filter for requested-acks configured in connection sources. diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/Resolvers.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/Resolvers.java index 77c6ae57cc..ce63da5dd7 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/Resolvers.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/Resolvers.java @@ -24,18 +24,18 @@ import org.eclipse.ditto.base.model.entity.id.EntityId; import org.eclipse.ditto.base.model.entity.id.WithEntityId; import org.eclipse.ditto.base.model.headers.DittoHeaders; -import org.eclipse.ditto.connectivity.model.ConnectionId; -import org.eclipse.ditto.protocol.Adaptable; -import org.eclipse.ditto.protocol.TopicPath; +import org.eclipse.ditto.base.model.signals.Signal; +import org.eclipse.ditto.base.model.signals.WithFeatureId; import org.eclipse.ditto.connectivity.api.ExternalMessage; import org.eclipse.ditto.connectivity.api.OutboundSignal; import org.eclipse.ditto.connectivity.api.placeholders.ConnectivityPlaceholders; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderResolver; -import org.eclipse.ditto.base.model.signals.Signal; -import org.eclipse.ditto.base.model.signals.WithFeatureId; +import org.eclipse.ditto.connectivity.model.ConnectionId; +import org.eclipse.ditto.placeholders.ExpressionResolver; +import org.eclipse.ditto.placeholders.Placeholder; +import org.eclipse.ditto.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.PlaceholderResolver; +import org.eclipse.ditto.protocol.Adaptable; +import org.eclipse.ditto.protocol.TopicPath; /** * Creator of expression resolvers for incoming and outgoing messages. diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/Sending.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/Sending.java index c2ef708ba3..484597f356 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/Sending.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/Sending.java @@ -23,9 +23,6 @@ import javax.annotation.Nullable; import javax.annotation.concurrent.NotThreadSafe; -import org.eclipse.ditto.connectivity.service.messaging.monitoring.ConnectionMonitor; -import org.eclipse.ditto.connectivity.service.messaging.validation.ConnectionValidator; -import org.eclipse.ditto.json.JsonValue; import org.eclipse.ditto.base.model.acks.AcknowledgementLabel; import org.eclipse.ditto.base.model.acks.DittoAcknowledgementLabel; import org.eclipse.ditto.base.model.common.HttpStatus; @@ -33,15 +30,18 @@ import org.eclipse.ditto.base.model.entity.id.WithEntityId; import org.eclipse.ditto.base.model.exceptions.DittoRuntimeException; import org.eclipse.ditto.base.model.headers.DittoHeaders; -import org.eclipse.ditto.connectivity.model.MessageSendingFailedException; -import org.eclipse.ditto.connectivity.model.Target; -import org.eclipse.ditto.connectivity.api.ExternalMessage; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; -import org.eclipse.ditto.internal.utils.akka.logging.ThreadSafeDittoLoggingAdapter; -import org.eclipse.ditto.base.model.signals.acks.Acknowledgement; import org.eclipse.ditto.base.model.signals.Signal; +import org.eclipse.ditto.base.model.signals.acks.Acknowledgement; import org.eclipse.ditto.base.model.signals.commands.CommandResponse; import org.eclipse.ditto.base.model.signals.commands.WithHttpStatus; +import org.eclipse.ditto.connectivity.api.ExternalMessage; +import org.eclipse.ditto.connectivity.model.MessageSendingFailedException; +import org.eclipse.ditto.connectivity.model.Target; +import org.eclipse.ditto.connectivity.service.messaging.monitoring.ConnectionMonitor; +import org.eclipse.ditto.connectivity.service.messaging.validation.ConnectionValidator; +import org.eclipse.ditto.internal.utils.akka.logging.ThreadSafeDittoLoggingAdapter; +import org.eclipse.ditto.json.JsonValue; +import org.eclipse.ditto.placeholders.ExpressionResolver; /** * A signal being sent represented by a future sending result holding an acknowledgement or other command response diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/amqp/AmqpConsumerActor.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/amqp/AmqpConsumerActor.java index 25555972bc..caedd0e577 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/amqp/AmqpConsumerActor.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/amqp/AmqpConsumerActor.java @@ -17,7 +17,7 @@ import static org.apache.qpid.jms.message.JmsMessageSupport.REJECTED; import static org.eclipse.ditto.base.model.common.ConditionChecker.checkNotNull; import static org.eclipse.ditto.connectivity.api.EnforcementFactoryFactory.newEnforcementFilterFactory; -import static org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory.newHeadersPlaceholder; +import static org.eclipse.ditto.placeholders.PlaceholderFactory.newHeadersPlaceholder; import java.nio.ByteBuffer; import java.text.MessageFormat; diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/amqp/AmqpValidator.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/amqp/AmqpValidator.java index a27ddf9a2c..9c4e95a2a7 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/amqp/AmqpValidator.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/amqp/AmqpValidator.java @@ -31,7 +31,7 @@ import org.eclipse.ditto.connectivity.service.config.ConnectivityConfig; import org.eclipse.ditto.connectivity.service.messaging.Resolvers; import org.eclipse.ditto.connectivity.service.messaging.validation.AbstractProtocolValidator; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.PlaceholderFactory; import akka.actor.ActorSystem; diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/httppush/HttpPushValidator.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/httppush/HttpPushValidator.java index 824b05b3ac..de0c55510d 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/httppush/HttpPushValidator.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/httppush/HttpPushValidator.java @@ -12,7 +12,7 @@ */ package org.eclipse.ditto.connectivity.service.messaging.httppush; -import static org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory.newHeadersPlaceholder; +import static org.eclipse.ditto.placeholders.PlaceholderFactory.newHeadersPlaceholder; import java.util.Collection; import java.util.List; diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/kafka/KafkaConsumerActor.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/kafka/KafkaConsumerActor.java index 3b11ce7122..f575205943 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/kafka/KafkaConsumerActor.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/kafka/KafkaConsumerActor.java @@ -13,7 +13,7 @@ package org.eclipse.ditto.connectivity.service.messaging.kafka; import static org.eclipse.ditto.connectivity.api.EnforcementFactoryFactory.newEnforcementFilterFactory; -import static org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory.newHeadersPlaceholder; +import static org.eclipse.ditto.placeholders.PlaceholderFactory.newHeadersPlaceholder; import java.time.Instant; import java.util.Map; diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/kafka/KafkaConsumerGroupSpecificConfig.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/kafka/KafkaConsumerGroupSpecificConfig.java index f7110c1c17..44580508be 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/kafka/KafkaConsumerGroupSpecificConfig.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/kafka/KafkaConsumerGroupSpecificConfig.java @@ -22,8 +22,8 @@ import org.eclipse.ditto.connectivity.api.placeholders.ConnectivityPlaceholders; import org.eclipse.ditto.connectivity.model.Connection; import org.eclipse.ditto.connectivity.model.ConnectionConfigurationInvalidException; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFilter; +import org.eclipse.ditto.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.PlaceholderFilter; /** * Allows to configure a consumer group ID via the specific config of a connection. diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/kafka/KafkaValidator.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/kafka/KafkaValidator.java index f5cadf879e..8a459767a3 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/kafka/KafkaValidator.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/kafka/KafkaValidator.java @@ -37,7 +37,7 @@ import org.eclipse.ditto.connectivity.service.config.ConnectivityConfig; import org.eclipse.ditto.connectivity.service.messaging.Resolvers; import org.eclipse.ditto.connectivity.service.messaging.validation.AbstractProtocolValidator; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.PlaceholderFactory; import akka.actor.ActorSystem; diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/mqtt/AbstractMqttValidator.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/mqtt/AbstractMqttValidator.java index 96226f3b30..14cf36163e 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/mqtt/AbstractMqttValidator.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/mqtt/AbstractMqttValidator.java @@ -18,7 +18,7 @@ import static org.eclipse.ditto.connectivity.api.placeholders.ConnectivityPlaceholders.newSourceAddressPlaceholder; import static org.eclipse.ditto.connectivity.api.placeholders.ConnectivityPlaceholders.newThingPlaceholder; import static org.eclipse.ditto.connectivity.api.placeholders.ConnectivityPlaceholders.newTopicPathPlaceholder; -import static org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory.newHeadersPlaceholder; +import static org.eclipse.ditto.placeholders.PlaceholderFactory.newHeadersPlaceholder; import java.text.MessageFormat; import java.util.AbstractMap; @@ -40,22 +40,22 @@ import org.eclipse.ditto.base.model.entity.id.EntityId; import org.eclipse.ditto.base.model.exceptions.DittoRuntimeException; import org.eclipse.ditto.base.model.headers.DittoHeaders; +import org.eclipse.ditto.connectivity.api.EnforcementFactoryFactory; +import org.eclipse.ditto.connectivity.api.placeholders.SourceAddressPlaceholder; +import org.eclipse.ditto.connectivity.api.placeholders.ThingPlaceholder; import org.eclipse.ditto.connectivity.model.Connection; import org.eclipse.ditto.connectivity.model.ConnectionConfigurationInvalidException; import org.eclipse.ditto.connectivity.model.Enforcement; import org.eclipse.ditto.connectivity.model.Source; import org.eclipse.ditto.connectivity.model.Target; import org.eclipse.ditto.connectivity.service.config.MqttConfig; -import org.eclipse.ditto.things.model.ThingId; import org.eclipse.ditto.connectivity.service.messaging.validation.AbstractProtocolValidator; -import org.eclipse.ditto.connectivity.api.EnforcementFactoryFactory; -import org.eclipse.ditto.connectivity.api.placeholders.SourceAddressPlaceholder; -import org.eclipse.ditto.connectivity.api.placeholders.ThingPlaceholder; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFilter; -import org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException; +import org.eclipse.ditto.placeholders.ExpressionResolver; +import org.eclipse.ditto.placeholders.Placeholder; +import org.eclipse.ditto.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.PlaceholderFilter; +import org.eclipse.ditto.placeholders.UnresolvedPlaceholderException; +import org.eclipse.ditto.things.model.ThingId; import com.hivemq.client.internal.util.UnsignedDataTypes; import com.hivemq.client.mqtt.datatypes.MqttQos; diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/mqtt/Mqtt3Validator.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/mqtt/Mqtt3Validator.java index 408d2e3625..c60adac224 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/mqtt/Mqtt3Validator.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/mqtt/Mqtt3Validator.java @@ -29,9 +29,9 @@ import org.eclipse.ditto.connectivity.model.Target; import org.eclipse.ditto.connectivity.service.config.ConnectivityConfig; import org.eclipse.ditto.connectivity.service.config.MqttConfig; -import org.eclipse.ditto.internal.models.placeholders.HeadersPlaceholder; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.HeadersPlaceholder; +import org.eclipse.ditto.placeholders.Placeholder; +import org.eclipse.ditto.placeholders.PlaceholderFactory; import akka.actor.ActorSystem; diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/mqtt/hivemq/HiveMqtt5ConsumerActor.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/mqtt/hivemq/HiveMqtt5ConsumerActor.java index 041e25d48b..6cb6f260eb 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/mqtt/hivemq/HiveMqtt5ConsumerActor.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/mqtt/hivemq/HiveMqtt5ConsumerActor.java @@ -32,7 +32,7 @@ import org.eclipse.ditto.connectivity.model.Source; import org.eclipse.ditto.connectivity.service.messaging.ConnectivityStatusResolver; import org.eclipse.ditto.connectivity.service.messaging.mqtt.MqttSpecificConfig; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.PlaceholderFactory; import com.hivemq.client.mqtt.datatypes.MqttQos; import com.hivemq.client.mqtt.mqtt5.message.publish.Mqtt5PayloadFormatIndicator; diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/persistence/SignalFilter.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/persistence/SignalFilter.java index 8b65167cdb..8eddebdf13 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/persistence/SignalFilter.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/persistence/SignalFilter.java @@ -24,31 +24,35 @@ import javax.annotation.Nullable; -import org.eclipse.ditto.connectivity.model.signals.announcements.ConnectivityAnnouncement; -import org.eclipse.ditto.connectivity.service.messaging.monitoring.ConnectionMonitor; -import org.eclipse.ditto.connectivity.service.messaging.monitoring.ConnectionMonitorRegistry; -import org.eclipse.ditto.json.JsonFieldSelector; -import org.eclipse.ditto.json.JsonPointer; import org.eclipse.ditto.base.model.auth.AuthorizationContext; import org.eclipse.ditto.base.model.entity.id.WithEntityId; import org.eclipse.ditto.base.model.headers.DittoHeaders; +import org.eclipse.ditto.base.model.namespaces.NamespaceReader; +import org.eclipse.ditto.base.model.signals.Signal; +import org.eclipse.ditto.base.model.signals.commands.Command; +import org.eclipse.ditto.base.model.signals.commands.CommandResponse; +import org.eclipse.ditto.base.model.signals.events.Event; import org.eclipse.ditto.connectivity.model.Connection; import org.eclipse.ditto.connectivity.model.FilteredTopic; import org.eclipse.ditto.connectivity.model.Target; import org.eclipse.ditto.connectivity.model.Topic; -import org.eclipse.ditto.base.model.namespaces.NamespaceReader; +import org.eclipse.ditto.connectivity.model.signals.announcements.ConnectivityAnnouncement; +import org.eclipse.ditto.connectivity.service.messaging.monitoring.ConnectionMonitor; +import org.eclipse.ditto.connectivity.service.messaging.monitoring.ConnectionMonitorRegistry; +import org.eclipse.ditto.json.JsonFieldSelector; +import org.eclipse.ditto.json.JsonPointer; +import org.eclipse.ditto.messages.model.signals.commands.MessageCommand; +import org.eclipse.ditto.messages.model.signals.commands.MessageCommandResponse; +import org.eclipse.ditto.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.PlaceholderResolver; +import org.eclipse.ditto.policies.model.signals.announcements.PolicyAnnouncement; +import org.eclipse.ditto.protocol.TopicPath; +import org.eclipse.ditto.protocol.adapter.DittoProtocolAdapter; +import org.eclipse.ditto.protocol.placeholders.TopicPathPlaceholder; +import org.eclipse.ditto.rql.parser.RqlPredicateParser; import org.eclipse.ditto.rql.query.criteria.Criteria; import org.eclipse.ditto.rql.query.filter.QueryFilterCriteriaFactory; -import org.eclipse.ditto.rql.parser.RqlPredicateParser; import org.eclipse.ditto.things.model.ThingId; -import org.eclipse.ditto.protocol.TopicPath; -import org.eclipse.ditto.policies.model.signals.announcements.PolicyAnnouncement; -import org.eclipse.ditto.base.model.signals.Signal; -import org.eclipse.ditto.base.model.signals.commands.Command; -import org.eclipse.ditto.base.model.signals.commands.CommandResponse; -import org.eclipse.ditto.messages.model.signals.commands.MessageCommand; -import org.eclipse.ditto.messages.model.signals.commands.MessageCommandResponse; -import org.eclipse.ditto.base.model.signals.events.Event; import org.eclipse.ditto.things.model.signals.events.ThingEvent; import org.eclipse.ditto.things.model.signals.events.ThingEventToThingConverter; @@ -61,6 +65,9 @@ */ public final class SignalFilter { + private static final DittoProtocolAdapter DITTO_PROTOCOL_ADAPTER = DittoProtocolAdapter.newInstance(); + private static final TopicPathPlaceholder TOPIC_PATH_PLACEHOLDER = TopicPathPlaceholder.getInstance(); + private final Connection connection; private final ConnectionMonitorRegistry connectionMonitorRegistry; @@ -151,11 +158,16 @@ private static boolean matchesFilterBeforeEnrichment(final FilteredTopic filtere // match filter ignoring "extraFields" return ThingEventToThingConverter.thingEventToThing((ThingEvent) signal) .filter(thing -> { - final Criteria criteria = parseCriteria(filterOptional.get(), signal.getDittoHeaders()); + final TopicPath topicPath = DITTO_PROTOCOL_ADAPTER.toTopicPath(signal); + final PlaceholderResolver topicPathPlaceholderResolver = + PlaceholderFactory.newPlaceholderResolver(TOPIC_PATH_PLACEHOLDER, topicPath); + final Criteria criteria = parseCriteria(filterOptional.get(), signal.getDittoHeaders(), + topicPathPlaceholderResolver); final Set extraFields = filteredTopic.getExtraFields() .map(JsonFieldSelector::getPointers) .orElse(Collections.emptySet()); - return Thing3ValuePredicateVisitor.couldBeTrue(criteria, extraFields, thing); + return Thing3ValuePredicateVisitor.couldBeTrue(criteria, extraFields, thing, + topicPathPlaceholderResolver); }) .isPresent(); } else { @@ -167,8 +179,9 @@ private static boolean matchesFilterBeforeEnrichment(final FilteredTopic filtere * @throws org.eclipse.ditto.base.model.exceptions.InvalidRqlExpressionException if the filter string cannot be * mapped to a valid criterion */ - private static Criteria parseCriteria(final String filter, final DittoHeaders dittoHeaders) { - return QueryFilterCriteriaFactory.modelBased(RqlPredicateParser.getInstance()) + private static Criteria parseCriteria(final String filter, final DittoHeaders dittoHeaders, + final PlaceholderResolver topicPathPlaceholderResolver) { + return QueryFilterCriteriaFactory.modelBased(RqlPredicateParser.getInstance(), topicPathPlaceholderResolver) .filterCriteria(filter, dittoHeaders); } diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/persistence/Thing3ValuePredicateVisitor.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/persistence/Thing3ValuePredicateVisitor.java index ff0b6f2683..d6a385f7f9 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/persistence/Thing3ValuePredicateVisitor.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/persistence/Thing3ValuePredicateVisitor.java @@ -12,12 +12,16 @@ */ package org.eclipse.ditto.connectivity.service.messaging.persistence; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.Set; import java.util.function.Function; import org.eclipse.ditto.json.JsonKey; import org.eclipse.ditto.json.JsonPointer; +import org.eclipse.ditto.placeholders.PlaceholderResolver; import org.eclipse.ditto.rql.query.criteria.Criteria; import org.eclipse.ditto.rql.query.criteria.Predicate; import org.eclipse.ditto.rql.query.criteria.visitors.CriteriaVisitor; @@ -36,10 +40,13 @@ final class Thing3ValuePredicateVisitor implements CriteriaVisitor> { private final Set unknownFields; + private final List> placeholderResolvers; - private Thing3ValuePredicateVisitor(final Set unknownFields) { - // only internally instantiable + private Thing3ValuePredicateVisitor(final Set unknownFields, + final Collection> placeholderResolvers) { + // only internally instantiable, therefore no copying + immutability of fields this.unknownFields = unknownFields; + this.placeholderResolvers = new ArrayList<>(placeholderResolvers); } /** @@ -48,12 +55,35 @@ private Thing3ValuePredicateVisitor(final Set unknownFields) { * @param criteria the criteria. * @param unknownFields the set of unknown fields that shall not falsify the criteria evaluation result. * @param partialThing the partial thing. + * @param placeholderResolvers additional {@code PlaceholderResolver}s to use in order to resolve placeholders in + * the form {@code prefix:name}. * @return whether the criteria may evaluate to true after replacing 'ignoredFields' by unknown values in * 'partialThing'. */ - static boolean couldBeTrue(final Criteria criteria, final Set unknownFields, - final Thing partialThing) { - return Trilean.FALSE != criteria.accept(new Thing3ValuePredicateVisitor(unknownFields)).apply(partialThing); + static boolean couldBeTrue(final Criteria criteria, + final Set unknownFields, + final Thing partialThing, + final PlaceholderResolver... placeholderResolvers) { + return couldBeTrue(criteria, unknownFields, partialThing, Arrays.asList(placeholderResolvers)); + } + + /** + * Evaluate criteria against a partial thing to see whether it could be true. + * + * @param criteria the criteria. + * @param unknownFields the set of unknown fields that shall not falsify the criteria evaluation result. + * @param partialThing the partial thing. + * @param placeholderResolvers additional {@code PlaceholderResolver}s to use in order to resolve placeholders in + * the form {@code prefix:name}. + * @return whether the criteria may evaluate to true after replacing 'ignoredFields' by unknown values in + * 'partialThing'. + */ + static boolean couldBeTrue(final Criteria criteria, + final Set unknownFields, + final Thing partialThing, + final Collection> placeholderResolvers) { + return Trilean.FALSE != criteria.accept(new Thing3ValuePredicateVisitor(unknownFields, placeholderResolvers)) + .apply(partialThing); } @Override @@ -70,7 +100,7 @@ public Function visitAny() { public Function visitExists(final ExistsFieldExpression fieldExpression) { return thing -> isUnknownField(fieldExpression) ? Trilean.UNKNOWN - : Trilean.lift(ExistsThingPredicateVisitor.apply(fieldExpression).test(thing)); + : Trilean.lift(ExistsThingPredicateVisitor.apply(fieldExpression, placeholderResolvers).test(thing)); } @Override diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/rabbitmq/RabbitMQConsumerActor.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/rabbitmq/RabbitMQConsumerActor.java index 139e34fcaf..d3b90e8be4 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/rabbitmq/RabbitMQConsumerActor.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/rabbitmq/RabbitMQConsumerActor.java @@ -39,13 +39,13 @@ import org.eclipse.ditto.connectivity.service.messaging.LegacyBaseConsumerActor; import org.eclipse.ditto.connectivity.service.messaging.internal.RetrieveAddressStatus; import org.eclipse.ditto.connectivity.service.util.ConnectivityMdcEntryKey; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; import org.eclipse.ditto.internal.utils.akka.logging.DittoLoggerFactory; import org.eclipse.ditto.internal.utils.akka.logging.ThreadSafeDittoLoggingAdapter; import org.eclipse.ditto.internal.utils.tracing.DittoTracing; import org.eclipse.ditto.internal.utils.tracing.instruments.trace.PreparedTrace; import org.eclipse.ditto.internal.utils.tracing.instruments.trace.StartedTrace; import org.eclipse.ditto.internal.utils.tracing.instruments.trace.Traces; +import org.eclipse.ditto.placeholders.PlaceholderFactory; import com.rabbitmq.client.BasicProperties; import com.rabbitmq.client.Channel; diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/rabbitmq/RabbitMQPublisherActor.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/rabbitmq/RabbitMQPublisherActor.java index d86669fa0f..22e6bc21b7 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/rabbitmq/RabbitMQPublisherActor.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/rabbitmq/RabbitMQPublisherActor.java @@ -56,10 +56,10 @@ import org.eclipse.ditto.connectivity.service.config.DittoConnectivityConfig; import org.eclipse.ditto.connectivity.service.messaging.BasePublisherActor; import org.eclipse.ditto.connectivity.service.messaging.SendResult; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; import org.eclipse.ditto.internal.utils.config.DefaultScopedConfig; import org.eclipse.ditto.internal.utils.config.InstanceIdentifierSupplier; import org.eclipse.ditto.json.JsonValue; +import org.eclipse.ditto.placeholders.ExpressionResolver; import com.newmotion.akka.rabbitmq.ChannelCreated; import com.newmotion.akka.rabbitmq.ChannelMessage; diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/rabbitmq/RabbitMQValidator.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/rabbitmq/RabbitMQValidator.java index 19ed944aef..9e5eac9736 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/rabbitmq/RabbitMQValidator.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/rabbitmq/RabbitMQValidator.java @@ -31,7 +31,7 @@ import org.eclipse.ditto.connectivity.service.config.ConnectivityConfig; import org.eclipse.ditto.connectivity.service.messaging.Resolvers; import org.eclipse.ditto.connectivity.service.messaging.validation.AbstractProtocolValidator; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.PlaceholderFactory; import akka.actor.ActorSystem; diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/validation/AbstractProtocolValidator.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/validation/AbstractProtocolValidator.java index d41f287f16..b00d94260f 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/validation/AbstractProtocolValidator.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/validation/AbstractProtocolValidator.java @@ -33,8 +33,8 @@ import org.eclipse.ditto.connectivity.service.mapping.MessageMapperFactory; import org.eclipse.ditto.connectivity.service.mapping.MessageMapperRegistry; import org.eclipse.ditto.connectivity.service.messaging.Resolvers; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFilter; +import org.eclipse.ditto.placeholders.Placeholder; +import org.eclipse.ditto.placeholders.PlaceholderFilter; import akka.actor.ActorSystem; diff --git a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/validation/ConnectionValidator.java b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/validation/ConnectionValidator.java index c1c2121868..7d8fe7a027 100644 --- a/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/validation/ConnectionValidator.java +++ b/connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/validation/ConnectionValidator.java @@ -51,8 +51,9 @@ import org.eclipse.ditto.connectivity.service.config.mapping.MapperLimitsConfig; import org.eclipse.ditto.connectivity.service.messaging.internal.ssl.SSLContextCreator; import org.eclipse.ditto.connectivity.service.messaging.monitoring.logs.ConnectionLogger; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.ExpressionResolver; +import org.eclipse.ditto.placeholders.PlaceholderFactory; +import org.eclipse.ditto.protocol.placeholders.TopicPathPlaceholder; import org.eclipse.ditto.rql.parser.RqlPredicateParser; import org.eclipse.ditto.rql.query.filter.QueryFilterCriteriaFactory; @@ -78,7 +79,8 @@ private ConnectionValidator(LoggingAdapter loggingAdapter, final Map theSpecMap = Arrays.stream(connectionSpecs) .collect(Collectors.toMap(AbstractProtocolValidator::type, Function.identity())); this.specMap = Collections.unmodifiableMap(theSpecMap); - queryFilterCriteriaFactory = QueryFilterCriteriaFactory.modelBased(RqlPredicateParser.getInstance()); + queryFilterCriteriaFactory = QueryFilterCriteriaFactory.modelBased(RqlPredicateParser.getInstance(), + TopicPathPlaceholder.getInstance()); } /** diff --git a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/ConnectivityServiceGlobalErrorRegistryTest.java b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/ConnectivityServiceGlobalErrorRegistryTest.java index 0c9b3a7079..6295f8f63e 100644 --- a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/ConnectivityServiceGlobalErrorRegistryTest.java +++ b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/ConnectivityServiceGlobalErrorRegistryTest.java @@ -15,27 +15,27 @@ import org.eclipse.ditto.base.model.acks.AcknowledgementLabelInvalidException; import org.eclipse.ditto.base.model.entity.id.NamespacedEntityIdInvalidException; import org.eclipse.ditto.base.model.exceptions.DittoHeaderInvalidException; -import org.eclipse.ditto.connectivity.model.ConnectionConfigurationInvalidException; -import org.eclipse.ditto.connectivity.service.config.ConnectivityConfigUnavailableException; -import org.eclipse.ditto.messages.model.AuthorizationSubjectBlockedException; import org.eclipse.ditto.base.model.namespaces.NamespaceBlockedException; -import org.eclipse.ditto.protocol.adapter.UnknownTopicPathException; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFunctionSignatureInvalidException; -import org.eclipse.ditto.policies.model.PolicyEntryInvalidException; -import org.eclipse.ditto.policies.model.PolicyIdInvalidException; -import org.eclipse.ditto.things.model.ThingIdInvalidException; -import org.eclipse.ditto.protocol.UnknownCommandException; -import org.eclipse.ditto.internal.utils.test.GlobalErrorRegistryTestCases; -import org.eclipse.ditto.base.model.signals.acks.AcknowledgementCorrelationIdMissingException; import org.eclipse.ditto.base.model.signals.JsonTypeNotParsableException; import org.eclipse.ditto.base.model.signals.UnsupportedSchemaVersionException; import org.eclipse.ditto.base.model.signals.UnsupportedSignalException; +import org.eclipse.ditto.base.model.signals.acks.AcknowledgementCorrelationIdMissingException; import org.eclipse.ditto.base.model.signals.commands.CommandNotSupportedException; import org.eclipse.ditto.base.model.signals.commands.exceptions.GatewayAuthenticationFailedException; import org.eclipse.ditto.base.model.signals.commands.exceptions.PathUnknownException; +import org.eclipse.ditto.connectivity.model.ConnectionConfigurationInvalidException; import org.eclipse.ditto.connectivity.model.signals.commands.exceptions.ConnectionConflictException; import org.eclipse.ditto.connectivity.model.signals.commands.exceptions.ConnectionTimeoutException; +import org.eclipse.ditto.connectivity.service.config.ConnectivityConfigUnavailableException; +import org.eclipse.ditto.internal.utils.test.GlobalErrorRegistryTestCases; +import org.eclipse.ditto.messages.model.AuthorizationSubjectBlockedException; +import org.eclipse.ditto.placeholders.PlaceholderFunctionSignatureInvalidException; +import org.eclipse.ditto.policies.model.PolicyEntryInvalidException; +import org.eclipse.ditto.policies.model.PolicyIdInvalidException; import org.eclipse.ditto.policies.model.signals.commands.exceptions.PolicyConflictException; +import org.eclipse.ditto.protocol.UnknownCommandException; +import org.eclipse.ditto.protocol.adapter.UnknownTopicPathException; +import org.eclipse.ditto.things.model.ThingIdInvalidException; import org.eclipse.ditto.things.model.signals.commands.exceptions.AttributePointerInvalidException; import org.eclipse.ditto.thingsearch.model.signals.commands.exceptions.InvalidNamespacesException; diff --git a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/mapping/ImplicitThingCreationMessageMapperTest.java b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/mapping/ImplicitThingCreationMessageMapperTest.java index 53bcd69bae..f7ca2df3a3 100644 --- a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/mapping/ImplicitThingCreationMessageMapperTest.java +++ b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/mapping/ImplicitThingCreationMessageMapperTest.java @@ -31,9 +31,9 @@ import org.eclipse.ditto.connectivity.api.ExternalMessageFactory; import org.eclipse.ditto.connectivity.model.MessageMapperConfigurationInvalidException; import org.eclipse.ditto.connectivity.service.messaging.TestConstants; -import org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException; import org.eclipse.ditto.json.JsonObject; import org.eclipse.ditto.json.JsonValue; +import org.eclipse.ditto.placeholders.UnresolvedPlaceholderException; import org.eclipse.ditto.policies.model.PoliciesResourceType; import org.eclipse.ditto.policies.model.Policy; import org.eclipse.ditto.policies.model.SubjectIssuer; diff --git a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/AbstractConsumerActorTest.java b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/AbstractConsumerActorTest.java index ac3cceb836..b5febde092 100644 --- a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/AbstractConsumerActorTest.java +++ b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/AbstractConsumerActorTest.java @@ -35,9 +35,9 @@ import org.eclipse.ditto.connectivity.service.config.ConnectivityConfig; import org.eclipse.ditto.connectivity.service.mapping.DittoConnectionContext; import org.eclipse.ditto.connectivity.service.mapping.DittoMessageMapper; -import org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException; import org.eclipse.ditto.internal.utils.akka.logging.ThreadSafeDittoLoggingAdapter; import org.eclipse.ditto.internal.utils.protocol.ProtocolAdapterProvider; +import org.eclipse.ditto.placeholders.UnresolvedPlaceholderException; import org.eclipse.ditto.protocol.adapter.ProtocolAdapter; import org.eclipse.ditto.things.model.signals.commands.modify.ModifyThing; import org.junit.After; diff --git a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/AbstractMessageMappingProcessorActorTest.java b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/AbstractMessageMappingProcessorActorTest.java index bbb52795ae..b068ad2eda 100644 --- a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/AbstractMessageMappingProcessorActorTest.java +++ b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/AbstractMessageMappingProcessorActorTest.java @@ -56,12 +56,12 @@ import org.eclipse.ditto.connectivity.service.mapping.ConnectionContext; import org.eclipse.ditto.connectivity.service.mapping.ConnectivityCachingSignalEnrichmentProvider; import org.eclipse.ditto.connectivity.service.mapping.DittoConnectionContext; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; import org.eclipse.ditto.internal.utils.akka.logging.ThreadSafeDittoLoggingAdapter; import org.eclipse.ditto.internal.utils.protocol.ProtocolAdapterProvider; import org.eclipse.ditto.json.JsonObject; import org.eclipse.ditto.json.JsonPointer; import org.eclipse.ditto.json.JsonValue; +import org.eclipse.ditto.placeholders.Placeholder; import org.eclipse.ditto.protocol.JsonifiableAdaptable; import org.eclipse.ditto.protocol.ProtocolFactory; import org.eclipse.ditto.protocol.adapter.DittoProtocolAdapter; diff --git a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/MessageMappingProcessorActorTest.java b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/MessageMappingProcessorActorTest.java index 8e2747309c..d5a2a07448 100644 --- a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/MessageMappingProcessorActorTest.java +++ b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/MessageMappingProcessorActorTest.java @@ -25,12 +25,6 @@ import java.util.Set; import java.util.UUID; -import org.eclipse.ditto.json.JsonFactory; -import org.eclipse.ditto.json.JsonFieldSelector; -import org.eclipse.ditto.json.JsonObject; -import org.eclipse.ditto.json.JsonParseOptions; -import org.eclipse.ditto.json.JsonPointer; -import org.eclipse.ditto.json.JsonValue; import org.eclipse.ditto.base.model.acks.AcknowledgementLabel; import org.eclipse.ditto.base.model.acks.AcknowledgementLabelNotDeclaredException; import org.eclipse.ditto.base.model.acks.AcknowledgementRequest; @@ -43,6 +37,18 @@ import org.eclipse.ditto.base.model.common.ResponseType; import org.eclipse.ditto.base.model.headers.DittoHeaderDefinition; import org.eclipse.ditto.base.model.headers.DittoHeaders; +import org.eclipse.ditto.base.model.signals.Signal; +import org.eclipse.ditto.base.model.signals.SignalWithEntityId; +import org.eclipse.ditto.base.model.signals.acks.Acknowledgement; +import org.eclipse.ditto.base.model.signals.acks.Acknowledgements; +import org.eclipse.ditto.base.model.signals.commands.ErrorResponse; +import org.eclipse.ditto.base.model.signals.events.AbstractEventsourcedEvent; +import org.eclipse.ditto.connectivity.api.EnforcementFactoryFactory; +import org.eclipse.ditto.connectivity.api.ExternalMessage; +import org.eclipse.ditto.connectivity.api.ExternalMessageFactory; +import org.eclipse.ditto.connectivity.api.InboundSignal; +import org.eclipse.ditto.connectivity.api.OutboundSignal; +import org.eclipse.ditto.connectivity.api.OutboundSignalFactory; import org.eclipse.ditto.connectivity.model.ConnectionSignalIdEnforcementFailedException; import org.eclipse.ditto.connectivity.model.ConnectivityModelFactory; import org.eclipse.ditto.connectivity.model.Enforcement; @@ -51,24 +57,19 @@ import org.eclipse.ditto.connectivity.model.MessageMappingFailedException; import org.eclipse.ditto.connectivity.model.Target; import org.eclipse.ditto.connectivity.model.Topic; -import org.eclipse.ditto.things.model.Thing; -import org.eclipse.ditto.things.model.ThingFieldSelector; -import org.eclipse.ditto.things.model.ThingId; +import org.eclipse.ditto.json.JsonFactory; +import org.eclipse.ditto.json.JsonFieldSelector; +import org.eclipse.ditto.json.JsonObject; +import org.eclipse.ditto.json.JsonParseOptions; +import org.eclipse.ditto.json.JsonPointer; +import org.eclipse.ditto.json.JsonValue; +import org.eclipse.ditto.placeholders.UnresolvedPlaceholderException; import org.eclipse.ditto.protocol.JsonifiableAdaptable; import org.eclipse.ditto.protocol.ProtocolFactory; import org.eclipse.ditto.protocol.TopicPath; -import org.eclipse.ditto.connectivity.api.EnforcementFactoryFactory; -import org.eclipse.ditto.connectivity.api.ExternalMessage; -import org.eclipse.ditto.connectivity.api.ExternalMessageFactory; -import org.eclipse.ditto.connectivity.api.InboundSignal; -import org.eclipse.ditto.connectivity.api.OutboundSignal; -import org.eclipse.ditto.connectivity.api.OutboundSignalFactory; -import org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException; -import org.eclipse.ditto.base.model.signals.acks.Acknowledgement; -import org.eclipse.ditto.base.model.signals.acks.Acknowledgements; -import org.eclipse.ditto.base.model.signals.Signal; -import org.eclipse.ditto.base.model.signals.SignalWithEntityId; -import org.eclipse.ditto.base.model.signals.commands.ErrorResponse; +import org.eclipse.ditto.things.model.Thing; +import org.eclipse.ditto.things.model.ThingFieldSelector; +import org.eclipse.ditto.things.model.ThingId; import org.eclipse.ditto.things.model.signals.commands.exceptions.ThingNotAccessibleException; import org.eclipse.ditto.things.model.signals.commands.modify.DeleteThingResponse; import org.eclipse.ditto.things.model.signals.commands.modify.ModifyAttribute; @@ -77,7 +78,6 @@ import org.eclipse.ditto.things.model.signals.commands.query.RetrieveThing; import org.eclipse.ditto.things.model.signals.commands.query.RetrieveThingResponse; import org.eclipse.ditto.thingsearch.model.signals.commands.subscription.CreateSubscription; -import org.eclipse.ditto.base.model.signals.events.AbstractEventsourcedEvent; import org.junit.Test; import akka.actor.ActorRef; @@ -85,7 +85,7 @@ import akka.testkit.javadsl.TestKit; /** - * Tests {@link InboundMappingProcessorActor} and {@link OutboundMappingProcessorActor}. + * Tests {@link InboundMappingSink} and {@link OutboundMappingProcessorActor}. */ public final class MessageMappingProcessorActorTest extends AbstractMessageMappingProcessorActorTest { diff --git a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/RequestedAcksFilterTest.java b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/RequestedAcksFilterTest.java index 6311b8c6d1..76d756579d 100644 --- a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/RequestedAcksFilterTest.java +++ b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/RequestedAcksFilterTest.java @@ -21,12 +21,12 @@ import org.eclipse.ditto.base.model.acks.DittoAcknowledgementLabel; import org.eclipse.ditto.base.model.headers.DittoHeaderDefinition; import org.eclipse.ditto.base.model.headers.DittoHeaders; -import org.eclipse.ditto.connectivity.model.ConnectionId; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFunctionSignatureInvalidException; -import org.eclipse.ditto.things.model.ThingId; +import org.eclipse.ditto.base.model.signals.Signal; import org.eclipse.ditto.connectivity.api.ExternalMessage; import org.eclipse.ditto.connectivity.api.ExternalMessageFactory; -import org.eclipse.ditto.base.model.signals.Signal; +import org.eclipse.ditto.connectivity.model.ConnectionId; +import org.eclipse.ditto.placeholders.PlaceholderFunctionSignatureInvalidException; +import org.eclipse.ditto.things.model.ThingId; import org.eclipse.ditto.things.model.signals.commands.modify.DeleteThing; import org.junit.Test; diff --git a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/ResolversTest.java b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/ResolversTest.java index 629a8ec467..795d98eb85 100644 --- a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/ResolversTest.java +++ b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/ResolversTest.java @@ -30,7 +30,7 @@ import org.eclipse.ditto.connectivity.model.ConnectivityModelFactory; import org.eclipse.ditto.connectivity.model.Target; import org.eclipse.ditto.connectivity.model.Topic; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; +import org.eclipse.ditto.placeholders.ExpressionResolver; import org.eclipse.ditto.protocol.Adaptable; import org.eclipse.ditto.protocol.adapter.DittoProtocolAdapter; import org.eclipse.ditto.things.model.signals.events.ThingDeleted; diff --git a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/SendingTest.java b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/SendingTest.java index 65cc4a9e5e..b8b7e7f6e7 100644 --- a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/SendingTest.java +++ b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/SendingTest.java @@ -22,8 +22,6 @@ import java.util.concurrent.CompletionStage; import org.assertj.core.api.SoftAssertions; -import org.eclipse.ditto.connectivity.service.messaging.monitoring.ConnectionMonitor; -import org.eclipse.ditto.json.JsonObject; import org.eclipse.ditto.base.model.acks.AcknowledgementLabel; import org.eclipse.ditto.base.model.acks.DittoAcknowledgementLabel; import org.eclipse.ditto.base.model.common.HttpStatus; @@ -31,18 +29,20 @@ import org.eclipse.ditto.base.model.headers.DittoHeaders; import org.eclipse.ditto.base.model.headers.DittoHeadersSettable; import org.eclipse.ditto.base.model.headers.WithDittoHeaders; +import org.eclipse.ditto.base.model.signals.Signal; +import org.eclipse.ditto.base.model.signals.acks.Acknowledgement; +import org.eclipse.ditto.base.model.signals.commands.CommandResponse; +import org.eclipse.ditto.connectivity.api.ExternalMessage; +import org.eclipse.ditto.connectivity.api.OutboundSignal; import org.eclipse.ditto.connectivity.model.GenericTarget; import org.eclipse.ditto.connectivity.model.MessageSendingFailedException; import org.eclipse.ditto.connectivity.model.Target; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; +import org.eclipse.ditto.connectivity.service.messaging.monitoring.ConnectionMonitor; +import org.eclipse.ditto.internal.utils.akka.logging.ThreadSafeDittoLoggingAdapter; +import org.eclipse.ditto.json.JsonObject; +import org.eclipse.ditto.placeholders.ExpressionResolver; import org.eclipse.ditto.things.model.ThingId; import org.eclipse.ditto.things.model.WithThingId; -import org.eclipse.ditto.connectivity.api.ExternalMessage; -import org.eclipse.ditto.connectivity.api.OutboundSignal; -import org.eclipse.ditto.internal.utils.akka.logging.ThreadSafeDittoLoggingAdapter; -import org.eclipse.ditto.base.model.signals.acks.Acknowledgement; -import org.eclipse.ditto.base.model.signals.Signal; -import org.eclipse.ditto.base.model.signals.commands.CommandResponse; import org.junit.Before; import org.junit.Rule; import org.junit.Test; diff --git a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/amqp/AmqpValidatorTest.java b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/amqp/AmqpValidatorTest.java index cdbfdd7a59..e5886c0c5a 100644 --- a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/amqp/AmqpValidatorTest.java +++ b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/amqp/AmqpValidatorTest.java @@ -28,8 +28,8 @@ import org.eclipse.ditto.connectivity.model.SourceBuilder; import org.eclipse.ditto.connectivity.model.Target; import org.eclipse.ditto.connectivity.model.Topic; -import org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException; import org.eclipse.ditto.connectivity.service.messaging.TestConstants; +import org.eclipse.ditto.placeholders.UnresolvedPlaceholderException; import org.junit.Test; /** diff --git a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/kafka/KafkaMessageTransformerTest.java b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/kafka/KafkaMessageTransformerTest.java index 1b576c3f5f..19e483cfdb 100644 --- a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/kafka/KafkaMessageTransformerTest.java +++ b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/kafka/KafkaMessageTransformerTest.java @@ -18,7 +18,7 @@ import static org.eclipse.ditto.connectivity.service.messaging.kafka.KafkaHeader.KAFKA_KEY; import static org.eclipse.ditto.connectivity.service.messaging.kafka.KafkaHeader.KAFKA_TIMESTAMP; import static org.eclipse.ditto.connectivity.service.messaging.kafka.KafkaHeader.KAFKA_TOPIC; -import static org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory.newHeadersPlaceholder; +import static org.eclipse.ditto.placeholders.PlaceholderFactory.newHeadersPlaceholder; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; @@ -44,7 +44,7 @@ import org.eclipse.ditto.connectivity.model.EnforcementFilterFactory; import org.eclipse.ditto.connectivity.model.Source; import org.eclipse.ditto.connectivity.service.messaging.monitoring.ConnectionMonitor; -import org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException; +import org.eclipse.ditto.placeholders.UnresolvedPlaceholderException; import org.junit.Before; import org.junit.Test; diff --git a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/rabbitmq/RabbitMQValidatorTest.java b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/rabbitmq/RabbitMQValidatorTest.java index 7515c89fe3..636223f635 100644 --- a/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/rabbitmq/RabbitMQValidatorTest.java +++ b/connectivity/service/src/test/java/org/eclipse/ditto/connectivity/service/messaging/rabbitmq/RabbitMQValidatorTest.java @@ -33,7 +33,7 @@ import org.eclipse.ditto.connectivity.model.Topic; import org.eclipse.ditto.connectivity.service.config.ConnectivityConfig; import org.eclipse.ditto.connectivity.service.messaging.TestConstants; -import org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException; +import org.eclipse.ditto.placeholders.UnresolvedPlaceholderException; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/OAuthTokenIntegrationSubjectIdFactory.java b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/OAuthTokenIntegrationSubjectIdFactory.java index 741db8fd9e..05f78e5ac6 100755 --- a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/OAuthTokenIntegrationSubjectIdFactory.java +++ b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/OAuthTokenIntegrationSubjectIdFactory.java @@ -20,8 +20,8 @@ import org.eclipse.ditto.gateway.service.security.authentication.jwt.JwtPlaceholder; import org.eclipse.ditto.gateway.service.util.config.security.OAuthConfig; import org.eclipse.ditto.jwt.model.JsonWebToken; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.ExpressionResolver; +import org.eclipse.ditto.placeholders.PlaceholderFactory; import org.eclipse.ditto.policies.model.SubjectId; /** diff --git a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/PoliciesRoute.java b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/PoliciesRoute.java index 1c4ec34535..f9931de308 100755 --- a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/PoliciesRoute.java +++ b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/PoliciesRoute.java @@ -29,12 +29,12 @@ import org.eclipse.ditto.gateway.service.security.authentication.jwt.JwtAuthenticationResult; import org.eclipse.ditto.gateway.service.util.config.endpoints.CommandConfig; import org.eclipse.ditto.gateway.service.util.config.endpoints.HttpConfig; -import org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException; import org.eclipse.ditto.json.JsonFactory; import org.eclipse.ditto.json.JsonFieldDefinition; import org.eclipse.ditto.json.JsonObject; import org.eclipse.ditto.json.JsonValue; import org.eclipse.ditto.jwt.model.JsonWebToken; +import org.eclipse.ditto.placeholders.UnresolvedPlaceholderException; import org.eclipse.ditto.policies.model.Label; import org.eclipse.ditto.policies.model.PoliciesModelFactory; import org.eclipse.ditto.policies.model.Policy; diff --git a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/PolicyEntriesRoute.java b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/PolicyEntriesRoute.java index 83c3de5ca3..a1b1c54168 100755 --- a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/PolicyEntriesRoute.java +++ b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/PolicyEntriesRoute.java @@ -18,15 +18,16 @@ import javax.annotation.Nullable; +import org.eclipse.ditto.base.model.common.HttpStatus; +import org.eclipse.ditto.base.model.headers.DittoHeaders; +import org.eclipse.ditto.gateway.service.endpoints.routes.AbstractRoute; import org.eclipse.ditto.gateway.service.security.authentication.AuthenticationResult; import org.eclipse.ditto.gateway.service.util.config.endpoints.CommandConfig; import org.eclipse.ditto.gateway.service.util.config.endpoints.HttpConfig; import org.eclipse.ditto.json.JsonFactory; import org.eclipse.ditto.json.JsonObject; -import org.eclipse.ditto.base.model.common.HttpStatus; -import org.eclipse.ditto.base.model.headers.DittoHeaders; import org.eclipse.ditto.jwt.model.JsonWebToken; -import org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException; +import org.eclipse.ditto.placeholders.UnresolvedPlaceholderException; import org.eclipse.ditto.policies.model.Label; import org.eclipse.ditto.policies.model.PoliciesModelFactory; import org.eclipse.ditto.policies.model.PolicyEntry; @@ -39,8 +40,6 @@ import org.eclipse.ditto.policies.model.SubjectExpiry; import org.eclipse.ditto.policies.model.SubjectId; import org.eclipse.ditto.policies.model.Subjects; -import org.eclipse.ditto.protocol.HeaderTranslator; -import org.eclipse.ditto.gateway.service.endpoints.routes.AbstractRoute; import org.eclipse.ditto.policies.model.signals.commands.actions.ActivateTokenIntegration; import org.eclipse.ditto.policies.model.signals.commands.actions.DeactivateTokenIntegration; import org.eclipse.ditto.policies.model.signals.commands.exceptions.PolicyActionFailedException; @@ -59,6 +58,7 @@ import org.eclipse.ditto.policies.model.signals.commands.query.RetrieveResources; import org.eclipse.ditto.policies.model.signals.commands.query.RetrieveSubject; import org.eclipse.ditto.policies.model.signals.commands.query.RetrieveSubjects; +import org.eclipse.ditto.protocol.HeaderTranslator; import akka.actor.ActorRef; import akka.actor.ActorSystem; diff --git a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/TokenIntegrationSubjectIdFactory.java b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/TokenIntegrationSubjectIdFactory.java index e74a8b4e6e..aaa9142f8e 100755 --- a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/TokenIntegrationSubjectIdFactory.java +++ b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/TokenIntegrationSubjectIdFactory.java @@ -29,7 +29,7 @@ public interface TokenIntegrationSubjectIdFactory { * @param dittoHeaders the Ditto headers. * @param jwt the JWT. * @return the computed subject IDs. - * @throws org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException if mandatory placeholders could not + * @throws org.eclipse.ditto.placeholders.UnresolvedPlaceholderException if mandatory placeholders could not * be resolved within the configured {@code subjectTemplate} of this TokenIntegrationSubjectIdFactory. */ Set getSubjectIds(DittoHeaders dittoHeaders, JsonWebToken jwt); diff --git a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/sse/ThingsSseRouteBuilder.java b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/sse/ThingsSseRouteBuilder.java index e59ac4ac26..af851227e0 100644 --- a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/sse/ThingsSseRouteBuilder.java +++ b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/sse/ThingsSseRouteBuilder.java @@ -55,6 +55,8 @@ import org.eclipse.ditto.internal.utils.search.SearchSource; import org.eclipse.ditto.json.JsonFieldSelector; import org.eclipse.ditto.json.JsonObject; +import org.eclipse.ditto.protocol.adapter.DittoProtocolAdapter; +import org.eclipse.ditto.protocol.placeholders.TopicPathPlaceholder; import org.eclipse.ditto.rql.parser.RqlPredicateParser; import org.eclipse.ditto.rql.query.filter.QueryFilterCriteriaFactory; import org.eclipse.ditto.things.model.Thing; @@ -105,6 +107,8 @@ public final class ThingsSseRouteBuilder extends RouteDirectives implements SseR private static final Counter THINGS_SSE_COUNTER = getCounterFor(PATH_THINGS); private static final Counter SEARCH_SSE_COUNTER = getCounterFor(PATH_SEARCH); + private static final DittoProtocolAdapter PROTOCOL_ADAPTER = DittoProtocolAdapter.newInstance(); + /** * Timeout asking the local streaming actor. */ @@ -149,7 +153,8 @@ public static ThingsSseRouteBuilder getInstance(final ActorRef streamingActor, final ActorRef pubSubMediator) { checkNotNull(streamingActor, "streamingActor"); final var queryFilterCriteriaFactory = - QueryFilterCriteriaFactory.modelBased(RqlPredicateParser.getInstance()); + QueryFilterCriteriaFactory.modelBased(RqlPredicateParser.getInstance(), + TopicPathPlaceholder.getInstance()); return new ThingsSseRouteBuilder(streamingActor, streamingConfig, queryFilterCriteriaFactory, pubSubMediator); } @@ -370,7 +375,8 @@ private CompletionStage> postprocess(final SessionedJsoni .map(session -> jsonifiable.retrieveExtraFields(facade) .thenApply(extra -> Optional.of(session.mergeThingWithExtra(event, extra)) - .filter(session::matchesFilter) + .filter(thing -> session.matchesFilter(thing, + PROTOCOL_ADAPTER.toTopicPath(event))) .map(thing -> toNonemptyThingJson(thing, event, fields)) .orElseGet(Collections::emptyList) ) diff --git a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/websocket/WebSocketRoute.java b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/websocket/WebSocketRoute.java index 99d9886095..348f0893e2 100755 --- a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/websocket/WebSocketRoute.java +++ b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/endpoints/routes/websocket/WebSocketRoute.java @@ -85,6 +85,7 @@ import org.eclipse.ditto.protocol.HeaderTranslator; import org.eclipse.ditto.protocol.JsonifiableAdaptable; import org.eclipse.ditto.protocol.ProtocolFactory; +import org.eclipse.ditto.protocol.TopicPath; import org.eclipse.ditto.protocol.adapter.ProtocolAdapter; import org.eclipse.ditto.things.model.ThingId; import org.eclipse.ditto.things.model.signals.commands.ThingErrorResponse; @@ -670,7 +671,7 @@ private Function>> post final Adaptable adaptable = jsonifiableToAdaptable(jsonifiable, adapter); final CompletionStage extraFuture = sessionedJsonifiable.retrieveExtraFields(facade); return extraFuture.>thenApply(extra -> { - if (matchesFilter(sessionedJsonifiable, extra)) { + if (matchesFilter(sessionedJsonifiable, adaptable.getTopicPath(), extra)) { return Collections.singletonList(toJsonStringWithExtra(adaptable, extra)); } issuePotentialWeakAcknowledgements(sessionedJsonifiable); @@ -689,15 +690,13 @@ private void issuePotentialWeakAcknowledgements(final SessionedJsonifiable sessi final Jsonifiable.WithPredicate jsonifiable = sessionedJsonifiable.getJsonifiable(); final ActorRef streamingSessionActor = session.getStreamingSessionActor(); - WithEntityId.getEntityIdOfType(EntityId.class, jsonifiable).ifPresent(entityId -> { - if (entityId instanceof EntityId) { + WithEntityId.getEntityIdOfType(EntityId.class, jsonifiable).ifPresent(entityId -> dittoHeaders.getAcknowledgementRequests() - .stream() - .map(request -> weakAck(request.getLabel(), entityId, dittoHeaders)) - .map(IncomingSignal::of) - .forEach(weakAck -> streamingSessionActor.tell(weakAck, ActorRef.noSender())); - } - }); + .stream() + .map(request -> weakAck(request.getLabel(), entityId, dittoHeaders)) + .map(IncomingSignal::of) + .forEach(weakAck -> streamingSessionActor.tell(weakAck, ActorRef.noSender())) + ); }); } @@ -743,16 +742,19 @@ private static String toJsonStringWithExtra(final Adaptable adaptable, final Jso * Always return true for Jsonifiables without any session, e. g., errors, responses, stream control messages. * * @param sessionedJsonifiable the Jsonifiable with session information attached. + * @param topicPath the topic path of the Jsonifiable to process. * @param extra extra fields from signal enrichment. * @return whether the Jsonifiable passes filter defined in the session together with the extra fields. */ - private static boolean matchesFilter(final SessionedJsonifiable sessionedJsonifiable, final JsonObject extra) { + private static boolean matchesFilter(final SessionedJsonifiable sessionedJsonifiable, + final TopicPath topicPath, + final JsonObject extra) { final Jsonifiable.WithPredicate jsonifiable = sessionedJsonifiable.getJsonifiable(); return sessionedJsonifiable.getSession() .filter(session -> jsonifiable instanceof Signal) .map(session -> // evaluate to false if filter is present but does not match or has insufficient info to match - session.matchesFilter(session.mergeThingWithExtra((Signal) jsonifiable, extra)) + session.matchesFilter(session.mergeThingWithExtra((Signal) jsonifiable, extra), topicPath) ) .orElse(true); } diff --git a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/security/authentication/jwt/DittoJwtAuthorizationSubjectsProvider.java b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/security/authentication/jwt/DittoJwtAuthorizationSubjectsProvider.java index 49638866c7..775eee9a6c 100644 --- a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/security/authentication/jwt/DittoJwtAuthorizationSubjectsProvider.java +++ b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/security/authentication/jwt/DittoJwtAuthorizationSubjectsProvider.java @@ -23,12 +23,12 @@ import javax.annotation.concurrent.Immutable; import org.eclipse.ditto.base.model.auth.AuthorizationSubject; +import org.eclipse.ditto.base.model.signals.commands.exceptions.GatewayJwtIssuerNotSupportedException; import org.eclipse.ditto.jwt.model.JsonWebToken; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; -import org.eclipse.ditto.internal.models.placeholders.PipelineElement; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.ExpressionResolver; +import org.eclipse.ditto.placeholders.PipelineElement; +import org.eclipse.ditto.placeholders.PlaceholderFactory; import org.eclipse.ditto.policies.model.SubjectId; -import org.eclipse.ditto.base.model.signals.commands.exceptions.GatewayJwtIssuerNotSupportedException; /** * Implementation of {@link JwtAuthorizationSubjectsProvider} for Google JWTs. diff --git a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/security/authentication/jwt/JwtPlaceholder.java b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/security/authentication/jwt/JwtPlaceholder.java index b39e963204..d2888c4d1d 100644 --- a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/security/authentication/jwt/JwtPlaceholder.java +++ b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/security/authentication/jwt/JwtPlaceholder.java @@ -24,7 +24,7 @@ import org.eclipse.ditto.json.JsonArray; import org.eclipse.ditto.json.JsonValue; import org.eclipse.ditto.jwt.model.JsonWebToken; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; +import org.eclipse.ditto.placeholders.Placeholder; /** * The placeholder that replaces {@code jwt:}. diff --git a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/streaming/actors/StreamingSession.java b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/streaming/actors/StreamingSession.java index eed98cee2f..35f0490902 100644 --- a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/streaming/actors/StreamingSession.java +++ b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/streaming/actors/StreamingSession.java @@ -14,13 +14,16 @@ import java.util.List; import java.util.Optional; -import java.util.function.Predicate; +import java.util.function.BiPredicate; import javax.annotation.Nullable; import org.eclipse.ditto.base.model.signals.Signal; import org.eclipse.ditto.internal.utils.akka.logging.ThreadSafeDittoLoggingAdapter; import org.eclipse.ditto.json.JsonObject; +import org.eclipse.ditto.placeholders.PlaceholderFactory; +import org.eclipse.ditto.protocol.TopicPath; +import org.eclipse.ditto.protocol.placeholders.TopicPathPlaceholder; import org.eclipse.ditto.rql.query.criteria.Criteria; import org.eclipse.ditto.rql.query.things.ThingPredicateVisitor; import org.eclipse.ditto.things.model.Thing; @@ -34,8 +37,10 @@ */ public final class StreamingSession { + private static final TopicPathPlaceholder TOPIC_PATH_PLACEHOLDER = TopicPathPlaceholder.getInstance(); + private final List namespaces; - private final Predicate thingPredicate; + private final BiPredicate thingPredicate; @Nullable private final ThingFieldSelector extraFields; private final ActorRef streamingSessionActor; private final ThreadSafeDittoLoggingAdapter logger; @@ -45,8 +50,11 @@ private StreamingSession(final List namespaces, @Nullable final Criteria final ThreadSafeDittoLoggingAdapter logger) { this.namespaces = namespaces; thingPredicate = eventFilterCriteria == null - ? thing -> true - : ThingPredicateVisitor.apply(eventFilterCriteria); + ? (thing, topicPath) -> true + : (thing, topicPath) -> ThingPredicateVisitor.apply(eventFilterCriteria, + PlaceholderFactory.newPlaceholderResolver(TOPIC_PATH_PLACEHOLDER, topicPath) + ) + .test(thing); this.extraFields = extraFields; this.streamingSessionActor = streamingSessionActor; this.logger = logger; @@ -90,10 +98,11 @@ public Thing mergeThingWithExtra(final Signal signal, final JsonObject extra) * Test whether a thing matches the filter defined in this session. * * @param thing the thing. + * @param topicPath the topic path to include for checking whether the filter matches. * @return whether the thing passes the filter. */ - public boolean matchesFilter(final Thing thing) { - return thingPredicate.test(thing); + public boolean matchesFilter(final Thing thing, final TopicPath topicPath) { + return thingPredicate.test(thing, topicPath); } public ActorRef getStreamingSessionActor() { diff --git a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/streaming/actors/StreamingSessionActor.java b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/streaming/actors/StreamingSessionActor.java index fb9c23b171..3f378e2447 100755 --- a/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/streaming/actors/StreamingSessionActor.java +++ b/gateway/service/src/main/java/org/eclipse/ditto/gateway/service/streaming/actors/StreamingSessionActor.java @@ -68,6 +68,7 @@ import org.eclipse.ditto.policies.model.signals.announcements.PolicyAnnouncement; import org.eclipse.ditto.protocol.HeaderTranslator; import org.eclipse.ditto.protocol.TopicPath; +import org.eclipse.ditto.protocol.placeholders.TopicPathPlaceholder; import org.eclipse.ditto.rql.parser.RqlPredicateParser; import org.eclipse.ditto.rql.query.criteria.Criteria; import org.eclipse.ditto.rql.query.filter.QueryFilterCriteriaFactory; @@ -659,7 +660,8 @@ private static String namespaceFromId(final Signal signal) { private static Criteria parseCriteria(final String filter, final DittoHeaders dittoHeaders) { final var queryFilterCriteriaFactory = - QueryFilterCriteriaFactory.modelBased(RqlPredicateParser.getInstance()); + QueryFilterCriteriaFactory.modelBased(RqlPredicateParser.getInstance(), + TopicPathPlaceholder.getInstance()); return queryFilterCriteriaFactory.filterCriteria(filter, dittoHeaders); } diff --git a/gateway/service/src/test/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/OAuthTokenIntegrationSubjectIdFactoryTest.java b/gateway/service/src/test/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/OAuthTokenIntegrationSubjectIdFactoryTest.java index e415d83306..386911b83e 100644 --- a/gateway/service/src/test/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/OAuthTokenIntegrationSubjectIdFactoryTest.java +++ b/gateway/service/src/test/java/org/eclipse/ditto/gateway/service/endpoints/routes/policies/OAuthTokenIntegrationSubjectIdFactoryTest.java @@ -19,7 +19,7 @@ import org.assertj.core.api.Assertions; import org.eclipse.ditto.base.model.headers.DittoHeaders; import org.eclipse.ditto.gateway.service.util.config.security.DefaultOAuthConfig; -import org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException; +import org.eclipse.ditto.placeholders.UnresolvedPlaceholderException; import org.eclipse.ditto.policies.model.SubjectId; import org.junit.Test; diff --git a/gateway/service/src/test/java/org/eclipse/ditto/gateway/service/starter/GatewayServiceGlobalErrorRegistryTest.java b/gateway/service/src/test/java/org/eclipse/ditto/gateway/service/starter/GatewayServiceGlobalErrorRegistryTest.java index 33a444da44..2c7d5bd0e6 100644 --- a/gateway/service/src/test/java/org/eclipse/ditto/gateway/service/starter/GatewayServiceGlobalErrorRegistryTest.java +++ b/gateway/service/src/test/java/org/eclipse/ditto/gateway/service/starter/GatewayServiceGlobalErrorRegistryTest.java @@ -18,27 +18,27 @@ import org.eclipse.ditto.base.model.exceptions.CloudEventNotParsableException; import org.eclipse.ditto.base.model.exceptions.CloudEventUnsupportedDataSchemaException; import org.eclipse.ditto.base.model.exceptions.DittoHeaderInvalidException; -import org.eclipse.ditto.connectivity.model.ConnectionConfigurationInvalidException; -import org.eclipse.ditto.gateway.service.security.authentication.jwt.PublicKeyProviderUnavailableException; -import org.eclipse.ditto.jwt.model.JwtAudienceInvalidException; -import org.eclipse.ditto.messages.model.AuthorizationSubjectBlockedException; import org.eclipse.ditto.base.model.namespaces.NamespaceBlockedException; -import org.eclipse.ditto.protocol.adapter.UnknownTopicPathException; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFunctionSignatureInvalidException; -import org.eclipse.ditto.policies.model.PolicyEntryInvalidException; -import org.eclipse.ditto.policies.model.PolicyIdInvalidException; -import org.eclipse.ditto.things.model.ThingIdInvalidException; -import org.eclipse.ditto.protocol.UnknownCommandException; -import org.eclipse.ditto.internal.utils.test.GlobalErrorRegistryTestCases; -import org.eclipse.ditto.base.model.signals.acks.AcknowledgementCorrelationIdMissingException; import org.eclipse.ditto.base.model.signals.JsonTypeNotParsableException; import org.eclipse.ditto.base.model.signals.UnsupportedSchemaVersionException; import org.eclipse.ditto.base.model.signals.UnsupportedSignalException; +import org.eclipse.ditto.base.model.signals.acks.AcknowledgementCorrelationIdMissingException; import org.eclipse.ditto.base.model.signals.commands.CommandNotSupportedException; import org.eclipse.ditto.base.model.signals.commands.exceptions.GatewayAuthenticationFailedException; import org.eclipse.ditto.base.model.signals.commands.exceptions.PathUnknownException; +import org.eclipse.ditto.connectivity.model.ConnectionConfigurationInvalidException; import org.eclipse.ditto.connectivity.model.signals.commands.exceptions.ConnectionConflictException; +import org.eclipse.ditto.gateway.service.security.authentication.jwt.PublicKeyProviderUnavailableException; +import org.eclipse.ditto.internal.utils.test.GlobalErrorRegistryTestCases; +import org.eclipse.ditto.jwt.model.JwtAudienceInvalidException; +import org.eclipse.ditto.messages.model.AuthorizationSubjectBlockedException; +import org.eclipse.ditto.placeholders.PlaceholderFunctionSignatureInvalidException; +import org.eclipse.ditto.policies.model.PolicyEntryInvalidException; +import org.eclipse.ditto.policies.model.PolicyIdInvalidException; import org.eclipse.ditto.policies.model.signals.commands.exceptions.PolicyConflictException; +import org.eclipse.ditto.protocol.UnknownCommandException; +import org.eclipse.ditto.protocol.adapter.UnknownTopicPathException; +import org.eclipse.ditto.things.model.ThingIdInvalidException; import org.eclipse.ditto.things.model.signals.commands.exceptions.AttributePointerInvalidException; import org.eclipse.ditto.thingsearch.model.signals.commands.exceptions.InvalidNamespacesException; diff --git a/internal/models/placeholders/pom.xml b/internal/models/placeholders/pom.xml deleted file mode 100755 index 6c9c4ad6bc..0000000000 --- a/internal/models/placeholders/pom.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - 4.0.0 - - - org.eclipse.ditto - ditto-internal-models - ${revision} - - - ditto-internal-models-placeholders - Eclipse Ditto :: Internal :: Models :: Placeholders - - - - - org.eclipse.ditto - ditto-base-model - test-jar - test - - - - diff --git a/internal/models/pom.xml b/internal/models/pom.xml index e8b09d7e12..955b04f0b4 100755 --- a/internal/models/pom.xml +++ b/internal/models/pom.xml @@ -29,7 +29,6 @@ acks signalenrichment streaming - placeholders diff --git a/placeholders/pom.xml b/placeholders/pom.xml new file mode 100755 index 0000000000..b1e76ee2f3 --- /dev/null +++ b/placeholders/pom.xml @@ -0,0 +1,86 @@ + + + + 4.0.0 + + + ditto-bom + org.eclipse.ditto + ${revision} + ../bom/pom.xml + + + ditto-placeholders + Eclipse Ditto :: Placeholders + + + + + org.eclipse.ditto + ditto-json + + + org.eclipse.ditto + ditto-base-model + + + + + com.google.code.findbugs + jsr305 + provided + + + org.eclipse.ditto + ditto-utils-jsr305 + provided + + + + + org.eclipse.ditto + ditto-base-model + test-jar + test + + + junit + junit + test + + + org.mockito + mockito-core + test + + + org.assertj + assertj-core + test + + + org.mutabilitydetector + MutabilityDetector + test + + + nl.jqno.equalsverifier + equalsverifier + test + + + + diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/Expression.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/Expression.java similarity index 90% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/Expression.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/Expression.java index 1abbd6c063..1856dc544f 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/Expression.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/Expression.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.List; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ExpressionResolver.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/ExpressionResolver.java similarity index 98% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ExpressionResolver.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/ExpressionResolver.java index 207335deb7..864b9c63f2 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ExpressionResolver.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/ExpressionResolver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.Collection; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/FunctionExpression.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/FunctionExpression.java similarity index 93% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/FunctionExpression.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/FunctionExpression.java index da3c1289c4..d07ba55094 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/FunctionExpression.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/FunctionExpression.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; /** * Defines a function expression used in a Pipeline after the "input" stage of a resolved {@link Placeholder}, e.g. diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/HeadersPlaceholder.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/HeadersPlaceholder.java similarity index 82% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/HeadersPlaceholder.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/HeadersPlaceholder.java index d163507fa4..87aae103e2 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/HeadersPlaceholder.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/HeadersPlaceholder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.Map; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ImmutableExpressionResolver.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutableExpressionResolver.java similarity index 97% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ImmutableExpressionResolver.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutableExpressionResolver.java index e88f3efae4..ca1c423381 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ImmutableExpressionResolver.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutableExpressionResolver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,9 +10,9 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; -import static org.eclipse.ditto.internal.models.placeholders.Expression.SEPARATOR; +import static org.eclipse.ditto.placeholders.Expression.SEPARATOR; import java.util.AbstractMap; import java.util.ArrayList; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ImmutableFunctionExpression.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutableFunctionExpression.java similarity index 96% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ImmutableFunctionExpression.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutableFunctionExpression.java index 84feb1bd43..48b3545f81 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ImmutableFunctionExpression.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutableFunctionExpression.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.Arrays; import java.util.Collections; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ImmutableHeadersPlaceholder.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutableHeadersPlaceholder.java similarity index 93% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ImmutableHeadersPlaceholder.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutableHeadersPlaceholder.java index c0b5c394eb..2beb0585c1 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ImmutableHeadersPlaceholder.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutableHeadersPlaceholder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.Collections; import java.util.List; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ImmutablePipeline.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutablePipeline.java similarity index 94% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ImmutablePipeline.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutablePipeline.java index 9b534df0fc..a9ba609da8 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ImmutablePipeline.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutablePipeline.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,9 +10,9 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; -import static org.eclipse.ditto.internal.models.placeholders.FunctionExpression.SEPARATOR; +import static org.eclipse.ditto.placeholders.FunctionExpression.SEPARATOR; import java.util.ArrayList; import java.util.Collections; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ImmutablePipelineElementVisitor.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutablePipelineElementVisitor.java similarity index 95% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ImmutablePipelineElementVisitor.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutablePipelineElementVisitor.java index 18c3be0edf..5a3c798453 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ImmutablePipelineElementVisitor.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutablePipelineElementVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import static org.eclipse.ditto.base.model.common.ConditionChecker.checkNotNull; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ImmutablePlaceholderResolver.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutablePlaceholderResolver.java similarity index 95% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ImmutablePlaceholderResolver.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutablePlaceholderResolver.java index 225f47d233..bee267fe61 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/ImmutablePlaceholderResolver.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/ImmutablePlaceholderResolver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.List; import java.util.Objects; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/Pipeline.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/Pipeline.java similarity index 92% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/Pipeline.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/Pipeline.java index a1c0036ad6..c2e403bab6 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/Pipeline.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/Pipeline.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; /** * A Pipeline is able to execute its {@code stageExpressions} starting with a {@code pipelineInput} derived from a diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineElement.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineElement.java similarity index 97% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineElement.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineElement.java index eac871d880..cb936e9837 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineElement.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineElement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.Optional; import java.util.function.Function; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineElementDeleted.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineElementDeleted.java similarity index 93% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineElementDeleted.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineElementDeleted.java index 2e06f3d4a9..aa26defcb9 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineElementDeleted.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineElementDeleted.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.Collections; import java.util.Iterator; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineElementResolved.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineElementResolved.java similarity index 94% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineElementResolved.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineElementResolved.java index 3067811abf..bfad8b4ebd 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineElementResolved.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineElementResolved.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.Collections; import java.util.Iterator; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineElementUnresolved.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineElementUnresolved.java similarity index 93% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineElementUnresolved.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineElementUnresolved.java index d7bfb1c609..19054cf514 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineElementUnresolved.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineElementUnresolved.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.Collections; import java.util.Iterator; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineElementVisitor.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineElementVisitor.java similarity index 94% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineElementVisitor.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineElementVisitor.java index ac01c15f85..85ee1d5381 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineElementVisitor.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineElementVisitor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.function.Function; import java.util.function.Supplier; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunction.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunction.java similarity index 96% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunction.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunction.java index 0b29ad42a1..585fd9d21d 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunction.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.List; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionDefault.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionDefault.java similarity index 96% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionDefault.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionDefault.java index 3bdaf4ef61..9b57fa2022 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionDefault.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionDefault.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.Collections; import java.util.List; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionDelete.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionDelete.java similarity index 94% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionDelete.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionDelete.java index e915a2d0b4..bd0ee97df8 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionDelete.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionDelete.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.Collections; import java.util.List; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionFilter.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionFilter.java similarity index 96% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionFilter.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionFilter.java index 48411e8a10..ad6608c4e3 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionFilter.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import static org.eclipse.ditto.base.model.common.ConditionChecker.checkNotNull; @@ -22,8 +22,8 @@ import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; -import org.eclipse.ditto.internal.models.placeholders.filter.FilterFunction; -import org.eclipse.ditto.internal.models.placeholders.filter.FilterFunctions; +import org.eclipse.ditto.placeholders.filter.FilterFunction; +import org.eclipse.ditto.placeholders.filter.FilterFunctions; /** * Provides the {@code fn:filter(filterValue, rqlFunction, comparedValue)} function implementation. diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionLower.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionLower.java similarity index 94% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionLower.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionLower.java index 37fea5fa9c..a9bfeb2f3d 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionLower.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionLower.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.Collections; import java.util.List; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionParameterResolverFactory.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionParameterResolverFactory.java similarity index 99% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionParameterResolverFactory.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionParameterResolverFactory.java index a13a0e720d..7c1b1ab5c8 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionParameterResolverFactory.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionParameterResolverFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.text.MessageFormat; import java.util.ArrayList; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionSubstringAfter.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionSubstringAfter.java similarity index 96% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionSubstringAfter.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionSubstringAfter.java index d8059a14c3..a162b386b4 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionSubstringAfter.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionSubstringAfter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.Collections; import java.util.List; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionSubstringBefore.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionSubstringBefore.java similarity index 96% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionSubstringBefore.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionSubstringBefore.java index 702c7192cd..25551f8f9a 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionSubstringBefore.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionSubstringBefore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.Collections; import java.util.List; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionUpper.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionUpper.java similarity index 94% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionUpper.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionUpper.java index 5175c93423..b61b525d69 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionUpper.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PipelineFunctionUpper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.Collections; import java.util.List; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/Placeholder.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/Placeholder.java similarity index 89% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/Placeholder.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/Placeholder.java index 2e9b9d392f..3f035e7fb5 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/Placeholder.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/Placeholder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.Optional; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderException.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderException.java similarity index 85% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderException.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderException.java index 7056b313ac..fb1d723538 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderException.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; /** * Aggregates all {@link org.eclipse.ditto.base.model.exceptions.DittoRuntimeException}s which are thrown in scope diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderFactory.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderFactory.java similarity index 97% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderFactory.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderFactory.java index ed39e335e4..e01bb529fd 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderFactory.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.Arrays; import java.util.Collections; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderFilter.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderFilter.java similarity index 98% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderFilter.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderFilter.java index 97644e5fc0..0ef6e098be 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderFilter.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.List; import java.util.Map; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderFunctionSignatureInvalidException.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderFunctionSignatureInvalidException.java similarity index 97% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderFunctionSignatureInvalidException.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderFunctionSignatureInvalidException.java index b1e721d9db..baf10d4b1d 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderFunctionSignatureInvalidException.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderFunctionSignatureInvalidException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.net.URI; import java.text.MessageFormat; @@ -19,12 +19,12 @@ import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.NotThreadSafe; -import org.eclipse.ditto.json.JsonObject; import org.eclipse.ditto.base.model.common.HttpStatus; import org.eclipse.ditto.base.model.exceptions.DittoRuntimeException; import org.eclipse.ditto.base.model.exceptions.DittoRuntimeExceptionBuilder; import org.eclipse.ditto.base.model.headers.DittoHeaders; import org.eclipse.ditto.base.model.json.JsonParsableException; +import org.eclipse.ditto.json.JsonObject; /** * Thrown when a {@link PipelineFunction}s signature was invalid (e.g. too many, to few parameters, wrong type, diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderFunctionTooComplexException.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderFunctionTooComplexException.java similarity index 97% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderFunctionTooComplexException.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderFunctionTooComplexException.java index b76747d0b1..2b43100c56 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderFunctionTooComplexException.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderFunctionTooComplexException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.net.URI; import java.text.MessageFormat; @@ -19,12 +19,12 @@ import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.NotThreadSafe; -import org.eclipse.ditto.json.JsonObject; import org.eclipse.ditto.base.model.common.HttpStatus; import org.eclipse.ditto.base.model.exceptions.DittoRuntimeException; import org.eclipse.ditto.base.model.exceptions.DittoRuntimeExceptionBuilder; import org.eclipse.ditto.base.model.headers.DittoHeaders; import org.eclipse.ditto.base.model.json.JsonParsableException; +import org.eclipse.ditto.json.JsonObject; /** * Thrown when a the placeholder functions in a {@link Pipeline} get too complex (e.g. too many chained function calls) diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderFunctionUnknownException.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderFunctionUnknownException.java similarity index 97% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderFunctionUnknownException.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderFunctionUnknownException.java index 4a859efc6b..af7907367b 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderFunctionUnknownException.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderFunctionUnknownException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.net.URI; import java.text.MessageFormat; @@ -19,12 +19,12 @@ import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.NotThreadSafe; -import org.eclipse.ditto.json.JsonObject; import org.eclipse.ditto.base.model.common.HttpStatus; import org.eclipse.ditto.base.model.exceptions.DittoRuntimeException; import org.eclipse.ditto.base.model.exceptions.DittoRuntimeExceptionBuilder; import org.eclipse.ditto.base.model.headers.DittoHeaders; import org.eclipse.ditto.base.model.json.JsonParsableException; +import org.eclipse.ditto.json.JsonObject; /** * Thrown when a {@link PipelineFunction}s is not known. diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderResolver.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderResolver.java similarity index 92% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderResolver.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderResolver.java index 6144fe5ca3..98c18f9ac0 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderResolver.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/PlaceholderResolver.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.util.Optional; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/UnresolvedPlaceholderException.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/UnresolvedPlaceholderException.java similarity index 97% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/UnresolvedPlaceholderException.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/UnresolvedPlaceholderException.java index c7571a60d8..c5c6595ff0 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/UnresolvedPlaceholderException.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/UnresolvedPlaceholderException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2019 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import java.net.URI; import java.text.MessageFormat; @@ -19,12 +19,12 @@ import javax.annotation.concurrent.Immutable; import javax.annotation.concurrent.NotThreadSafe; -import org.eclipse.ditto.json.JsonObject; import org.eclipse.ditto.base.model.common.HttpStatus; import org.eclipse.ditto.base.model.exceptions.DittoRuntimeException; import org.eclipse.ditto.base.model.exceptions.DittoRuntimeExceptionBuilder; import org.eclipse.ditto.base.model.headers.DittoHeaders; import org.eclipse.ditto.base.model.json.JsonParsableException; +import org.eclipse.ditto.json.JsonObject; /** * Thrown if a placeholder could not be resolved. diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/filter/EqFunction.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/filter/EqFunction.java similarity index 86% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/filter/EqFunction.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/filter/EqFunction.java index 0abbccda0d..109d2626b8 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/filter/EqFunction.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/filter/EqFunction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders.filter; +package org.eclipse.ditto.placeholders.filter; import java.util.Objects; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/filter/ExistsFunction.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/filter/ExistsFunction.java similarity index 94% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/filter/ExistsFunction.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/filter/ExistsFunction.java index 416fe30125..2cb84efcfb 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/filter/ExistsFunction.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/filter/ExistsFunction.java @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders.filter; +package org.eclipse.ditto.placeholders.filter; /** * Keeps the value if passed parameters is not empty. diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/filter/FilterFunction.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/filter/FilterFunction.java similarity index 87% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/filter/FilterFunction.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/filter/FilterFunction.java index 034bbee3c8..c750946792 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/filter/FilterFunction.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/filter/FilterFunction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders.filter; +package org.eclipse.ditto.placeholders.filter; /** * Represents a function that can be used for filtering mechanisms. diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/filter/FilterFunctions.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/filter/FilterFunctions.java similarity index 92% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/filter/FilterFunctions.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/filter/FilterFunctions.java index f18bf83bdd..8d164b3901 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/filter/FilterFunctions.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/filter/FilterFunctions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders.filter; +package org.eclipse.ditto.placeholders.filter; import java.util.Arrays; import java.util.Optional; @@ -62,7 +62,7 @@ public enum FilterFunctions implements FilterFunction { public static Optional fromName(final String functionName) { return Arrays.stream(FilterFunctions.values()) .filter(rqlFunctions -> rqlFunctions.rqlFunction.getName().equals(functionName)) - .map(filterFunctions -> (FilterFunction) filterFunctions) + .map(FilterFunction.class::cast) .findAny(); } diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/filter/LikeFunction.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/filter/LikeFunction.java similarity index 90% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/filter/LikeFunction.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/filter/LikeFunction.java index 76c055edd3..811753ecf4 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/filter/LikeFunction.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/filter/LikeFunction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders.filter; +package org.eclipse.ditto.placeholders.filter; import java.util.regex.Pattern; diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/filter/NeFunction.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/filter/NeFunction.java similarity index 86% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/filter/NeFunction.java rename to placeholders/src/main/java/org/eclipse/ditto/placeholders/filter/NeFunction.java index 8fe541a3b9..a10c6d3013 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/filter/NeFunction.java +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/filter/NeFunction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders.filter; +package org.eclipse.ditto.placeholders.filter; import java.util.Objects; diff --git a/placeholders/src/main/java/org/eclipse/ditto/placeholders/package-info.java b/placeholders/src/main/java/org/eclipse/ditto/placeholders/package-info.java new file mode 100644 index 0000000000..d1b6b2c928 --- /dev/null +++ b/placeholders/src/main/java/org/eclipse/ditto/placeholders/package-info.java @@ -0,0 +1,22 @@ +/* + * Copyright (c) 2021 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ + +/** + * Module containing models for {@link org.eclipse.ditto.placeholders.Placeholder} expressions in the format + * {@code prefix:name} including pipelines + expressions to resolve placeholders. + *

+ * Main entry point: {@link org.eclipse.ditto.placeholders.PlaceholderFactory} + *

+ */ +@org.eclipse.ditto.utils.jsr305.annotations.AllParametersAndReturnValuesAreNonnullByDefault +package org.eclipse.ditto.placeholders; \ No newline at end of file diff --git a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/ExpressionResolverTest.java b/placeholders/src/test/java/org/eclipse/ditto/placeholders/ExpressionResolverTest.java similarity index 97% rename from internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/ExpressionResolverTest.java rename to placeholders/src/test/java/org/eclipse/ditto/placeholders/ExpressionResolverTest.java index 7935c1591a..45788b4b3a 100644 --- a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/ExpressionResolverTest.java +++ b/placeholders/src/test/java/org/eclipse/ditto/placeholders/ExpressionResolverTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/ImmutableExpressionResolverTest.java b/placeholders/src/test/java/org/eclipse/ditto/placeholders/ImmutableExpressionResolverTest.java similarity index 98% rename from internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/ImmutableExpressionResolverTest.java rename to placeholders/src/test/java/org/eclipse/ditto/placeholders/ImmutableExpressionResolverTest.java index a1883a795b..c35c61ea50 100644 --- a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/ImmutableExpressionResolverTest.java +++ b/placeholders/src/test/java/org/eclipse/ditto/placeholders/ImmutableExpressionResolverTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/ImmutableFunctionExpressionTest.java b/placeholders/src/test/java/org/eclipse/ditto/placeholders/ImmutableFunctionExpressionTest.java similarity index 98% rename from internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/ImmutableFunctionExpressionTest.java rename to placeholders/src/test/java/org/eclipse/ditto/placeholders/ImmutableFunctionExpressionTest.java index 87a2725ab6..1f2e32a247 100644 --- a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/ImmutableFunctionExpressionTest.java +++ b/placeholders/src/test/java/org/eclipse/ditto/placeholders/ImmutableFunctionExpressionTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/ImmutableHeadersPlaceholderTest.java b/placeholders/src/test/java/org/eclipse/ditto/placeholders/ImmutableHeadersPlaceholderTest.java similarity index 95% rename from internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/ImmutableHeadersPlaceholderTest.java rename to placeholders/src/test/java/org/eclipse/ditto/placeholders/ImmutableHeadersPlaceholderTest.java index c811d5903e..f2201a5114 100644 --- a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/ImmutableHeadersPlaceholderTest.java +++ b/placeholders/src/test/java/org/eclipse/ditto/placeholders/ImmutableHeadersPlaceholderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/ImmutablePipelineTest.java b/placeholders/src/test/java/org/eclipse/ditto/placeholders/ImmutablePipelineTest.java similarity index 97% rename from internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/ImmutablePipelineTest.java rename to placeholders/src/test/java/org/eclipse/ditto/placeholders/ImmutablePipelineTest.java index 2e2cc87801..b952f26c7b 100644 --- a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/ImmutablePipelineTest.java +++ b/placeholders/src/test/java/org/eclipse/ditto/placeholders/ImmutablePipelineTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; diff --git a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/ImmutablePlaceholderResolverTest.java b/placeholders/src/test/java/org/eclipse/ditto/placeholders/ImmutablePlaceholderResolverTest.java similarity index 94% rename from internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/ImmutablePlaceholderResolverTest.java rename to placeholders/src/test/java/org/eclipse/ditto/placeholders/ImmutablePlaceholderResolverTest.java index 06885ac471..f18bc5820b 100644 --- a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/ImmutablePlaceholderResolverTest.java +++ b/placeholders/src/test/java/org/eclipse/ditto/placeholders/ImmutablePlaceholderResolverTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import static org.assertj.core.api.Assertions.assertThat; diff --git a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionDefaultTest.java b/placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionDefaultTest.java similarity index 95% rename from internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionDefaultTest.java rename to placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionDefaultTest.java index 93ed4500c9..e7cd336ac5 100644 --- a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionDefaultTest.java +++ b/placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionDefaultTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.anyString; diff --git a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionFilterTest.java b/placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionFilterTest.java similarity index 98% rename from internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionFilterTest.java rename to placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionFilterTest.java index a20c54be91..e16c88066a 100644 --- a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionFilterTest.java +++ b/placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionFilterTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; diff --git a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionLowerTest.java b/placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionLowerTest.java similarity index 94% rename from internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionLowerTest.java rename to placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionLowerTest.java index b9ba73a43a..c7d8375a00 100644 --- a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionLowerTest.java +++ b/placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionLowerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionParameterResolverFactoryTest.java b/placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionParameterResolverFactoryTest.java similarity index 99% rename from internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionParameterResolverFactoryTest.java rename to placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionParameterResolverFactoryTest.java index 1d7c7942df..1e3af2572d 100644 --- a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionParameterResolverFactoryTest.java +++ b/placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionParameterResolverFactoryTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatExceptionOfType; diff --git a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionSubstringAfterTest.java b/placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionSubstringAfterTest.java similarity index 95% rename from internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionSubstringAfterTest.java rename to placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionSubstringAfterTest.java index 09a61b917b..8417c293a9 100644 --- a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionSubstringAfterTest.java +++ b/placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionSubstringAfterTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionSubstringBeforeTest.java b/placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionSubstringBeforeTest.java similarity index 95% rename from internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionSubstringBeforeTest.java rename to placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionSubstringBeforeTest.java index f7a051b956..bf2af7e461 100644 --- a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionSubstringBeforeTest.java +++ b/placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionSubstringBeforeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionUpperTest.java b/placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionUpperTest.java similarity index 94% rename from internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionUpperTest.java rename to placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionUpperTest.java index 4ce125bfa6..622edb866b 100644 --- a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PipelineFunctionUpperTest.java +++ b/placeholders/src/test/java/org/eclipse/ditto/placeholders/PipelineFunctionUpperTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; diff --git a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderFilterTest.java b/placeholders/src/test/java/org/eclipse/ditto/placeholders/PlaceholderFilterTest.java similarity index 98% rename from internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderFilterTest.java rename to placeholders/src/test/java/org/eclipse/ditto/placeholders/PlaceholderFilterTest.java index 6573e0ecb0..99cf497d2a 100644 --- a/internal/models/placeholders/src/test/java/org/eclipse/ditto/internal/models/placeholders/PlaceholderFilterTest.java +++ b/placeholders/src/test/java/org/eclipse/ditto/placeholders/PlaceholderFilterTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.placeholders; import static org.assertj.core.api.Assertions.assertThat; diff --git a/policies/service/pom.xml b/policies/service/pom.xml index 0eeb93eee6..3fcc89875b 100644 --- a/policies/service/pom.xml +++ b/policies/service/pom.xml @@ -39,6 +39,11 @@ org.eclipse.ditto ditto-policies-api
+ + org.eclipse.ditto + ditto-placeholders + + org.eclipse.ditto ditto-internal-utils-akka @@ -67,11 +72,6 @@ org.eclipse.ditto ditto-internal-utils-pubsub - - - org.eclipse.ditto - ditto-internal-models-placeholders - org.eclipse.ditto ditto-internal-models-acks diff --git a/policies/service/src/main/java/org/eclipse/ditto/policies/service/persistence/actors/resolvers/DefaultSubjectIdFromActionResolver.java b/policies/service/src/main/java/org/eclipse/ditto/policies/service/persistence/actors/resolvers/DefaultSubjectIdFromActionResolver.java index 48bd0210a4..2e5557106e 100644 --- a/policies/service/src/main/java/org/eclipse/ditto/policies/service/persistence/actors/resolvers/DefaultSubjectIdFromActionResolver.java +++ b/policies/service/src/main/java/org/eclipse/ditto/policies/service/persistence/actors/resolvers/DefaultSubjectIdFromActionResolver.java @@ -17,9 +17,9 @@ import java.util.Set; import java.util.stream.Collectors; -import org.eclipse.ditto.internal.models.placeholders.ExpressionResolver; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFactory; -import org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException; +import org.eclipse.ditto.placeholders.ExpressionResolver; +import org.eclipse.ditto.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.UnresolvedPlaceholderException; import org.eclipse.ditto.policies.model.PolicyEntry; import org.eclipse.ditto.policies.model.SubjectId; import org.eclipse.ditto.policies.model.signals.commands.actions.PolicyActionCommand; diff --git a/policies/service/src/main/java/org/eclipse/ditto/policies/service/persistence/actors/resolvers/PolicyEntryPlaceholder.java b/policies/service/src/main/java/org/eclipse/ditto/policies/service/persistence/actors/resolvers/PolicyEntryPlaceholder.java index 198dc3f2ce..8100ee2cb0 100644 --- a/policies/service/src/main/java/org/eclipse/ditto/policies/service/persistence/actors/resolvers/PolicyEntryPlaceholder.java +++ b/policies/service/src/main/java/org/eclipse/ditto/policies/service/persistence/actors/resolvers/PolicyEntryPlaceholder.java @@ -12,11 +12,11 @@ */ package org.eclipse.ditto.policies.service.persistence.actors.resolvers; -import org.eclipse.ditto.internal.models.placeholders.Placeholder; +import org.eclipse.ditto.placeholders.Placeholder; import org.eclipse.ditto.policies.model.PolicyEntry; /** - * A {@link org.eclipse.ditto.internal.models.placeholders.Placeholder} requiring a {@link PolicyEntry} to resolve information of an policy entry. + * A {@link org.eclipse.ditto.placeholders.Placeholder} requiring a {@link PolicyEntry} to resolve information of an policy entry. * * @since 2.0.0 */ diff --git a/policies/service/src/main/java/org/eclipse/ditto/policies/service/persistence/actors/resolvers/SubjectIdFromActionResolver.java b/policies/service/src/main/java/org/eclipse/ditto/policies/service/persistence/actors/resolvers/SubjectIdFromActionResolver.java index 75366b839c..49b92b3e6d 100644 --- a/policies/service/src/main/java/org/eclipse/ditto/policies/service/persistence/actors/resolvers/SubjectIdFromActionResolver.java +++ b/policies/service/src/main/java/org/eclipse/ditto/policies/service/persistence/actors/resolvers/SubjectIdFromActionResolver.java @@ -29,7 +29,7 @@ public interface SubjectIdFromActionResolver { * @param entry the policy entry. * @param command the policy action command. * @return the subject IDs after resolution. - * @throws org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException if one of the subject IDs contains + * @throws org.eclipse.ditto.placeholders.UnresolvedPlaceholderException if one of the subject IDs contains * unsupported placeholders. * @throws org.eclipse.ditto.policies.model.SubjectIdInvalidException if one of the resolved subject IDs is invalid. */ diff --git a/policies/service/src/test/java/org/eclipse/ditto/policies/service/persistence/actors/resolvers/DefaultSubjectIdFromActionResolverTest.java b/policies/service/src/test/java/org/eclipse/ditto/policies/service/persistence/actors/resolvers/DefaultSubjectIdFromActionResolverTest.java index 8fae424d7b..e13bb1cb3a 100644 --- a/policies/service/src/test/java/org/eclipse/ditto/policies/service/persistence/actors/resolvers/DefaultSubjectIdFromActionResolverTest.java +++ b/policies/service/src/test/java/org/eclipse/ditto/policies/service/persistence/actors/resolvers/DefaultSubjectIdFromActionResolverTest.java @@ -17,7 +17,7 @@ import java.util.Collections; -import org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException; +import org.eclipse.ditto.placeholders.UnresolvedPlaceholderException; import org.eclipse.ditto.policies.model.Label; import org.eclipse.ditto.policies.model.PoliciesModelFactory; import org.eclipse.ditto.policies.model.PolicyEntry; diff --git a/policies/service/src/test/java/org/eclipse/ditto/policies/service/persistence/actors/strategies/commands/ActivateTokenIntegrationStrategyTest.java b/policies/service/src/test/java/org/eclipse/ditto/policies/service/persistence/actors/strategies/commands/ActivateTokenIntegrationStrategyTest.java index 401579e992..5632a6daa7 100644 --- a/policies/service/src/test/java/org/eclipse/ditto/policies/service/persistence/actors/strategies/commands/ActivateTokenIntegrationStrategyTest.java +++ b/policies/service/src/test/java/org/eclipse/ditto/policies/service/persistence/actors/strategies/commands/ActivateTokenIntegrationStrategyTest.java @@ -23,7 +23,9 @@ import org.eclipse.ditto.base.model.common.DittoDuration; import org.eclipse.ditto.base.model.headers.DittoHeaders; -import org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException; +import org.eclipse.ditto.internal.utils.persistentactors.commands.CommandStrategy; +import org.eclipse.ditto.placeholders.UnresolvedPlaceholderException; +import org.eclipse.ditto.policies.api.Permission; import org.eclipse.ditto.policies.model.Label; import org.eclipse.ditto.policies.model.Policy; import org.eclipse.ditto.policies.model.PolicyId; @@ -33,13 +35,11 @@ import org.eclipse.ditto.policies.model.SubjectId; import org.eclipse.ditto.policies.model.SubjectIdInvalidException; import org.eclipse.ditto.policies.model.SubjectIssuer; -import org.eclipse.ditto.policies.api.Permission; -import org.eclipse.ditto.policies.service.common.config.DefaultPolicyConfig; -import org.eclipse.ditto.policies.service.persistence.TestConstants; -import org.eclipse.ditto.internal.utils.persistentactors.commands.CommandStrategy; import org.eclipse.ditto.policies.model.signals.commands.actions.ActivateTokenIntegration; import org.eclipse.ditto.policies.model.signals.commands.actions.ActivateTokenIntegrationResponse; import org.eclipse.ditto.policies.model.signals.events.SubjectCreated; +import org.eclipse.ditto.policies.service.common.config.DefaultPolicyConfig; +import org.eclipse.ditto.policies.service.persistence.TestConstants; import org.junit.Before; import org.junit.Test; diff --git a/policies/service/src/test/java/org/eclipse/ditto/policies/service/persistence/actors/strategies/commands/DeactivateTokenIntegrationStrategyTest.java b/policies/service/src/test/java/org/eclipse/ditto/policies/service/persistence/actors/strategies/commands/DeactivateTokenIntegrationStrategyTest.java index f44758512f..eaf65c5263 100644 --- a/policies/service/src/test/java/org/eclipse/ditto/policies/service/persistence/actors/strategies/commands/DeactivateTokenIntegrationStrategyTest.java +++ b/policies/service/src/test/java/org/eclipse/ditto/policies/service/persistence/actors/strategies/commands/DeactivateTokenIntegrationStrategyTest.java @@ -19,17 +19,17 @@ import java.util.Collections; import org.eclipse.ditto.base.model.headers.DittoHeaders; -import org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException; +import org.eclipse.ditto.internal.utils.persistentactors.commands.CommandStrategy; +import org.eclipse.ditto.placeholders.UnresolvedPlaceholderException; import org.eclipse.ditto.policies.model.PolicyId; import org.eclipse.ditto.policies.model.SubjectId; import org.eclipse.ditto.policies.model.SubjectIdInvalidException; import org.eclipse.ditto.policies.model.SubjectIssuer; -import org.eclipse.ditto.policies.service.common.config.DefaultPolicyConfig; -import org.eclipse.ditto.policies.service.persistence.TestConstants; -import org.eclipse.ditto.internal.utils.persistentactors.commands.CommandStrategy; import org.eclipse.ditto.policies.model.signals.commands.actions.DeactivateTokenIntegration; import org.eclipse.ditto.policies.model.signals.commands.actions.DeactivateTokenIntegrationResponse; import org.eclipse.ditto.policies.model.signals.events.SubjectDeleted; +import org.eclipse.ditto.policies.service.common.config.DefaultPolicyConfig; +import org.eclipse.ditto.policies.service.persistence.TestConstants; import org.junit.Before; import org.junit.Test; diff --git a/policies/service/src/test/java/org/eclipse/ditto/policies/service/persistence/actors/strategies/commands/TopLevelPolicyActionCommandStrategyTest.java b/policies/service/src/test/java/org/eclipse/ditto/policies/service/persistence/actors/strategies/commands/TopLevelPolicyActionCommandStrategyTest.java index dfe36d0e63..677e1a0206 100644 --- a/policies/service/src/test/java/org/eclipse/ditto/policies/service/persistence/actors/strategies/commands/TopLevelPolicyActionCommandStrategyTest.java +++ b/policies/service/src/test/java/org/eclipse/ditto/policies/service/persistence/actors/strategies/commands/TopLevelPolicyActionCommandStrategyTest.java @@ -28,7 +28,9 @@ import java.util.stream.Collectors; import org.eclipse.ditto.base.model.headers.DittoHeaders; -import org.eclipse.ditto.internal.models.placeholders.UnresolvedPlaceholderException; +import org.eclipse.ditto.internal.utils.persistentactors.commands.CommandStrategy; +import org.eclipse.ditto.placeholders.UnresolvedPlaceholderException; +import org.eclipse.ditto.policies.api.Permission; import org.eclipse.ditto.policies.model.Label; import org.eclipse.ditto.policies.model.PoliciesModelFactory; import org.eclipse.ditto.policies.model.Policy; @@ -40,17 +42,15 @@ import org.eclipse.ditto.policies.model.SubjectId; import org.eclipse.ditto.policies.model.SubjectIdInvalidException; import org.eclipse.ditto.policies.model.SubjectIssuer; -import org.eclipse.ditto.policies.api.Permission; -import org.eclipse.ditto.policies.service.common.config.DefaultPolicyConfig; -import org.eclipse.ditto.policies.service.common.config.PolicyConfig; -import org.eclipse.ditto.policies.service.persistence.TestConstants; -import org.eclipse.ditto.internal.utils.persistentactors.commands.CommandStrategy; import org.eclipse.ditto.policies.model.signals.commands.actions.ActivateTokenIntegration; import org.eclipse.ditto.policies.model.signals.commands.actions.DeactivateTokenIntegration; import org.eclipse.ditto.policies.model.signals.commands.actions.TopLevelPolicyActionCommand; import org.eclipse.ditto.policies.model.signals.commands.actions.TopLevelPolicyActionCommandResponse; import org.eclipse.ditto.policies.model.signals.events.SubjectsDeletedPartially; import org.eclipse.ditto.policies.model.signals.events.SubjectsModifiedPartially; +import org.eclipse.ditto.policies.service.common.config.DefaultPolicyConfig; +import org.eclipse.ditto.policies.service.common.config.PolicyConfig; +import org.eclipse.ditto.policies.service.persistence.TestConstants; import org.junit.Before; import org.junit.Test; import org.mutabilitydetector.unittesting.AllowedReason; diff --git a/policies/service/src/test/java/org/eclipse/ditto/policies/service/starter/PoliciesServiceGlobalErrorRegistryTest.java b/policies/service/src/test/java/org/eclipse/ditto/policies/service/starter/PoliciesServiceGlobalErrorRegistryTest.java index e789f41065..9b4ace5421 100644 --- a/policies/service/src/test/java/org/eclipse/ditto/policies/service/starter/PoliciesServiceGlobalErrorRegistryTest.java +++ b/policies/service/src/test/java/org/eclipse/ditto/policies/service/starter/PoliciesServiceGlobalErrorRegistryTest.java @@ -25,9 +25,9 @@ import org.eclipse.ditto.base.model.signals.commands.exceptions.PathUnknownException; import org.eclipse.ditto.connectivity.model.ConnectionIdInvalidException; import org.eclipse.ditto.connectivity.model.signals.commands.exceptions.ConnectionConflictException; -import org.eclipse.ditto.internal.models.placeholders.PlaceholderFunctionUnknownException; import org.eclipse.ditto.internal.utils.test.GlobalErrorRegistryTestCases; import org.eclipse.ditto.messages.model.AuthorizationSubjectBlockedException; +import org.eclipse.ditto.placeholders.PlaceholderFunctionUnknownException; import org.eclipse.ditto.policies.model.PolicyEntryInvalidException; import org.eclipse.ditto.policies.model.PolicyIdInvalidException; import org.eclipse.ditto.policies.model.signals.commands.exceptions.PolicyConflictException; diff --git a/pom.xml b/pom.xml index 17a585576b..eb0246da7b 100644 --- a/pom.xml +++ b/pom.xml @@ -199,6 +199,7 @@ jwt legal messages + placeholders policies protocol rql diff --git a/protocol/pom.xml b/protocol/pom.xml index afc3d7a1f2..1f1de01ad3 100755 --- a/protocol/pom.xml +++ b/protocol/pom.xml @@ -37,6 +37,10 @@ org.eclipse.ditto ditto-json + + org.eclipse.ditto + ditto-placeholders + org.eclipse.ditto ditto-things-model @@ -186,12 +190,14 @@ - org.eclipse.ditto.protocol.adapter.DittoProtocolAdapter.toAdaptable(org.eclipse.ditto.things.model.signals.commands.query.RetrieveThings,org.eclipse.ditto.protocol.TopicPath$Channel) - org.eclipse.ditto.protocol.adapter.DittoProtocolAdapter.toAdaptable(org.eclipse.ditto.things.model.signals.commands.query.RetrieveThingsResponse,org.eclipse.ditto.protocol.TopicPath$Channel) - org.eclipse.ditto.protocol.adapter.DittoProtocolAdapter.toAdaptable(org.eclipse.ditto.thingsearch.model.signals.commands.ThingSearchCommand,org.eclipse.ditto.protocol.TopicPath$Channel) - org.eclipse.ditto.protocol.adapter.DittoProtocolAdapter.toAdaptable(org.eclipse.ditto.thingsearch.model.signals.events.SubscriptionEvent,org.eclipse.ditto.protocol.TopicPath$Channel) + org.eclipse.ditto.protocol.adapter.DittoProtocolAdapter#toAdaptable(org.eclipse.ditto.things.model.signals.commands.query.RetrieveThings,org.eclipse.ditto.protocol.TopicPath$Channel) + org.eclipse.ditto.protocol.adapter.DittoProtocolAdapter#toAdaptable(org.eclipse.ditto.things.model.signals.commands.query.RetrieveThingsResponse,org.eclipse.ditto.protocol.TopicPath$Channel) + org.eclipse.ditto.protocol.adapter.DittoProtocolAdapter#toAdaptable(org.eclipse.ditto.thingsearch.model.signals.commands.ThingSearchCommand,org.eclipse.ditto.protocol.TopicPath$Channel) + org.eclipse.ditto.protocol.adapter.DittoProtocolAdapter#toAdaptable(org.eclipse.ditto.thingsearch.model.signals.events.SubscriptionEvent,org.eclipse.ditto.protocol.TopicPath$Channel) org.eclipse.ditto.protocol.adapter.things.ThingSearchCommandAdapter + + org.eclipse.ditto.protocol.mapper.SignalMapper diff --git a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/ImmutableTopicPathPlaceholder.java b/protocol/src/main/java/org/eclipse/ditto/protocol/placeholders/ImmutableTopicPathPlaceholder.java similarity index 97% rename from connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/ImmutableTopicPathPlaceholder.java rename to protocol/src/main/java/org/eclipse/ditto/protocol/placeholders/ImmutableTopicPathPlaceholder.java index 7db875dea5..71506b759a 100644 --- a/connectivity/api/src/main/java/org/eclipse/ditto/connectivity/api/placeholders/ImmutableTopicPathPlaceholder.java +++ b/protocol/src/main/java/org/eclipse/ditto/protocol/placeholders/ImmutableTopicPathPlaceholder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,7 +10,7 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.connectivity.api.placeholders; +package org.eclipse.ditto.protocol.placeholders; import java.util.Arrays; import java.util.Collections; diff --git a/protocol/src/main/java/org/eclipse/ditto/protocol/placeholders/TopicPathPlaceholder.java b/protocol/src/main/java/org/eclipse/ditto/protocol/placeholders/TopicPathPlaceholder.java new file mode 100644 index 0000000000..47afa3c719 --- /dev/null +++ b/protocol/src/main/java/org/eclipse/ditto/protocol/placeholders/TopicPathPlaceholder.java @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2021 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.eclipse.ditto.protocol.placeholders; + +import org.eclipse.ditto.placeholders.Placeholder; +import org.eclipse.ditto.protocol.TopicPath; + +/** + * A {@link Placeholder} that requires the {@link TopicPath} to resolve its placeholders. + * @since 2.1.0 + */ +public interface TopicPathPlaceholder extends Placeholder { + + /** + * Returns the singleton instance of the {@link TopicPathPlaceholder}. + * + * @return the singleton instance. + */ + static TopicPathPlaceholder getInstance() { + return ImmutableTopicPathPlaceholder.INSTANCE; + } +} diff --git a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/package-info.java b/protocol/src/main/java/org/eclipse/ditto/protocol/placeholders/package-info.java similarity index 63% rename from internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/package-info.java rename to protocol/src/main/java/org/eclipse/ditto/protocol/placeholders/package-info.java index 290f3f9252..8f9f08f1d5 100644 --- a/internal/models/placeholders/src/main/java/org/eclipse/ditto/internal/models/placeholders/package-info.java +++ b/protocol/src/main/java/org/eclipse/ditto/protocol/placeholders/package-info.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,5 +10,10 @@ * * SPDX-License-Identifier: EPL-2.0 */ + +/** + * This package provides interfaces and classes of Ditto Protocol related + * {@link org.eclipse.ditto.placeholders.Placeholder}s. + */ @org.eclipse.ditto.utils.jsr305.annotations.AllParametersAndReturnValuesAreNonnullByDefault -package org.eclipse.ditto.internal.models.placeholders; +package org.eclipse.ditto.protocol.placeholders; diff --git a/connectivity/api/src/test/java/org/eclipse/ditto/connectivity/api/placeholders/ImmutableTopicPathPlaceholderTest.java b/protocol/src/test/java/org/eclipse/ditto/protocol/placeholders/ImmutableTopicPathPlaceholderTest.java similarity index 95% rename from connectivity/api/src/test/java/org/eclipse/ditto/connectivity/api/placeholders/ImmutableTopicPathPlaceholderTest.java rename to protocol/src/test/java/org/eclipse/ditto/protocol/placeholders/ImmutableTopicPathPlaceholderTest.java index edca126540..8914aa17ca 100644 --- a/connectivity/api/src/test/java/org/eclipse/ditto/connectivity/api/placeholders/ImmutableTopicPathPlaceholderTest.java +++ b/protocol/src/test/java/org/eclipse/ditto/protocol/placeholders/ImmutableTopicPathPlaceholderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Contributors to the Eclipse Foundation + * Copyright (c) 2021 Contributors to the Eclipse Foundation * * See the NOTICE file(s) distributed with this work for additional * information regarding copyright ownership. @@ -10,12 +10,12 @@ * * SPDX-License-Identifier: EPL-2.0 */ -package org.eclipse.ditto.connectivity.api.placeholders; +package org.eclipse.ditto.protocol.placeholders; import static org.assertj.core.api.Assertions.assertThat; -import org.eclipse.ditto.things.model.ThingId; import org.eclipse.ditto.protocol.TopicPath; +import org.eclipse.ditto.things.model.ThingId; import org.junit.Test; import org.mutabilitydetector.unittesting.MutabilityAssert; import org.mutabilitydetector.unittesting.MutabilityMatchers; @@ -24,9 +24,9 @@ import nl.jqno.equalsverifier.Warning; /** - * Tests {@link ImmutableTopicPathPlaceholder}. + * Tests {@link org.eclipse.ditto.protocol.placeholders.ImmutableTopicPathPlaceholder}. */ -public class ImmutableTopicPathPlaceholderTest { +public final class ImmutableTopicPathPlaceholderTest { private static final String KNOWN_NAMESPACE = "org.eclipse.ditto.test"; private static final String KNOWN_NAME = "myThing"; diff --git a/rql/parser/src/test/java/org/eclipse/ditto/rql/parser/RqlPredicateParserTest.java b/rql/parser/src/test/java/org/eclipse/ditto/rql/parser/RqlPredicateParserTest.java index 9d0ea80664..2790f7eb47 100644 --- a/rql/parser/src/test/java/org/eclipse/ditto/rql/parser/RqlPredicateParserTest.java +++ b/rql/parser/src/test/java/org/eclipse/ditto/rql/parser/RqlPredicateParserTest.java @@ -592,4 +592,16 @@ public void testFieldExistsInvalidWithQuotes() throws ParserException { public void testFieldExistsInvalidWithMoreParams() throws ParserException { parser.parse("exists(features/scanner,\"test\")"); } + + @Test + public void testTopicActionExists() throws ParserException { + final RootNode root = parser.parse("exists(topic:action)"); + + assertThat(root).isNotNull(); + assertThat(root.getChildren().size()).isEqualTo(1); + + final ExistsNode existsNode = (ExistsNode) root.getChildren().get(0); + assertThat(existsNode.getProperty().getClass()).isEqualTo(String.class); + assertThat(existsNode.getProperty()).isEqualTo("topic:action"); + } } diff --git a/rql/query/pom.xml b/rql/query/pom.xml index a7e6e861e3..1cb8e3dd4a 100644 --- a/rql/query/pom.xml +++ b/rql/query/pom.xml @@ -40,6 +40,10 @@ org.eclipse.ditto ditto-rql-model + + org.eclipse.ditto + ditto-placeholders + diff --git a/rql/query/src/main/java/org/eclipse/ditto/rql/query/expression/FieldExpressionFactory.java b/rql/query/src/main/java/org/eclipse/ditto/rql/query/expression/FieldExpressionFactory.java index 7930e4d49a..843b56dd1f 100644 --- a/rql/query/src/main/java/org/eclipse/ditto/rql/query/expression/FieldExpressionFactory.java +++ b/rql/query/src/main/java/org/eclipse/ditto/rql/query/expression/FieldExpressionFactory.java @@ -34,7 +34,7 @@ public interface FieldExpressionFactory { * @return the exists field expression * @throws IllegalArgumentException if there is no corresponding field to the given {@code propertyName}. */ - ExistsFieldExpression existsBy(final String propertyName) throws IllegalArgumentException; + ExistsFieldExpression existsBy(String propertyName) throws IllegalArgumentException; /** * Retrieve the persistence specific field expression for sorting according to the given {@code propertyName}. diff --git a/rql/query/src/main/java/org/eclipse/ditto/rql/query/expression/FieldExpressionUtil.java b/rql/query/src/main/java/org/eclipse/ditto/rql/query/expression/FieldExpressionUtil.java index 0fc5e55951..ff9c114840 100644 --- a/rql/query/src/main/java/org/eclipse/ditto/rql/query/expression/FieldExpressionUtil.java +++ b/rql/query/src/main/java/org/eclipse/ditto/rql/query/expression/FieldExpressionUtil.java @@ -43,17 +43,28 @@ public final class FieldExpressionUtil { */ public static final String FIELD_NAME_NAMESPACE = "namespace"; + /** + * Definition field name. + * @since 2.1.0 + */ + public static final String FIELD_NAME_DEFINITION = "definition"; + + /** + * Topic action field name. + * @since 2.1.0 + */ + public static final String FIELD_NAME_TOPIC_ACTION = "topic:action"; + private static final String REGEX_FIELD_START = "^"; private static final String REGEX_FIELD_END = "(/|\\z)"; private static final String FIELD_NAME_ATTRIBUTES_PREFIX = "attributes/"; - private static final String FIELD_NAME_DEFINITION_PREFIX = "definition/"; private FieldExpressionUtil() { throw new AssertionError(); } /** - * Wraps the given field in an regex with a startsWith and an '/' or end-of-line part. + * Wraps the given field in a regex with a startsWith and an '/' or end-of-line part. * * @param field the field to wrap * @return the wrapped field @@ -95,13 +106,13 @@ public static String stripAttributesPrefix(final String attributesFieldName) { } /** - * Checks if the given field name is an definition field name. + * Checks if the given field name is a definition field name. * * @param fieldName the field name - * @return {@code true}, if the field name is an attribute field name + * @return {@code true}, if the field name is a definition field name */ public static boolean isDefinitionFieldName(final String fieldName) { - return requireNonNull(fieldName).startsWith(FIELD_NAME_DEFINITION_PREFIX); + return requireNonNull(fieldName).equals(FIELD_NAME_DEFINITION); } /** @@ -114,6 +125,22 @@ public static String addAttributesPrefix(final String fieldName) { return FIELD_NAME_ATTRIBUTES_PREFIX + requireNonNull(fieldName); } + /** + * Checks if the given field name is a topic field name. + * Currently supported topics: + * + * + * @param fieldName the field name + * @return {@code true}, if the field name is an attribute field name + * @since 2.1.0 + */ + public static boolean isTopicFieldName(final String fieldName) { + // for now, only "topic:action" is supported: + return requireNonNull(fieldName).equals(FIELD_NAME_TOPIC_ACTION); + } + /** * Helper class representing a feature field with optional featureId and/or property path. */ diff --git a/rql/query/src/main/java/org/eclipse/ditto/rql/query/expression/ThingsFieldExpressionFactory.java b/rql/query/src/main/java/org/eclipse/ditto/rql/query/expression/ThingsFieldExpressionFactory.java index 2b713dac7b..46e3526c0c 100644 --- a/rql/query/src/main/java/org/eclipse/ditto/rql/query/expression/ThingsFieldExpressionFactory.java +++ b/rql/query/src/main/java/org/eclipse/ditto/rql/query/expression/ThingsFieldExpressionFactory.java @@ -12,8 +12,13 @@ */ package org.eclipse.ditto.rql.query.expression; +import java.util.Collection; +import java.util.HashMap; import java.util.Map; +import org.eclipse.ditto.placeholders.Expression; +import org.eclipse.ditto.placeholders.Placeholder; + /** * Factory for creating {@link FieldExpression}s for thing search. * The only relevant method is {@code filterByNamespace}; all others are only for tests. @@ -31,6 +36,28 @@ static ThingsFieldExpressionFactory of(final Map simpleFieldMapp return new ThingsFieldExpressionFactoryImpl(simpleFieldMappings); } + /** + * Creates a ThingsFieldExpressionFactory with custom field mappings and additional {@code placeholders} to also + * accept when validating if an RQL query contains supported fields. + * + * @param simpleFieldMappings the field mappings to apply. + * @param placeholders the {@code Placeholder}s to also respect for supported fields in the RQL + * @return the created ThingsFieldExpressionFactory + * @since 2.1.0 + */ + static ThingsFieldExpressionFactory of(final Map simpleFieldMappings, + final Collection> placeholders) { + final Map combinedFieldMappings = new HashMap<>(simpleFieldMappings); + placeholders.forEach(placeholder -> + placeholder.getSupportedNames() + .stream() + .map(name -> placeholder.getPrefix() + Expression.SEPARATOR + name) + .forEach(combinedPlaceholder -> + combinedFieldMappings.put(combinedPlaceholder, combinedPlaceholder)) + ); + return new ThingsFieldExpressionFactoryImpl(combinedFieldMappings); + } + /** * @return a filter expression for the given namespace */ @@ -38,6 +65,13 @@ default FilterFieldExpression filterByNamespace() { return filterBy(FieldExpressionUtil.FIELD_NAME_NAMESPACE); } + /** + * @return a filter expression for a given topic action + */ + default FilterFieldExpression filterByTopicAction() { + return filterBy(FieldExpressionUtil.FIELD_NAME_TOPIC_ACTION); + } + /** * Return an "exist" field expression for the given feature ID. * @@ -177,6 +211,14 @@ default FilterFieldExpression filterByThingId() { return filterBy(FieldExpressionUtil.FIELD_NAME_THING_ID); } + /** + * @return a filter expression for the "definition" field. + * @since 2.1.0 + */ + default FilterFieldExpression filterByDefinition() { + return filterBy(FieldExpressionUtil.FIELD_NAME_DEFINITION); + } + /** * @return a sortOptions expression for the "thingId" field. */ @@ -184,4 +226,12 @@ default SortFieldExpression sortByThingId() { return sortBy(FieldExpressionUtil.FIELD_NAME_THING_ID); } + /** + * @return a sortOptions expression for the "definition" field. + * @since 2.1.0 + */ + default SortFieldExpression sortByDefinition() { + return sortBy(FieldExpressionUtil.FIELD_NAME_DEFINITION); + } + } diff --git a/rql/query/src/main/java/org/eclipse/ditto/rql/query/expression/ThingsFieldExpressionFactoryImpl.java b/rql/query/src/main/java/org/eclipse/ditto/rql/query/expression/ThingsFieldExpressionFactoryImpl.java index d2e2af159e..a6003a6a47 100644 --- a/rql/query/src/main/java/org/eclipse/ditto/rql/query/expression/ThingsFieldExpressionFactoryImpl.java +++ b/rql/query/src/main/java/org/eclipse/ditto/rql/query/expression/ThingsFieldExpressionFactoryImpl.java @@ -146,6 +146,9 @@ private FieldExpression common(final String propertyName) { if (FieldExpressionUtil.isDefinitionFieldName(propertyName)) { return new SimpleFieldExpressionImpl(propertyName); } + if (FieldExpressionUtil.isTopicFieldName(propertyName)) { + return new SimpleFieldExpressionImpl(propertyName); + } final String fieldName = simpleFieldMappings.get(propertyName); if (fieldName != null) { diff --git a/rql/query/src/main/java/org/eclipse/ditto/rql/query/filter/QueryFilterCriteriaFactory.java b/rql/query/src/main/java/org/eclipse/ditto/rql/query/filter/QueryFilterCriteriaFactory.java index 438995b6b7..2850ff6c08 100644 --- a/rql/query/src/main/java/org/eclipse/ditto/rql/query/filter/QueryFilterCriteriaFactory.java +++ b/rql/query/src/main/java/org/eclipse/ditto/rql/query/filter/QueryFilterCriteriaFactory.java @@ -19,13 +19,14 @@ import org.eclipse.ditto.base.model.common.ConditionChecker; import org.eclipse.ditto.base.model.exceptions.InvalidRqlExpressionException; import org.eclipse.ditto.base.model.headers.DittoHeaders; +import org.eclipse.ditto.placeholders.Placeholder; +import org.eclipse.ditto.rql.model.ParserException; +import org.eclipse.ditto.rql.model.predicates.PredicateParser; +import org.eclipse.ditto.rql.model.predicates.ast.RootNode; import org.eclipse.ditto.rql.query.criteria.Criteria; import org.eclipse.ditto.rql.query.criteria.CriteriaFactory; import org.eclipse.ditto.rql.query.expression.ThingsFieldExpressionFactory; import org.eclipse.ditto.rql.query.things.ModelBasedThingsFieldExpressionFactory; -import org.eclipse.ditto.rql.model.ParserException; -import org.eclipse.ditto.rql.model.predicates.PredicateParser; -import org.eclipse.ditto.rql.model.predicates.ast.RootNode; /** * The place for query filter manipulations @@ -67,6 +68,19 @@ public static QueryFilterCriteriaFactory modelBased(final PredicateParser predic return of(ModelBasedThingsFieldExpressionFactory.getInstance(), predicateParser); } + /** + * Retrieve the unique model-based query filter criteria factory. + * + * @param predicateParser the PredicateParser to use for parsing RQL strings. + * @param placeholders the {@link Placeholder}s to accept when parsing the fields of RQL strings. + * @return the model-based query filter criteria factory. + * @since 2.1.0 + */ + public static QueryFilterCriteriaFactory modelBased(final PredicateParser predicateParser, + final Placeholder... placeholders) { + return of(ModelBasedThingsFieldExpressionFactory.createInstance(placeholders), predicateParser); + } + /** * Creates a filter criterion based on a filter string which includes only items in the given namespaces * diff --git a/rql/query/src/main/java/org/eclipse/ditto/rql/query/things/ExistsThingPredicateVisitor.java b/rql/query/src/main/java/org/eclipse/ditto/rql/query/things/ExistsThingPredicateVisitor.java index 38d7ad0d44..2d5714a222 100644 --- a/rql/query/src/main/java/org/eclipse/ditto/rql/query/things/ExistsThingPredicateVisitor.java +++ b/rql/query/src/main/java/org/eclipse/ditto/rql/query/things/ExistsThingPredicateVisitor.java @@ -12,21 +12,76 @@ */ package org.eclipse.ditto.rql.query.things; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Optional; import java.util.function.Predicate; +import org.eclipse.ditto.placeholders.Expression; +import org.eclipse.ditto.placeholders.PlaceholderResolver; import org.eclipse.ditto.rql.query.expression.ExistsFieldExpression; import org.eclipse.ditto.rql.query.expression.visitors.ExistsFieldExpressionVisitor; import org.eclipse.ditto.things.model.Thing; /** - * ExistsFieldExpressionVisitor for Java {@link Predicate}s of {@link Thing}s. + * ExistsFieldExpressionVisitor for Java {@link Predicate}s of {@link Thing}s and additionally added + * {@code PlaceholderResolver}s. */ public final class ExistsThingPredicateVisitor implements ExistsFieldExpressionVisitor> { + private final List> additionalPlaceholderResolvers; + + public ExistsThingPredicateVisitor() { + this.additionalPlaceholderResolvers = Collections.emptyList(); + } + + private ExistsThingPredicateVisitor(final Collection> additionalPlaceholderResolvers) { + this.additionalPlaceholderResolvers = Collections.unmodifiableList( + new ArrayList<>(additionalPlaceholderResolvers)); + } + + /** + * Applies the passed {@code expression} by visiting with a new created {@link ExistsThingPredicateVisitor} instance + * not containing any {@code Placeholder}s. + * + * @param expression the "exists" expression to visit. + * @return the Predicate of a thing to test. + */ public static Predicate apply(final ExistsFieldExpression expression) { return expression.acceptExistsVisitor(new ExistsThingPredicateVisitor()); } + /** + * Applies the passed {@code expression} by visiting with a new created {@link ExistsThingPredicateVisitor} instance + * containing the provided additional {@code PlaceholderResolver}s. + * + * @param expression the "exists" expression to visit. + * @param additionalPlaceholderResolvers the additional {@code PlaceholderResolver} to use for resolving + * placeholders in RQL "exists" predicates. + * @return the Predicate of a thing to test. + */ + public static Predicate apply(final ExistsFieldExpression expression, + final Collection> additionalPlaceholderResolvers) { + return expression.acceptExistsVisitor(new ExistsThingPredicateVisitor(additionalPlaceholderResolvers)); + } + + /** + * Applies the passed {@code expression} by visiting with a new created {@link ExistsThingPredicateVisitor} instance + * containing the provided additional {@code PlaceholderResolver}s. + * + * @param expression the "exists" expression to visit. + * @param additionalPlaceholderResolvers the additional {@code PlaceholderResolver} to use for resolving + * placeholders in RQL "exists" predicates. + * @return the Predicate of a thing to test. + */ + public static Predicate apply(final ExistsFieldExpression expression, + final PlaceholderResolver... additionalPlaceholderResolvers) { + return apply(expression, Arrays.asList(additionalPlaceholderResolvers)); + } + @Override public Predicate visitAttribute(final String key) { return thing -> thing.getAttributes().map(attributes -> attributes.getValue(key).isPresent()) @@ -74,7 +129,23 @@ public Predicate visitFeatureIdDesiredProperty(final CharSequence feature @Override public Predicate visitSimple(final String fieldName) { - return thing -> thing.toJson().getValue(fieldName).isPresent(); + return thing -> thing.toJson().getValue(fieldName).isPresent() || + existsInAdditionalPlaceholderResolvers(fieldName); + } + + private boolean existsInAdditionalPlaceholderResolvers(final String fieldName) { + final String[] fieldNameSplit = fieldName.split(Expression.SEPARATOR, 2); + if (fieldNameSplit.length > 1) { + final String placeholderPrefix = fieldNameSplit[0]; + final String placeholderName = fieldNameSplit[1]; + return additionalPlaceholderResolvers.stream() + .filter(pr -> placeholderPrefix.equals(pr.getPrefix())) + .filter(pr -> pr.supports(placeholderName)) + .map(pr -> pr.resolve(placeholderName)) + .anyMatch(Optional::isPresent); + } else { + return false; + } } } diff --git a/rql/query/src/main/java/org/eclipse/ditto/rql/query/things/ModelBasedThingsFieldExpressionFactory.java b/rql/query/src/main/java/org/eclipse/ditto/rql/query/things/ModelBasedThingsFieldExpressionFactory.java index 776af80e1f..5a883dc341 100644 --- a/rql/query/src/main/java/org/eclipse/ditto/rql/query/things/ModelBasedThingsFieldExpressionFactory.java +++ b/rql/query/src/main/java/org/eclipse/ditto/rql/query/things/ModelBasedThingsFieldExpressionFactory.java @@ -15,6 +15,8 @@ import static org.eclipse.ditto.rql.query.expression.FieldExpressionUtil.FIELD_NAMESPACE; import static org.eclipse.ditto.rql.query.expression.FieldExpressionUtil.FIELD_NAME_THING_ID; +import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -22,6 +24,7 @@ import org.eclipse.ditto.json.JsonFieldDefinition; import org.eclipse.ditto.json.JsonKey; import org.eclipse.ditto.json.JsonPointer; +import org.eclipse.ditto.placeholders.Placeholder; import org.eclipse.ditto.rql.query.expression.ExistsFieldExpression; import org.eclipse.ditto.rql.query.expression.FilterFieldExpression; import org.eclipse.ditto.rql.query.expression.SortFieldExpression; @@ -46,23 +49,46 @@ public final class ModelBasedThingsFieldExpressionFactory implements ThingsField filteringSimpleFieldMappings = Collections.unmodifiableMap(hashMap); } - private static final ModelBasedThingsFieldExpressionFactory INSTANCE = new ModelBasedThingsFieldExpressionFactory(); + private static final ModelBasedThingsFieldExpressionFactory INSTANCE = + new ModelBasedThingsFieldExpressionFactory(Collections.emptyList()); private final ThingsFieldExpressionFactory delegate; - private ModelBasedThingsFieldExpressionFactory() { - this.delegate = ThingsFieldExpressionFactory.of(filteringSimpleFieldMappings); + private ModelBasedThingsFieldExpressionFactory(final Collection> placeholders) { + this.delegate = ThingsFieldExpressionFactory.of(filteringSimpleFieldMappings, placeholders); } /** - * Returns the ModelBasedThingsFieldExpressionFactory. + * Returns the ModelBasedThingsFieldExpressionFactory instance without any {@code Placeholder}s. * - * @return the ModelBasedThingsFieldExpressionFactory. + * @return the singletone ModelBasedThingsFieldExpressionFactory. */ public static ModelBasedThingsFieldExpressionFactory getInstance() { return INSTANCE; } + /** + * Creates a new ModelBasedThingsFieldExpressionFactory instance with the provided {@code placeholders}. + * + * @param placeholders the {@link Placeholder}s to accept when parsing the fields of RQL strings. + * @return the created ModelBasedThingsFieldExpressionFactory. + * @since 2.1.0 + */ + public static ThingsFieldExpressionFactory createInstance(final Placeholder... placeholders) { + return createInstance(Arrays.asList(placeholders)); + } + + /** + * Creates a new ModelBasedThingsFieldExpressionFactory instance with the provided {@code placeholders}. + * + * @param placeholders the {@link Placeholder}s to accept when parsing the fields of RQL strings. + * @return the created ModelBasedThingsFieldExpressionFactory. + * @since 2.1.0 + */ + public static ThingsFieldExpressionFactory createInstance(final Collection> placeholders) { + return new ModelBasedThingsFieldExpressionFactory(placeholders); + } + @Override public FilterFieldExpression filterBy(final String propertyName) { return delegate.filterBy(propertyName); diff --git a/rql/query/src/main/java/org/eclipse/ditto/rql/query/things/ThingPredicatePredicateVisitor.java b/rql/query/src/main/java/org/eclipse/ditto/rql/query/things/ThingPredicatePredicateVisitor.java index 9380c21983..e72e28bf37 100644 --- a/rql/query/src/main/java/org/eclipse/ditto/rql/query/things/ThingPredicatePredicateVisitor.java +++ b/rql/query/src/main/java/org/eclipse/ditto/rql/query/things/ThingPredicatePredicateVisitor.java @@ -13,6 +13,10 @@ package org.eclipse.ditto.rql.query.things; import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.function.Function; @@ -22,11 +26,14 @@ import javax.annotation.Nullable; import org.eclipse.ditto.json.JsonValue; +import org.eclipse.ditto.placeholders.Expression; +import org.eclipse.ditto.placeholders.PlaceholderResolver; import org.eclipse.ditto.rql.query.criteria.visitors.PredicateVisitor; import org.eclipse.ditto.things.model.Thing; /** - * A Java {@link Predicate} based PredicateVisitor for evaluating whether {@link Thing}s match a given filter. + * A Java {@link Predicate} based PredicateVisitor for evaluating whether {@link Thing}s or additionally added + * {@code PlaceholderResolver}s matches a given filter. */ public final class ThingPredicatePredicateVisitor implements PredicateVisitor>> { @@ -34,8 +41,11 @@ public final class ThingPredicatePredicateVisitor implements PredicateVisitor> additionalPlaceholderResolvers; + + private ThingPredicatePredicateVisitor(final Collection> additionalPlaceholderResolvers) { + this.additionalPlaceholderResolvers = Collections.unmodifiableList( + new ArrayList<>(additionalPlaceholderResolvers)); } /** @@ -45,11 +55,35 @@ private ThingPredicatePredicateVisitor() { */ public static ThingPredicatePredicateVisitor getInstance() { if (null == instance) { - instance = new ThingPredicatePredicateVisitor(); + instance = new ThingPredicatePredicateVisitor(Collections.emptyList()); } return instance; } + /** + * Creates a new instance of {@code ThingPredicatePredicateVisitor} with additional custom placeholder resolvers. + * + * @param additionalPlaceholderResolvers the additional {@code PlaceholderResolver} to use for resolving + * placeholders in RQL predicates. + * @return the created instance. + */ + public static ThingPredicatePredicateVisitor createInstance( + final Collection> additionalPlaceholderResolvers) { + return new ThingPredicatePredicateVisitor(additionalPlaceholderResolvers); + } + + /** + * Creates a new instance of {@code ThingPredicatePredicateVisitor} with additional custom placeholder resolvers. + * + * @param additionalPlaceholderResolvers the additional {@code PlaceholderResolver} to use for resolving + * placeholders in RQL predicates. + * @return the created instance. + */ + public static ThingPredicatePredicateVisitor createInstance( + final PlaceholderResolver... additionalPlaceholderResolvers) { + return createInstance(Arrays.asList(additionalPlaceholderResolvers)); + } + /** * Creates a Java {@link Predicate} from a Ditto query * {@link org.eclipse.ditto.rql.query.criteria.Predicate Predicate} and its field name. @@ -197,8 +231,29 @@ public Function> visitLike(@Nullable final String value .isPresent(); } - private static Optional getThingField(final CharSequence fieldName, final Thing thing) { - return thing.toJson(p -> true).getValue(fieldName); + private Optional getThingField(final CharSequence fieldName, final Thing thing) { + return Optional.ofNullable( + thing.toJson(p -> true) + .getValue(fieldName) // first, try resolving via the thing + .orElseGet(() -> {// if that returns nothing, try resolving using the placeholder resolvers: + final String[] fieldNameSplit = fieldName.toString().split(Expression.SEPARATOR, 2); + if (fieldNameSplit.length > 1) { + final String placeholderPrefix = fieldNameSplit[0]; + final String placeholderName = fieldNameSplit[1]; + return additionalPlaceholderResolvers.stream() + .filter(pr -> placeholderPrefix.equals(pr.getPrefix())) + .filter(pr -> pr.supports(placeholderName)) + .map(pr -> pr.resolve(placeholderName)) + .filter(Optional::isPresent) + .map(Optional::get) + .map(JsonValue::of) + .findFirst() + .orElse(null); + } else { + return null; + } + }) + ); } private static Optional mapJsonValueToJava(final JsonValue jsonValue) { diff --git a/rql/query/src/main/java/org/eclipse/ditto/rql/query/things/ThingPredicateVisitor.java b/rql/query/src/main/java/org/eclipse/ditto/rql/query/things/ThingPredicateVisitor.java index 8a450af836..b845f5e478 100644 --- a/rql/query/src/main/java/org/eclipse/ditto/rql/query/things/ThingPredicateVisitor.java +++ b/rql/query/src/main/java/org/eclipse/ditto/rql/query/things/ThingPredicateVisitor.java @@ -12,9 +12,14 @@ */ package org.eclipse.ditto.rql.query.things; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.function.Predicate; +import org.eclipse.ditto.placeholders.PlaceholderResolver; import org.eclipse.ditto.rql.query.criteria.Criteria; import org.eclipse.ditto.rql.query.criteria.visitors.CriteriaVisitor; import org.eclipse.ditto.rql.query.expression.ExistsFieldExpression; @@ -22,16 +27,53 @@ import org.eclipse.ditto.things.model.Thing; /** - * CriteriaVisitor for Java {@link Predicate}s of {@link Thing}s. + * CriteriaVisitor for Java {@link Predicate}s of {@link Thing}s and additionally added {@code PlaceholderResolver}s. */ public final class ThingPredicateVisitor implements CriteriaVisitor> { - private ThingPredicateVisitor() { - // only internally instantiable + private final List> additionalPlaceholderResolvers; + + private ThingPredicateVisitor(final Collection> additionalPlaceholderResolvers) { + this.additionalPlaceholderResolvers = Collections.unmodifiableList(new ArrayList<>(additionalPlaceholderResolvers)); } + /** + * Applies the passed {@code criteria} by visiting with a new created {@link ThingPredicateVisitor} instance + * not containing any {@code PlaceholderResolver}s. + * + * @param criteria the RQL criteria to visit. + * @return the Predicate of a thing to test. + */ public static Predicate apply(final Criteria criteria) { - return criteria.accept(new ThingPredicateVisitor()); + return criteria.accept(new ThingPredicateVisitor(Collections.emptyList())); + } + + /** + * Applies the passed {@code criteria} by visiting with a new created {@link ThingPredicateVisitor} instance + * not containing any {@code PlaceholderResolver}s. + * + * @param criteria the RQL criteria to visit. + * @param additionalPlaceholderResolvers the additional {@code PlaceholderResolver} to use for resolving + * placeholders in RQL criteria. + * @return the Predicate of a thing to test. + */ + public static Predicate apply(final Criteria criteria, + final Collection> additionalPlaceholderResolvers) { + return criteria.accept(new ThingPredicateVisitor(additionalPlaceholderResolvers)); + } + + /** + * Applies the passed {@code criteria} by visiting with a new created {@link ThingPredicateVisitor} instance + * not containing any {@code PlaceholderResolver}s. + * + * @param criteria the RQL criteria to visit. + * @param additionalPlaceholderResolvers the additional {@code PlaceholderResolver} to use for resolving + * placeholders in RQL criteria. + * @return the Predicate of a thing to test. + */ + public static Predicate apply(final Criteria criteria, + final PlaceholderResolver... additionalPlaceholderResolvers) { + return apply(criteria, Arrays.asList(additionalPlaceholderResolvers)); } @Override @@ -46,14 +88,14 @@ public Predicate visitAny() { @Override public Predicate visitExists(final ExistsFieldExpression fieldExpression) { - return ExistsThingPredicateVisitor.apply(fieldExpression); + return ExistsThingPredicateVisitor.apply(fieldExpression, additionalPlaceholderResolvers); } @Override public Predicate visitField(final FilterFieldExpression fieldExpression, final org.eclipse.ditto.rql.query.criteria.Predicate predicate) { return FilterThingPredicateVisitor.apply(fieldExpression, - predicate.accept(ThingPredicatePredicateVisitor.getInstance())); + predicate.accept(ThingPredicatePredicateVisitor.createInstance(additionalPlaceholderResolvers))); } @Override diff --git a/rql/query/src/test/java/org/eclipse/ditto/rql/query/expression/ThingsFieldExpressionFactoryImplTest.java b/rql/query/src/test/java/org/eclipse/ditto/rql/query/expression/ThingsFieldExpressionFactoryImplTest.java index 0d4b63b29c..0bc2a558b4 100644 --- a/rql/query/src/test/java/org/eclipse/ditto/rql/query/expression/ThingsFieldExpressionFactoryImplTest.java +++ b/rql/query/src/test/java/org/eclipse/ditto/rql/query/expression/ThingsFieldExpressionFactoryImplTest.java @@ -43,8 +43,6 @@ public final class ThingsFieldExpressionFactoryImplTest { private static final String KNOWN_FEATURE_DESIRED_PROPERTY_WITH_ID = "features/" + KNOWN_FEATURE_ID + "/desiredProperties/" + KNOWN_STRING + "_desired"; - private static final String KNOWN_THING_DEFINITION = "definition/example:test:definition"; - private static final Map SIMPLE_FIELD_MAPPINGS = new HashMap<>(); static { SIMPLE_FIELD_MAPPINGS.put(FieldExpressionUtil.FIELD_NAME_THING_ID, FieldExpressionUtil.FIELD_ID); @@ -269,25 +267,25 @@ public void sortByThingId() { @Test public void filterByDefinition() { - final FilterFieldExpression fieldExpression = ef.filterBy(KNOWN_THING_DEFINITION); + final FilterFieldExpression fieldExpression = ef.filterByDefinition(); - final FilterFieldExpression expected = new SimpleFieldExpressionImpl(KNOWN_THING_DEFINITION); + final FilterFieldExpression expected = new SimpleFieldExpressionImpl(FieldExpressionUtil.FIELD_NAME_DEFINITION); assertThat(fieldExpression).isEqualTo(expected); } @Test public void sortByDefinition() { - final SortFieldExpression fieldExpression = ef.sortBy(KNOWN_THING_DEFINITION); + final SortFieldExpression fieldExpression = ef.sortByDefinition(); - final SortFieldExpression expected = new SimpleFieldExpressionImpl(KNOWN_THING_DEFINITION); + final SortFieldExpression expected = new SimpleFieldExpressionImpl(FieldExpressionUtil.FIELD_NAME_DEFINITION); assertThat(fieldExpression).isEqualTo(expected); } @Test public void existsByWithDefinition() { - final FieldExpression fieldExpression = ef.existsBy(KNOWN_THING_DEFINITION); + final FieldExpression fieldExpression = ef.existsBy(FieldExpressionUtil.FIELD_NAME_DEFINITION); - final ExistsFieldExpression expected = new SimpleFieldExpressionImpl(KNOWN_THING_DEFINITION); + final ExistsFieldExpression expected = new SimpleFieldExpressionImpl(FieldExpressionUtil.FIELD_NAME_DEFINITION); assertThat(fieldExpression).isEqualTo(expected); } diff --git a/rql/query/src/test/java/org/eclipse/ditto/rql/query/filter/ParameterPredicateVisitorTest.java b/rql/query/src/test/java/org/eclipse/ditto/rql/query/filter/ParameterPredicateVisitorTest.java index d43f43ff06..e4b7a53541 100644 --- a/rql/query/src/test/java/org/eclipse/ditto/rql/query/filter/ParameterPredicateVisitorTest.java +++ b/rql/query/src/test/java/org/eclipse/ditto/rql/query/filter/ParameterPredicateVisitorTest.java @@ -18,13 +18,13 @@ import java.util.Map; import org.assertj.core.api.Assertions; +import org.eclipse.ditto.rql.model.predicates.ast.LogicalNode; +import org.eclipse.ditto.rql.model.predicates.ast.RootNode; +import org.eclipse.ditto.rql.model.predicates.ast.SingleComparisonNode; import org.eclipse.ditto.rql.query.criteria.Criteria; import org.eclipse.ditto.rql.query.criteria.CriteriaFactory; import org.eclipse.ditto.rql.query.expression.FieldExpressionUtil; import org.eclipse.ditto.rql.query.expression.ThingsFieldExpressionFactory; -import org.eclipse.ditto.rql.model.predicates.ast.LogicalNode; -import org.eclipse.ditto.rql.model.predicates.ast.RootNode; -import org.eclipse.ditto.rql.model.predicates.ast.SingleComparisonNode; import org.junit.Before; import org.junit.Test; @@ -37,6 +37,10 @@ public final class ParameterPredicateVisitorTest { private static final String KNOWN_FIELD_VALUE_1 = "value1"; private static final String KNOWN_FIELD_VALUE_2 = "value2"; + private static final String KNOWN_TOPIC = FieldExpressionUtil.FIELD_NAME_TOPIC_ACTION; + private static final String KNOWN_TOPIC_VALUE_CREATED = "created"; + private static final String KNOWN_TOPIC_VALUE_DELETED = "deleted"; + private ParameterPredicateVisitor visitorUnderTest; private CriteriaFactory cf; private ThingsFieldExpressionFactory ef; @@ -196,4 +200,15 @@ public void filterNodeLe() { Assertions.assertThat(visitorUnderTest.getCriteria()).containsExactly(expectedCrit); } + @Test + public void filterNodeUsingTopic() { + final SingleComparisonNode filterNode = + new SingleComparisonNode(SingleComparisonNode.Type.EQ, KNOWN_TOPIC, KNOWN_TOPIC_VALUE_CREATED); + + visitorUnderTest.visit(filterNode); + + final Criteria expectedCrit = cf.fieldCriteria(ef.filterBy(KNOWN_TOPIC), cf.eq(KNOWN_TOPIC_VALUE_CREATED)); + Assertions.assertThat(visitorUnderTest.getCriteria()).containsExactly(expectedCrit); + } + } diff --git a/rql/query/src/test/java/org/eclipse/ditto/rql/query/things/ThingPredicatePredicateVisitorTest.java b/rql/query/src/test/java/org/eclipse/ditto/rql/query/things/ThingPredicatePredicateVisitorTest.java index 53f56b5241..39d48bb1ad 100644 --- a/rql/query/src/test/java/org/eclipse/ditto/rql/query/things/ThingPredicatePredicateVisitorTest.java +++ b/rql/query/src/test/java/org/eclipse/ditto/rql/query/things/ThingPredicatePredicateVisitorTest.java @@ -24,6 +24,7 @@ import org.eclipse.ditto.json.JsonObject; import org.eclipse.ditto.json.JsonPointer; import org.eclipse.ditto.json.JsonValue; +import org.eclipse.ditto.placeholders.PlaceholderFactory; import org.eclipse.ditto.things.model.Thing; import org.junit.Test; @@ -34,6 +35,11 @@ public final class ThingPredicatePredicateVisitorTest { private final static ThingPredicatePredicateVisitor sut = ThingPredicatePredicateVisitor.getInstance(); + private static final String KNOWN_PLACEHOLDER_VALUE = "baZingA"; + private final static ThingPredicatePredicateVisitor sutWithPlaceholderResolver = + ThingPredicatePredicateVisitor.createInstance(PlaceholderFactory.newPlaceholderResolver( + new ThingPredicateTestPlaceholder(), KNOWN_PLACEHOLDER_VALUE)); + @Test public void matchingBooleanEq() { doTest(sut.visitEq(true), JsonValue.of(true)) @@ -52,12 +58,30 @@ public void matchingStringEq() { .isTrue(); } + @Test + public void matchingViaPlaceholderStringEq() { + doTest(sutWithPlaceholderResolver.visitEq(KNOWN_PLACEHOLDER_VALUE.toLowerCase()), "test:lower") + .isTrue(); + } + + @Test + public void matchingViaPlaceholderStringEq2() { + doTest(sutWithPlaceholderResolver.visitEq(KNOWN_PLACEHOLDER_VALUE.toUpperCase()), "test:upper") + .isTrue(); + } + @Test public void matchingNullEq() { doTest(sut.visitEq(null), JsonValue.nullLiteral()) .isTrue(); } + @Test + public void matchingViaPlaceholderNullEq() { + doTest(sutWithPlaceholderResolver.visitEq(null), JsonValue.nullLiteral()) + .isTrue(); + } + @Test public void matchingNullEq2() { doTest(sut.visitEq(null), JsonValue.of("yes")) @@ -82,6 +106,12 @@ public void matchingStringNe() { .isTrue(); } + @Test + public void matchingViaPlaceholderStringNe() { + doTest(sutWithPlaceholderResolver.visitNe(KNOWN_PLACEHOLDER_VALUE), "test:lower") + .isTrue(); + } + @Test public void matchingNullNe() { doTest(sut.visitNe("yes"), JsonValue.nullLiteral()) @@ -107,6 +137,13 @@ public void matchingStringLike() { .isTrue(); } + @Test + public void matchingViaPlaceholderStringLike() { + // the sut already works on regex Pattern - the translation from "*" to ".*" is done in LikePredicateImpl + doTest(sutWithPlaceholderResolver.visitLike("baz.*"), "test:lower") + .isTrue(); + } + @Test public void matchingNullLike() { doTest(sut.visitLike(null), JsonValue.of("yes")) @@ -126,12 +163,26 @@ public void matchingStringIn() { .isTrue(); } + @Test + public void matchingViaPlaceholderStringIn() { + doTest(sutWithPlaceholderResolver.visitIn(Collections.singletonList(KNOWN_PLACEHOLDER_VALUE.toLowerCase())), + "test:lower") + .isTrue(); + } + @Test public void nonMatchingStringIn() { doTest(sut.visitIn(Collections.singletonList("this-is-some-content")), JsonValue.of("this-is-the-content")) .isFalse(); } + @Test + public void nonMatchingViaPlaceholderStringIn() { + doTest(sutWithPlaceholderResolver.visitIn(Arrays.asList(KNOWN_PLACEHOLDER_VALUE, KNOWN_PLACEHOLDER_VALUE.toUpperCase())), + "test:lower") + .isFalse(); + } + @Test public void matchingIntegerEq() { doTest(sut.visitEq(7), JsonValue.of(7)) @@ -274,13 +325,24 @@ public void comparingJsonObjectNeverEvaluatesToTrue() { private static AbstractBooleanAssert doTest(final Function> functionToTest, final JsonValue actualValue) { + return doTest(functionToTest, "attributes/some-attr", actualValue); + } + + private static AbstractBooleanAssert doTest(final Function> functionToTest, + final String rqlTarget) { + return doTest(functionToTest, rqlTarget, JsonValue.nullLiteral()); + } + + private static AbstractBooleanAssert doTest(final Function> functionToTest, + final String rqlTarget, + final JsonValue actualValue) { final String attributeKey = "some-attr"; final Thing thing = Thing.newBuilder() .setAttribute(JsonPointer.of(attributeKey), JsonValue.of(actualValue)) .build(); - return assertThat(functionToTest.apply("attributes/" + attributeKey) + return assertThat(functionToTest.apply(rqlTarget) .test(thing) ); } diff --git a/rql/query/src/test/java/org/eclipse/ditto/rql/query/things/ThingPredicateTestPlaceholder.java b/rql/query/src/test/java/org/eclipse/ditto/rql/query/things/ThingPredicateTestPlaceholder.java new file mode 100644 index 0000000000..21ec6fe845 --- /dev/null +++ b/rql/query/src/test/java/org/eclipse/ditto/rql/query/things/ThingPredicateTestPlaceholder.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2021 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0 + * + * SPDX-License-Identifier: EPL-2.0 + */ +package org.eclipse.ditto.rql.query.things; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; + +import org.eclipse.ditto.placeholders.Placeholder; +import org.eclipse.ditto.utils.jsr305.annotations.AllParametersAndReturnValuesAreNonnullByDefault; + +@AllParametersAndReturnValuesAreNonnullByDefault +final class ThingPredicateTestPlaceholder implements Placeholder { + + private static final String UPPER = "upper"; + private static final String LOWER = "lower"; + + @Override + public String getPrefix() { + return "test"; + } + + @Override + public List getSupportedNames() { + return Arrays.asList(UPPER, LOWER); + } + + @Override + public boolean supports(final String name) { + return name.equals(UPPER) || name.equals(LOWER); + } + + @Override + public Optional resolve(final String placeholderSource, final String name) { + if (LOWER.equals(name)) { + return Optional.of(placeholderSource.toLowerCase()); + } else { + return Optional.of(placeholderSource.toUpperCase()); + } + } + +} diff --git a/rql/query/src/test/java/org/eclipse/ditto/rql/query/things/ThingPredicateVisitorTest.java b/rql/query/src/test/java/org/eclipse/ditto/rql/query/things/ThingPredicateVisitorTest.java index 279a92b8c3..30d65976cb 100644 --- a/rql/query/src/test/java/org/eclipse/ditto/rql/query/things/ThingPredicateVisitorTest.java +++ b/rql/query/src/test/java/org/eclipse/ditto/rql/query/things/ThingPredicateVisitorTest.java @@ -13,15 +13,18 @@ package org.eclipse.ditto.rql.query.things; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.util.function.Predicate; +import org.eclipse.ditto.base.model.exceptions.InvalidRqlExpressionException; +import org.eclipse.ditto.base.model.headers.DittoHeaders; import org.eclipse.ditto.json.JsonPointer; import org.eclipse.ditto.json.JsonValue; -import org.eclipse.ditto.base.model.headers.DittoHeaders; -import org.eclipse.ditto.rql.query.criteria.Criteria; -import org.eclipse.ditto.rql.query.filter.QueryFilterCriteriaFactory; +import org.eclipse.ditto.placeholders.PlaceholderFactory; +import org.eclipse.ditto.placeholders.PlaceholderResolver; import org.eclipse.ditto.rql.parser.RqlPredicateParser; +import org.eclipse.ditto.rql.query.filter.QueryFilterCriteriaFactory; import org.eclipse.ditto.things.model.FeatureProperties; import org.eclipse.ditto.things.model.Thing; import org.eclipse.ditto.things.model.ThingId; @@ -35,6 +38,14 @@ public final class ThingPredicateVisitorTest { private static final QueryFilterCriteriaFactory queryFilterCriteriaFactory = QueryFilterCriteriaFactory.modelBased(RqlPredicateParser.getInstance()); + private static final String KNOWN_PLACEHOLDER_VALUE = "LoreM"; + + private static final PlaceholderResolver PLACEHOLDER_RESOLVER = PlaceholderFactory.newPlaceholderResolver( + new ThingPredicateTestPlaceholder(), KNOWN_PLACEHOLDER_VALUE); + + private static final QueryFilterCriteriaFactory queryFilterCriteriaFactoryWithPredicateResolver = + QueryFilterCriteriaFactory.modelBased(RqlPredicateParser.getInstance(), PLACEHOLDER_RESOLVER); + private static final ThingId MATCHING_THING_ID = ThingId.of("org.eclipse.ditto", "foo-matching"); private static final int MATCHING_THING_INTEGER = 42; private static final long MATCHING_THING_LONG = 42456489489489L; @@ -103,12 +114,14 @@ public final class ThingPredicateVisitorTest { ) .build(); - private static Criteria createCriteria(final String filter) { - return queryFilterCriteriaFactory.filterCriteria(filter, DittoHeaders.empty()); + private static Predicate createPredicate(final String filter) { + return ThingPredicateVisitor.apply(queryFilterCriteriaFactory.filterCriteria(filter, DittoHeaders.empty())); } - private static Predicate createPredicate(final String filter) { - return ThingPredicateVisitor.apply(createCriteria(filter)); + private static Predicate createPredicateWithPlaceholderResolver(final String filter) { + return ThingPredicateVisitor.apply( + queryFilterCriteriaFactoryWithPredicateResolver.filterCriteria(filter, DittoHeaders.empty()), + PLACEHOLDER_RESOLVER); } private static void testPredicate(final Thing nonMatchingThing, @@ -156,6 +169,21 @@ private static void testPredicate(final Thing nonMatchingThing, } } + private static void testPredicateWithPlaceholder(final String predicate, + final String placeholder, + final String value, + final boolean expected, + final boolean escapeStr) { + + final String stringValue = escapeStr ? "\"" + value + "\"" : value; + final String filter = predicate + "(" + placeholder + "," + stringValue + ")"; + final Predicate thingPredicate = createPredicateWithPlaceholderResolver(filter); + + assertThat(thingPredicate.test(MATCHING_THING)) + .as("Filtering '%s' with value '%s' should be %s", filter, stringValue, expected) + .isEqualTo(expected); + } + @Test public void testFilterThingIdWithStringEq() { testPredicate(NON_MATCHING_THING_LESSER, "eq", "thingId", MATCHING_THING_ID.toString()); @@ -366,7 +394,7 @@ public void testFilterThingIdExists() { final Predicate thingPredicate = createPredicate("exists(thingId)"); assertThat(thingPredicate.test(MATCHING_THING)) .as("Filtering 'exists(thingId)' should be true") - .isEqualTo(true); + .isTrue(); } @Test @@ -374,12 +402,12 @@ public void testFilterAttributeExists() { final Predicate thingPredicate = createPredicate("exists(attributes/aBoolean)"); assertThat(thingPredicate.test(MATCHING_THING)) .as("Filtering 'exists(attributes/aBoolean)' should be true") - .isEqualTo(true); + .isTrue(); final Predicate negativePredicate = createPredicate("exists(attributes/missing)"); assertThat(negativePredicate.test(MATCHING_THING)) .as("Filtering 'exists(attributes/missing)' should be false") - .isEqualTo(false); + .isFalse(); } @Test @@ -387,12 +415,12 @@ public void testFilterFeatureExists() { final Predicate thingPredicate = createPredicate("exists(features/foo)"); assertThat(thingPredicate.test(MATCHING_THING)) .as("Filtering 'exists(features/foo)' should be true") - .isEqualTo(true); + .isTrue(); final Predicate negativePredicate = createPredicate("exists(features/bar)"); assertThat(negativePredicate.test(MATCHING_THING)) .as("Filtering 'exists(features/bar)' should be false") - .isEqualTo(false); + .isFalse(); } @Test @@ -400,12 +428,12 @@ public void testFilterFeaturePropertyExists() { final Predicate thingPredicate = createPredicate("exists(features/foo/properties/aString)"); assertThat(thingPredicate.test(MATCHING_THING)) .as("Filtering 'exists(features/foo/properties/aString)' should be true") - .isEqualTo(true); + .isTrue(); final Predicate negativePredicate = createPredicate("exists(features/foo/properties/missing)"); assertThat(negativePredicate.test(MATCHING_THING)) .as("Filtering 'exists(features/foo/properties/missing)' should be false") - .isEqualTo(false); + .isFalse(); } @Test @@ -414,7 +442,7 @@ public void testLogicalAndWith2queries() { final Predicate thingPredicate = createPredicate(filter); assertThat(thingPredicate.test(MATCHING_THING)) .as("Filtering '"+ filter + "' should be true") - .isEqualTo(true); + .isTrue(); } @Test @@ -427,7 +455,7 @@ public void testLogicalAndWith3queries() { final Predicate thingPredicate = createPredicate(filter); assertThat(thingPredicate.test(MATCHING_THING)) .as("Filtering '"+ filter + "' should be true") - .isEqualTo(true); + .isTrue(); } @Test @@ -436,7 +464,7 @@ public void testLogicalOrWith2queries() { final Predicate thingPredicate = createPredicate(filter); assertThat(thingPredicate.test(MATCHING_THING)) .as("Filtering '"+ filter + "' should be true") - .isEqualTo(true); + .isTrue(); } @Test @@ -449,7 +477,7 @@ public void testLogicalOrWith3queries() { final Predicate thingPredicate = createPredicate(filter); assertThat(thingPredicate.test(MATCHING_THING)) .as("Filtering '"+ filter + "' should be true") - .isEqualTo(true); + .isTrue(); } @Test @@ -458,13 +486,63 @@ public void testLogicalNotWithEqThingId() { final Predicate thingPredicate = createPredicate(filter); assertThat(thingPredicate.test(MATCHING_THING)) .as("Filtering '"+ filter + "' should be false") - .isEqualTo(false); + .isFalse(); final String negativeFilter = "not(eq(thingId,\"" + MATCHING_THING_ID + "-missing" + "\"))"; final Predicate negativePredicate = createPredicate(negativeFilter); assertThat(negativePredicate.test(MATCHING_THING)) .as("Filtering '"+ filter + "' should be true") - .isEqualTo(true); + .isTrue(); + } + + @Test + public void testKnownPlaceholderExists() { + final Predicate thingPredicate = createPredicateWithPlaceholderResolver("exists(test:lower)"); + assertThat(thingPredicate.test(Thing.newBuilder().build())) + .as("Filtering 'exists(test:lower)' should be true") + .isTrue(); + } + + @Test + public void testUnknownPlaceholderLeadsToInvalidRqlExpression() { + assertThatThrownBy(() -> createPredicateWithPlaceholderResolver("exists(test:unknown)")) + .as("Creating predicate 'exists(test:unknown)' should fail with an invalid RQL expression exception") + .isInstanceOf(InvalidRqlExpressionException.class); + } + + @Test + public void testFilterWithPlaceholderStringEq() { + testPredicateWithPlaceholder( "eq", "test:lower", KNOWN_PLACEHOLDER_VALUE.toLowerCase(), true, true); + } + + @Test + public void testFilterWithPlaceholderStringNotEq() { + testPredicateWithPlaceholder( "eq", "test:lower", KNOWN_PLACEHOLDER_VALUE, false, true); + } + + @Test + public void testFilterWithPlaceholderStringNe() { + testPredicateWithPlaceholder( "ne", "test:upper", KNOWN_PLACEHOLDER_VALUE.toLowerCase(), true, true); + } + + @Test + public void testFilterWithPlaceholderStringNotNe() { + testPredicateWithPlaceholder( "ne", "test:upper", KNOWN_PLACEHOLDER_VALUE.toUpperCase(), false, true); + } + + @Test + public void testFilterWithPlaceholderStringIn() { + testPredicateWithPlaceholder("in", "test:lower", + "\"" + KNOWN_PLACEHOLDER_VALUE.toLowerCase() + "\"," + "\"foo\"", true, false); + testPredicateWithPlaceholder("in", "test:lower", + "\"" + KNOWN_PLACEHOLDER_VALUE.toUpperCase() + "\"," + "\"foo\"", false, false); + } + + @Test + public void testFilterWithPlaceholderStringLike() { + testPredicateWithPlaceholder("like", "test:upper", "LO*", true, true); + testPredicateWithPlaceholder("like", "test:upper", "l*", false, true); + testPredicateWithPlaceholder("like", "test:lower", "*rem", true, true); } } diff --git a/thingsearch/service/src/test/java/org/eclipse/ditto/thingsearch/service/starter/ThingSearchServiceGlobalErrorRegistryTest.java b/thingsearch/service/src/test/java/org/eclipse/ditto/thingsearch/service/starter/ThingSearchServiceGlobalErrorRegistryTest.java index efc8f2229d..9b5d95736c 100644 --- a/thingsearch/service/src/test/java/org/eclipse/ditto/thingsearch/service/starter/ThingSearchServiceGlobalErrorRegistryTest.java +++ b/thingsearch/service/src/test/java/org/eclipse/ditto/thingsearch/service/starter/ThingSearchServiceGlobalErrorRegistryTest.java @@ -28,6 +28,7 @@ import org.eclipse.ditto.connectivity.model.signals.commands.exceptions.ConnectionConflictException; import org.eclipse.ditto.internal.utils.test.GlobalErrorRegistryTestCases; import org.eclipse.ditto.messages.model.AuthorizationSubjectBlockedException; +import org.eclipse.ditto.placeholders.PlaceholderFunctionSignatureInvalidException; import org.eclipse.ditto.policies.model.PolicyEntryInvalidException; import org.eclipse.ditto.policies.model.signals.commands.exceptions.PolicyConflictException; import org.eclipse.ditto.protocol.UnknownSignalException; @@ -59,6 +60,7 @@ public ThingSearchServiceGlobalErrorRegistryTest() { AcknowledgementCorrelationIdMissingException.class, PathUnknownException.class, AskException.class, + PlaceholderFunctionSignatureInvalidException.class, ConnectionIdInvalidException.class, ConnectionConflictException.class, UnknownTopicPathException.class,