Skip to content

Commit bc44a86

Browse files
authored
Merge pull request #2137 from beyonnex-io/bugfix/fix-pre-defined-extra-fields-for-created-events
fix pre-defined extraFields were causing missing extra from Thing created events
2 parents 94a364c + 56b32f3 commit bc44a86

File tree

2 files changed

+28
-12
lines changed

2 files changed

+28
-12
lines changed

internal/models/signalenrichment/src/main/java/org/eclipse/ditto/internal/models/signalenrichment/DittoCachingSignalEnrichmentFacade.java

+23-11
Original file line numberDiff line numberDiff line change
@@ -193,21 +193,36 @@ private CompletionStage<JsonObject> performPreDefinedExtraFieldsOptimization(fin
193193

194194
final JsonObject preDefinedExtraFields =
195195
JsonObject.of(signalHeaders.get(DittoHeaderDefinition.PRE_DEFINED_EXTRA_FIELDS_OBJECT.getKey()));
196-
final JsonObject filteredPreDefinedExtraFieldsReadGranted =
197-
filterPreDefinedExtraReadGrantedObject(jsonFieldSelector, dittoHeaders, signalHeaders,
198-
preDefinedExtraFields);
196+
final JsonObject preDefinedExtraFieldsReadGrantObject = JsonObject.of(
197+
signalHeaders.get(DittoHeaderDefinition.PRE_DEFINED_EXTRA_FIELDS_READ_GRANT_OBJECT.getKey())
198+
);
199+
final boolean preDefinedExtraFieldsAuthAvailable = !preDefinedExtraFieldsReadGrantObject.isEmpty();
200+
201+
final JsonObject filteredPreDefinedExtraFieldsReadGranted = filterPreDefinedExtraReadGrantedObject(
202+
jsonFieldSelector, dittoHeaders, preDefinedExtraFieldsReadGrantObject, preDefinedExtraFields);
199203

200-
final boolean allExtraFieldsPresent =
201-
allConfiguredPredefinedExtraFields.containsAll(jsonFieldSelector.getPointers());
202-
if (allExtraFieldsPresent) {
204+
final boolean allExtraFieldsPresent = jsonFieldSelector.getPointers().stream()
205+
.allMatch(requiredField ->
206+
allConfiguredPredefinedExtraFields.contains(requiredField) ||
207+
allConfiguredPredefinedExtraFields.stream()
208+
.anyMatch(configuredField ->
209+
requiredField.toString().startsWith(configuredField.toString())
210+
)
211+
);
212+
213+
if (allExtraFieldsPresent && preDefinedExtraFieldsAuthAvailable) {
203214
LOGGER.withCorrelationId(dittoHeaders)
204215
.debug("All asked for extraFields for thing <{}> were present in pre-defined fields, " +
205216
"skipping cache retrieval: <{}>", thingId, jsonFieldSelector);
206217
return CompletableFuture.completedStage(filteredPreDefinedExtraFieldsReadGranted);
207218
} else {
208219
// optimization to only fetch extra fields which were not pre-defined
209220
final List<JsonPointer> missingFieldsPointers = new ArrayList<>(jsonFieldSelector.getPointers());
210-
missingFieldsPointers.removeAll(allConfiguredPredefinedExtraFields);
221+
if (preDefinedExtraFieldsAuthAvailable) {
222+
// only if we have a proper authorization, we can apply the optimization and remove existing fields
223+
// to not load them via cache
224+
missingFieldsPointers.removeAll(allConfiguredPredefinedExtraFields);
225+
}
211226
final JsonFieldSelector missingFieldsSelector = JsonFactory.newFieldSelector(missingFieldsPointers);
212227
final var cachingParameters =
213228
new CachingParameters(missingFieldsSelector, thingEvents, true, 0);
@@ -228,12 +243,9 @@ private CompletionStage<JsonObject> performPreDefinedExtraFieldsOptimization(fin
228243
private static JsonObject filterPreDefinedExtraReadGrantedObject(
229244
final JsonFieldSelector jsonFieldSelector,
230245
final DittoHeaders dittoHeaders,
231-
final DittoHeaders signalHeaders,
246+
final JsonObject preDefinedExtraFieldsReadGrant,
232247
final JsonObject preDefinedExtraFields
233248
) {
234-
final JsonObject preDefinedExtraFieldsReadGrant = JsonObject.of(
235-
signalHeaders.get(DittoHeaderDefinition.PRE_DEFINED_EXTRA_FIELDS_READ_GRANT_OBJECT.getKey())
236-
);
237249
final JsonFieldSelector grantedReadJsonFieldSelector = filterAskedForFieldSelectorToGrantedFields(
238250
jsonFieldSelector,
239251
preDefinedExtraFieldsReadGrant,

things/service/src/main/java/org/eclipse/ditto/things/service/persistence/actors/ThingPersistenceActor.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,11 @@ protected void publishEvent(@Nullable final Thing previousEntity, final ThingEve
284284
final CompletionStage<ThingEvent<?>> stage = eventPreDefinedExtraFieldsEnricher.enrichWithPredefinedExtraFields(
285285
entityId,
286286
entity,
287-
Optional.ofNullable(previousEntity).flatMap(Thing::getPolicyId).orElse(null),
287+
Optional.ofNullable(entity).flatMap(Thing::getPolicyId)
288+
.orElse(Optional.ofNullable(previousEntity)
289+
.flatMap(Thing::getPolicyId)
290+
.orElse(null)
291+
),
288292
event
289293
);
290294
stage.whenComplete((modifiedEvent, ex) -> {

0 commit comments

Comments
 (0)