Skip to content

Commit

Permalink
fix caching of removed thing fields when modifying a complete thing, …
Browse files Browse the repository at this point in the history
…e.g. removing an existing definition

* added correct "_modified" to smart cached thing based on the event timestamp

Signed-off-by: Thomas Jaeckle <thomas.jaeckle@bosch.io>
  • Loading branch information
thjaeckle committed Nov 2, 2021
1 parent 9ee0caf commit 6079bc5
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,15 @@

import org.eclipse.ditto.base.model.entity.id.EntityId;
import org.eclipse.ditto.base.model.headers.DittoHeaders;
import org.eclipse.ditto.base.model.json.FieldType;
import org.eclipse.ditto.base.model.signals.Signal;
import org.eclipse.ditto.base.model.signals.WithResource;
import org.eclipse.ditto.internal.utils.akka.logging.DittoLoggerFactory;
import org.eclipse.ditto.internal.utils.akka.logging.ThreadSafeDittoLogger;
import org.eclipse.ditto.internal.utils.cache.Cache;
import org.eclipse.ditto.internal.utils.cache.CacheFactory;
import org.eclipse.ditto.internal.utils.cache.config.CacheConfig;
import org.eclipse.ditto.json.JsonCollectors;
import org.eclipse.ditto.json.JsonFactory;
import org.eclipse.ditto.json.JsonFieldSelector;
import org.eclipse.ditto.json.JsonObject;
Expand Down Expand Up @@ -386,16 +388,19 @@ private static JsonObject getDeleteJsonObject(final JsonObject jsonObject, final

private static JsonObject getDefaultJsonObject(final JsonObject jsonObject, final ThingEvent<?> thingEvent) {
final var resourcePath = thingEvent.getResourcePath();
final var jsonObjectBuilder = jsonObject.toBuilder();
final var nonHiddenFieldsJsonObjectBuilder = jsonObject.stream()
.filter(field -> !field.isMarkedAs(FieldType.HIDDEN))
.collect(JsonCollectors.fieldsToObject())
.toBuilder();
final Optional<JsonValue> optEntity = thingEvent.getEntity();
if (resourcePath.isEmpty() && optEntity.filter(JsonValue::isObject).isPresent()) {
optEntity.map(JsonValue::asObject).ifPresent(jsonObjectBuilder::setAll);
optEntity.map(JsonValue::asObject).ifPresent(nonHiddenFieldsJsonObjectBuilder::setAll);
} else {
optEntity.ifPresent(entity -> jsonObjectBuilder
optEntity.ifPresent(entity -> nonHiddenFieldsJsonObjectBuilder
.set(resourcePath.toString(), entity)
);
}
return jsonObjectBuilder.build();
return nonHiddenFieldsJsonObjectBuilder.build();
}

private Optional<CompletionStage<JsonObject>> invalidateCacheOnPolicyChange(final SignalEnrichmentCacheKey cacheKey,
Expand All @@ -420,8 +425,11 @@ private Optional<CompletionStage<JsonObject>> invalidateCacheOnPolicyChange(fina
private static JsonObject enhanceJsonObject(final JsonObject jsonObject, final List<ThingEvent<?>> concernedSignals,
@Nullable final JsonFieldSelector enhancedFieldSelector) {

final ThingEvent<?> last = getLast(concernedSignals);
final var jsonObjectBuilder = jsonObject.toBuilder()
.set(Thing.JsonFields.REVISION, getLast(concernedSignals).getRevision());
.set(Thing.JsonFields.REVISION, last.getRevision());
last.getTimestamp().ifPresent(timestamp ->
jsonObjectBuilder.set(Thing.JsonFields.MODIFIED, timestamp.toString()));
return enhancedFieldSelector == null
? jsonObjectBuilder.build()
: jsonObjectBuilder.build().get(enhancedFieldSelector);
Expand All @@ -445,6 +453,15 @@ private CachingParameters(@Nullable final JsonFieldSelector fieldSelector,
this.minAcceptableSeqNr = minAcceptableSeqNr;
}

@Override
public String toString() {
return getClass().getSimpleName() + " [" +
"fieldSelector=" + fieldSelector +
", concernedEvents=" + concernedEvents +
", invalidateCacheOnPolicyChange=" + invalidateCacheOnPolicyChange +
", minAcceptableSeqNr=" + minAcceptableSeqNr +
"]";
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,10 @@ private static Thing mergeThingModifications(final Thing thingWithModifications,

final ThingBuilder.FromCopy builder = existingThing.toBuilder()
.setModified(eventTs)
.setRevision(nextRevision);
.setRevision(nextRevision)
.removeAllAttributes()
.removeAllFeatures()
.removeDefinition();

thingWithModifications.getPolicyEntityId().ifPresent(builder::setPolicyId);
thingWithModifications.getDefinition().ifPresent(builder::setDefinition);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,10 @@ protected ThingModifiedStrategy() {
protected ThingBuilder.FromCopy applyEvent(final ThingModified event, final ThingBuilder.FromCopy thingBuilder) {

// we need to use the current thing as base otherwise we would loose its state
thingBuilder.setLifecycle(ThingLifecycle.ACTIVE);
thingBuilder.setLifecycle(ThingLifecycle.ACTIVE)
.removeAllAttributes()
.removeAllFeatures()
.removeDefinition();

final Thing thingWithModifications = event.getThing();
thingWithModifications.getPolicyEntityId().ifPresent(thingBuilder::setPolicyId);
Expand Down

0 comments on commit 6079bc5

Please sign in to comment.