Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix pre-defined extraFields were causing missing extra from Thing created events #2137

Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -193,21 +193,36 @@ private CompletionStage<JsonObject> performPreDefinedExtraFieldsOptimization(fin

final JsonObject preDefinedExtraFields =
JsonObject.of(signalHeaders.get(DittoHeaderDefinition.PRE_DEFINED_EXTRA_FIELDS_OBJECT.getKey()));
final JsonObject filteredPreDefinedExtraFieldsReadGranted =
filterPreDefinedExtraReadGrantedObject(jsonFieldSelector, dittoHeaders, signalHeaders,
preDefinedExtraFields);
final JsonObject preDefinedExtraFieldsReadGrantObject = JsonObject.of(
signalHeaders.get(DittoHeaderDefinition.PRE_DEFINED_EXTRA_FIELDS_READ_GRANT_OBJECT.getKey())
);
final boolean preDefinedExtraFieldsAuthAvailable = !preDefinedExtraFieldsReadGrantObject.isEmpty();

final JsonObject filteredPreDefinedExtraFieldsReadGranted = filterPreDefinedExtraReadGrantedObject(
jsonFieldSelector, dittoHeaders, preDefinedExtraFieldsReadGrantObject, preDefinedExtraFields);

final boolean allExtraFieldsPresent =
allConfiguredPredefinedExtraFields.containsAll(jsonFieldSelector.getPointers());
if (allExtraFieldsPresent) {
final boolean allExtraFieldsPresent = jsonFieldSelector.getPointers().stream()
.allMatch(requiredField ->
allConfiguredPredefinedExtraFields.contains(requiredField) ||
allConfiguredPredefinedExtraFields.stream()
.anyMatch(configuredField ->
requiredField.toString().startsWith(configuredField.toString())
)
);

if (allExtraFieldsPresent && preDefinedExtraFieldsAuthAvailable) {
LOGGER.withCorrelationId(dittoHeaders)
.debug("All asked for extraFields for thing <{}> were present in pre-defined fields, " +
"skipping cache retrieval: <{}>", thingId, jsonFieldSelector);
return CompletableFuture.completedStage(filteredPreDefinedExtraFieldsReadGranted);
} else {
// optimization to only fetch extra fields which were not pre-defined
final List<JsonPointer> missingFieldsPointers = new ArrayList<>(jsonFieldSelector.getPointers());
missingFieldsPointers.removeAll(allConfiguredPredefinedExtraFields);
if (preDefinedExtraFieldsAuthAvailable) {
// only if we have a proper authorization, we can apply the optimization and remove existing fields
// to not load them via cache
missingFieldsPointers.removeAll(allConfiguredPredefinedExtraFields);
}
final JsonFieldSelector missingFieldsSelector = JsonFactory.newFieldSelector(missingFieldsPointers);
final var cachingParameters =
new CachingParameters(missingFieldsSelector, thingEvents, true, 0);
@@ -228,12 +243,9 @@ private CompletionStage<JsonObject> performPreDefinedExtraFieldsOptimization(fin
private static JsonObject filterPreDefinedExtraReadGrantedObject(
final JsonFieldSelector jsonFieldSelector,
final DittoHeaders dittoHeaders,
final DittoHeaders signalHeaders,
final JsonObject preDefinedExtraFieldsReadGrant,
final JsonObject preDefinedExtraFields
) {
final JsonObject preDefinedExtraFieldsReadGrant = JsonObject.of(
signalHeaders.get(DittoHeaderDefinition.PRE_DEFINED_EXTRA_FIELDS_READ_GRANT_OBJECT.getKey())
);
final JsonFieldSelector grantedReadJsonFieldSelector = filterAskedForFieldSelectorToGrantedFields(
jsonFieldSelector,
preDefinedExtraFieldsReadGrant,
Original file line number Diff line number Diff line change
@@ -284,7 +284,11 @@ protected void publishEvent(@Nullable final Thing previousEntity, final ThingEve
final CompletionStage<ThingEvent<?>> stage = eventPreDefinedExtraFieldsEnricher.enrichWithPredefinedExtraFields(
entityId,
entity,
Optional.ofNullable(previousEntity).flatMap(Thing::getPolicyId).orElse(null),
Optional.ofNullable(entity).flatMap(Thing::getPolicyId)
.orElse(Optional.ofNullable(previousEntity)
.flatMap(Thing::getPolicyId)
.orElse(null)
),
event
);
stage.whenComplete((modifiedEvent, ex) -> {