|
17 | 17 |
|
18 | 18 | import java.util.Collections; |
19 | 19 | import java.util.List; |
| 20 | +import java.util.Map; |
20 | 21 | import java.util.Optional; |
21 | 22 | import java.util.Set; |
22 | 23 | import java.util.function.Predicate; |
23 | 24 |
|
24 | 25 | import javax.annotation.Nullable; |
25 | 26 |
|
26 | 27 | import org.eclipse.ditto.base.model.auth.AuthorizationContext; |
| 28 | +import org.eclipse.ditto.base.model.entity.id.EntityId; |
27 | 29 | import org.eclipse.ditto.base.model.entity.id.WithEntityId; |
28 | 30 | import org.eclipse.ditto.base.model.headers.DittoHeaders; |
29 | 31 | import org.eclipse.ditto.base.model.namespaces.NamespaceReader; |
|
39 | 41 | import org.eclipse.ditto.connectivity.model.signals.announcements.ConnectivityAnnouncement; |
40 | 42 | import org.eclipse.ditto.connectivity.service.messaging.monitoring.ConnectionMonitor; |
41 | 43 | import org.eclipse.ditto.connectivity.service.messaging.monitoring.ConnectionMonitorRegistry; |
| 44 | +import org.eclipse.ditto.edge.service.placeholders.EntityIdPlaceholder; |
| 45 | +import org.eclipse.ditto.edge.service.placeholders.FeaturePlaceholder; |
| 46 | +import org.eclipse.ditto.edge.service.placeholders.ThingPlaceholder; |
42 | 47 | import org.eclipse.ditto.json.JsonFieldSelector; |
43 | 48 | import org.eclipse.ditto.json.JsonPointer; |
44 | 49 | import org.eclipse.ditto.messages.model.signals.commands.MessageCommand; |
45 | 50 | import org.eclipse.ditto.messages.model.signals.commands.MessageCommandResponse; |
| 51 | +import org.eclipse.ditto.placeholders.HeadersPlaceholder; |
46 | 52 | import org.eclipse.ditto.placeholders.PlaceholderFactory; |
47 | 53 | import org.eclipse.ditto.placeholders.PlaceholderResolver; |
48 | 54 | import org.eclipse.ditto.placeholders.TimePlaceholder; |
@@ -70,8 +76,12 @@ public final class SignalFilter { |
70 | 76 |
|
71 | 77 | private static final DittoProtocolAdapter DITTO_PROTOCOL_ADAPTER = DittoProtocolAdapter.newInstance(); |
72 | 78 | private static final TopicPathPlaceholder TOPIC_PATH_PLACEHOLDER = TopicPathPlaceholder.getInstance(); |
| 79 | + private static final EntityIdPlaceholder ENTITY_ID_PLACEHOLDER = EntityIdPlaceholder.getInstance(); |
| 80 | + private static final ThingPlaceholder THING_PLACEHOLDER = ThingPlaceholder.getInstance(); |
| 81 | + private static final FeaturePlaceholder FEATURE_PLACEHOLDER = FeaturePlaceholder.getInstance(); |
73 | 82 | private static final ResourcePlaceholder RESOURCE_PLACEHOLDER = ResourcePlaceholder.getInstance(); |
74 | 83 | private static final TimePlaceholder TIME_PLACEHOLDER = TimePlaceholder.getInstance(); |
| 84 | + private static final HeadersPlaceholder HEADERS_PLACEHOLDER = PlaceholderFactory.newHeadersPlaceholder(); |
75 | 85 |
|
76 | 86 | private final Connection connection; |
77 | 87 | private final ConnectionMonitorRegistry<ConnectionMonitor> connectionMonitorRegistry; |
@@ -165,24 +175,40 @@ private static boolean matchesFilterBeforeEnrichment(final FilteredTopic filtere |
165 | 175 | final TopicPath topicPath = DITTO_PROTOCOL_ADAPTER.toTopicPath(signal); |
166 | 176 | final PlaceholderResolver<TopicPath> topicPathPlaceholderResolver = |
167 | 177 | PlaceholderFactory.newPlaceholderResolver(TOPIC_PATH_PLACEHOLDER, topicPath); |
| 178 | + final PlaceholderResolver<EntityId> entityIdPlaceholderResolver = PlaceholderFactory |
| 179 | + .newPlaceholderResolver(ENTITY_ID_PLACEHOLDER, |
| 180 | + (signal instanceof WithEntityId withEntityId) ? withEntityId.getEntityId() : null); |
| 181 | + final PlaceholderResolver<EntityId> thingPlaceholderResolver = PlaceholderFactory |
| 182 | + .newPlaceholderResolver(THING_PLACEHOLDER, |
| 183 | + (signal instanceof WithEntityId withEntityId) ? withEntityId.getEntityId() : null); |
| 184 | + final PlaceholderResolver<Signal<?>> featurePlaceholderResolver = PlaceholderFactory |
| 185 | + .newPlaceholderResolver(FEATURE_PLACEHOLDER, signal); |
168 | 186 | final PlaceholderResolver<WithResource> resourcePlaceholderResolver = PlaceholderFactory |
169 | 187 | .newPlaceholderResolver(RESOURCE_PLACEHOLDER, signal); |
170 | 188 | final PlaceholderResolver<Object> timePlaceholderResolver = PlaceholderFactory |
171 | 189 | .newPlaceholderResolver(TIME_PLACEHOLDER, new Object()); |
| 190 | + final PlaceholderResolver<Map<String, String>> headersPlaceholderResolver = PlaceholderFactory |
| 191 | + .newPlaceholderResolver(HEADERS_PLACEHOLDER, signal.getDittoHeaders()); |
172 | 192 | final Criteria criteria = parseCriteria(filterOptional.get(), signal.getDittoHeaders(), |
173 | | - topicPathPlaceholderResolver, resourcePlaceholderResolver, timePlaceholderResolver); |
| 193 | + topicPathPlaceholderResolver, entityIdPlaceholderResolver, thingPlaceholderResolver, |
| 194 | + featurePlaceholderResolver, resourcePlaceholderResolver, timePlaceholderResolver, |
| 195 | + headersPlaceholderResolver); |
174 | 196 | final Set<JsonPointer> extraFields = filteredTopic.getExtraFields() |
175 | 197 | .map(JsonFieldSelector::getPointers) |
176 | 198 | .orElse(Collections.emptySet()); |
177 | 199 | if (signal instanceof ThingEvent) { |
178 | 200 | return ThingEventToThingConverter.thingEventToThing((ThingEvent<?>) signal) |
179 | 201 | .filter(thing -> Thing3ValuePredicateVisitor.couldBeTrue(criteria, extraFields, thing, |
180 | | - topicPathPlaceholderResolver, resourcePlaceholderResolver, timePlaceholderResolver)) |
| 202 | + topicPathPlaceholderResolver, entityIdPlaceholderResolver, thingPlaceholderResolver, |
| 203 | + featurePlaceholderResolver, resourcePlaceholderResolver, timePlaceholderResolver, |
| 204 | + headersPlaceholderResolver)) |
181 | 205 | .isPresent(); |
182 | 206 | } else { |
183 | 207 | final Thing emptyThing = Thing.newBuilder().build(); |
184 | 208 | return Thing3ValuePredicateVisitor.couldBeTrue(criteria, extraFields, emptyThing, |
185 | | - topicPathPlaceholderResolver, resourcePlaceholderResolver, timePlaceholderResolver); |
| 209 | + topicPathPlaceholderResolver, entityIdPlaceholderResolver, thingPlaceholderResolver, |
| 210 | + featurePlaceholderResolver, resourcePlaceholderResolver, timePlaceholderResolver, |
| 211 | + headersPlaceholderResolver); |
186 | 212 | } |
187 | 213 | } else { |
188 | 214 | return true; |
|
0 commit comments