Skip to content

Commit

Permalink
added smarter publishing of "PolicyTag" messages after modification o…
Browse files Browse the repository at this point in the history
…f a Policy

* only if the Policy semantically changed (e.g. subjectIds or resources were changed)
* that causes that many cache invalidations do not need to happen for use cases which modify a Policy in a way which does not change enforcement outcome
* also renamed AbstractEvent.appendPayloadAndBuild to appendPayload - because the method does not build, it just appends to the builder

Signed-off-by: Thomas Jaeckle <thomas.jaeckle@bosch.io>
  • Loading branch information
thjaeckle committed Jul 29, 2022
1 parent 0a1555e commit 474a9c1
Show file tree
Hide file tree
Showing 74 changed files with 502 additions and 319 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,13 @@
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;

import org.eclipse.ditto.base.model.entity.metadata.Metadata;
import org.eclipse.ditto.base.model.headers.DittoHeaders;
import org.eclipse.ditto.base.model.json.JsonSchemaVersion;
import org.eclipse.ditto.json.JsonFactory;
import org.eclipse.ditto.json.JsonField;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonObjectBuilder;
import org.eclipse.ditto.base.model.entity.metadata.Metadata;
import org.eclipse.ditto.base.model.headers.DittoHeaders;
import org.eclipse.ditto.base.model.json.JsonSchemaVersion;


/**
Expand Down Expand Up @@ -104,7 +104,7 @@ public JsonObject toJson(final JsonSchemaVersion schemaVersion, final Predicate<
.set(JsonFields.TIMESTAMP, getTimestamp().map(Instant::toString).orElse(null), predicate)
.set(JsonFields.METADATA, getMetadata().map(Metadata::toJson).orElse(null), predicate);

appendPayloadAndBuild(jsonObjectBuilder, schemaVersion, thePredicate);
appendPayload(jsonObjectBuilder, schemaVersion, thePredicate);
return jsonObjectBuilder.build();
}

Expand All @@ -115,8 +115,8 @@ public JsonObject toJson(final JsonSchemaVersion schemaVersion, final Predicate<
* @param schemaVersion the JsonSchemaVersion used in toJson().
* @param predicate the predicate to evaluate when adding the payload.
*/
protected abstract void appendPayloadAndBuild(final JsonObjectBuilder jsonObjectBuilder,
final JsonSchemaVersion schemaVersion, final Predicate<JsonField> predicate);
protected abstract void appendPayload(JsonObjectBuilder jsonObjectBuilder,
JsonSchemaVersion schemaVersion, Predicate<JsonField> predicate);

@SuppressWarnings({"squid:MethodCyclomaticComplexity", "squid:S1067", "OverlyComplexMethod"})
@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,15 @@
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;

import org.eclipse.ditto.base.model.entity.id.EntityId;
import org.eclipse.ditto.base.model.entity.metadata.Metadata;
import org.eclipse.ditto.base.model.headers.DittoHeaders;
import org.eclipse.ditto.base.model.json.JsonSchemaVersion;
import org.eclipse.ditto.json.JsonFactory;
import org.eclipse.ditto.json.JsonField;
import org.eclipse.ditto.json.JsonFieldDefinition;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonObjectBuilder;
import org.eclipse.ditto.base.model.entity.id.EntityId;
import org.eclipse.ditto.base.model.entity.metadata.Metadata;
import org.eclipse.ditto.base.model.headers.DittoHeaders;
import org.eclipse.ditto.base.model.json.JsonSchemaVersion;

/**
* Abstract base class of an event store event.
Expand Down Expand Up @@ -104,7 +104,7 @@ public JsonObject toJson(final JsonSchemaVersion schemaVersion, final Predicate<
.set(EventsourcedEvent.JsonFields.REVISION, revision, predicate)
.set(entityIdFieldDefinition, entityId.toString());

appendPayloadAndBuild(jsonObjectBuilder, schemaVersion, thePredicate);
appendPayload(jsonObjectBuilder, schemaVersion, thePredicate);
return jsonObjectBuilder.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,17 @@
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;

import org.eclipse.ditto.json.JsonFactory;
import org.eclipse.ditto.json.JsonField;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonObjectBuilder;
import org.eclipse.ditto.json.JsonPointer;
import org.eclipse.ditto.base.model.entity.metadata.Metadata;
import org.eclipse.ditto.base.model.headers.DittoHeaders;
import org.eclipse.ditto.base.model.json.JsonParsableEvent;
import org.eclipse.ditto.base.model.json.JsonSchemaVersion;
import org.eclipse.ditto.connectivity.model.ConnectionId;
import org.eclipse.ditto.base.model.signals.events.EventJsonDeserializer;
import org.eclipse.ditto.connectivity.model.ConnectionId;
import org.eclipse.ditto.json.JsonFactory;
import org.eclipse.ditto.json.JsonField;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonObjectBuilder;
import org.eclipse.ditto.json.JsonPointer;

/**
* This event is emitted after a {@link org.eclipse.ditto.connectivity.model.Connection} was closed.
Expand Down Expand Up @@ -132,7 +132,7 @@ public ConnectionClosed setDittoHeaders(final DittoHeaders dittoHeaders) {
}

@Override
protected void appendPayloadAndBuild(final JsonObjectBuilder jsonObjectBuilder,
protected void appendPayload(final JsonObjectBuilder jsonObjectBuilder,
final JsonSchemaVersion schemaVersion, final Predicate<JsonField> thePredicate) {
// nothing to append
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,19 @@
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;

import org.eclipse.ditto.json.JsonFactory;
import org.eclipse.ditto.json.JsonField;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonObjectBuilder;
import org.eclipse.ditto.json.JsonPointer;
import org.eclipse.ditto.json.JsonValue;
import org.eclipse.ditto.base.model.entity.metadata.Metadata;
import org.eclipse.ditto.base.model.headers.DittoHeaders;
import org.eclipse.ditto.base.model.json.JsonParsableEvent;
import org.eclipse.ditto.base.model.json.JsonSchemaVersion;
import org.eclipse.ditto.base.model.signals.events.EventJsonDeserializer;
import org.eclipse.ditto.connectivity.model.Connection;
import org.eclipse.ditto.connectivity.model.ConnectivityModelFactory;
import org.eclipse.ditto.base.model.signals.events.EventJsonDeserializer;
import org.eclipse.ditto.json.JsonFactory;
import org.eclipse.ditto.json.JsonField;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonObjectBuilder;
import org.eclipse.ditto.json.JsonPointer;
import org.eclipse.ditto.json.JsonValue;

/**
* This event is emitted after a {@link org.eclipse.ditto.connectivity.model.Connection} was created.
Expand Down Expand Up @@ -154,7 +154,7 @@ public ConnectionCreated setDittoHeaders(final DittoHeaders dittoHeaders) {
}

@Override
protected void appendPayloadAndBuild(final JsonObjectBuilder jsonObjectBuilder,
protected void appendPayload(final JsonObjectBuilder jsonObjectBuilder,
final JsonSchemaVersion schemaVersion, final Predicate<JsonField> thePredicate) {
final Predicate<JsonField> predicate = schemaVersion.and(thePredicate);
jsonObjectBuilder.set(ConnectivityEvent.JsonFields.CONNECTION,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,17 @@
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;

import org.eclipse.ditto.json.JsonFactory;
import org.eclipse.ditto.json.JsonField;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonObjectBuilder;
import org.eclipse.ditto.json.JsonPointer;
import org.eclipse.ditto.base.model.entity.metadata.Metadata;
import org.eclipse.ditto.base.model.headers.DittoHeaders;
import org.eclipse.ditto.base.model.json.JsonParsableEvent;
import org.eclipse.ditto.base.model.json.JsonSchemaVersion;
import org.eclipse.ditto.connectivity.model.ConnectionId;
import org.eclipse.ditto.base.model.signals.events.EventJsonDeserializer;
import org.eclipse.ditto.connectivity.model.ConnectionId;
import org.eclipse.ditto.json.JsonFactory;
import org.eclipse.ditto.json.JsonField;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonObjectBuilder;
import org.eclipse.ditto.json.JsonPointer;

/**
* This event is emitted after a {@link org.eclipse.ditto.connectivity.model.Connection} was deleted.
Expand Down Expand Up @@ -131,7 +131,7 @@ public ConnectionDeleted setDittoHeaders(final DittoHeaders dittoHeaders) {
}

@Override
protected void appendPayloadAndBuild(final JsonObjectBuilder jsonObjectBuilder,
protected void appendPayload(final JsonObjectBuilder jsonObjectBuilder,
final JsonSchemaVersion schemaVersion, final Predicate<JsonField> thePredicate) {
// nothing to append
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,19 @@
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;

import org.eclipse.ditto.json.JsonFactory;
import org.eclipse.ditto.json.JsonField;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonObjectBuilder;
import org.eclipse.ditto.json.JsonPointer;
import org.eclipse.ditto.json.JsonValue;
import org.eclipse.ditto.base.model.entity.metadata.Metadata;
import org.eclipse.ditto.base.model.headers.DittoHeaders;
import org.eclipse.ditto.base.model.json.JsonParsableEvent;
import org.eclipse.ditto.base.model.json.JsonSchemaVersion;
import org.eclipse.ditto.base.model.signals.events.EventJsonDeserializer;
import org.eclipse.ditto.connectivity.model.Connection;
import org.eclipse.ditto.connectivity.model.ConnectivityModelFactory;
import org.eclipse.ditto.base.model.signals.events.EventJsonDeserializer;
import org.eclipse.ditto.json.JsonFactory;
import org.eclipse.ditto.json.JsonField;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonObjectBuilder;
import org.eclipse.ditto.json.JsonPointer;
import org.eclipse.ditto.json.JsonValue;

/**
* This event is emitted after a {@link org.eclipse.ditto.connectivity.model.Connection} was modified.
Expand Down Expand Up @@ -153,7 +153,7 @@ public ConnectionModified setDittoHeaders(final DittoHeaders dittoHeaders) {
}

@Override
protected void appendPayloadAndBuild(final JsonObjectBuilder jsonObjectBuilder,
protected void appendPayload(final JsonObjectBuilder jsonObjectBuilder,
final JsonSchemaVersion schemaVersion, final Predicate<JsonField> thePredicate) {
final Predicate<JsonField> predicate = schemaVersion.and(thePredicate);
jsonObjectBuilder.set(ConnectivityEvent.JsonFields.CONNECTION,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,17 +20,17 @@
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;

import org.eclipse.ditto.json.JsonFactory;
import org.eclipse.ditto.json.JsonField;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonObjectBuilder;
import org.eclipse.ditto.json.JsonPointer;
import org.eclipse.ditto.base.model.entity.metadata.Metadata;
import org.eclipse.ditto.base.model.headers.DittoHeaders;
import org.eclipse.ditto.base.model.json.JsonParsableEvent;
import org.eclipse.ditto.base.model.json.JsonSchemaVersion;
import org.eclipse.ditto.connectivity.model.ConnectionId;
import org.eclipse.ditto.base.model.signals.events.EventJsonDeserializer;
import org.eclipse.ditto.connectivity.model.ConnectionId;
import org.eclipse.ditto.json.JsonFactory;
import org.eclipse.ditto.json.JsonField;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonObjectBuilder;
import org.eclipse.ditto.json.JsonPointer;

/**
* This event is emitted after a {@link org.eclipse.ditto.connectivity.model.Connection} was opened.
Expand Down Expand Up @@ -131,7 +131,7 @@ public ConnectionOpened setDittoHeaders(final DittoHeaders dittoHeaders) {
}

@Override
protected void appendPayloadAndBuild(final JsonObjectBuilder jsonObjectBuilder,
protected void appendPayload(final JsonObjectBuilder jsonObjectBuilder,
final JsonSchemaVersion schemaVersion, final Predicate<JsonField> thePredicate) {
// nothing to append
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ protected DittoRuntimeExceptionBuilder<?> newNotAccessibleExceptionBuilder() {
}

@Override
protected void publishEvent(final ConnectivityEvent<?> event) {
protected void publishEvent(@Nullable final Connection previousEntity, final ConnectivityEvent<?> event) {
if (event instanceof ConnectionDeleted) {
pubSubMediator.tell(DistPubSubAccess.publish(ConnectionDeleted.TYPE, event), getSelf());
} else if (event instanceof ConnectionCreated) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
import org.eclipse.ditto.base.model.headers.DittoHeaders;
import org.eclipse.ditto.base.model.headers.WithDittoHeaders;
import org.eclipse.ditto.base.model.json.JsonSchemaVersion;
import org.eclipse.ditto.base.model.json.Jsonifiable;
import org.eclipse.ditto.base.model.signals.commands.Command;
import org.eclipse.ditto.base.model.signals.events.Event;
import org.eclipse.ditto.internal.utils.akka.PingCommand;
Expand All @@ -42,6 +43,7 @@
import org.eclipse.ditto.internal.utils.tracing.DittoTracing;
import org.eclipse.ditto.internal.utils.tracing.TracingTags;
import org.eclipse.ditto.internal.utils.tracing.instruments.trace.StartedTrace;
import org.eclipse.ditto.json.JsonField;
import org.eclipse.ditto.json.JsonValue;

import akka.actor.ActorRef;
Expand All @@ -65,7 +67,7 @@
*/
public abstract class AbstractPersistenceActor<
C extends Command<?>,
S,
S extends Jsonifiable.WithFieldSelectorAndPredicate<JsonField>,
I extends EntityId,
K,
E extends Event<? extends E>> extends AbstractPersistentActorWithTimersAndCleanup implements ResultVisitor<E> {
Expand Down Expand Up @@ -187,9 +189,10 @@ protected void onEntityModified() {
/**
* Publish an event.
*
* @param event the event.
* @param previousEntity the previous state of the entity before the event was applied.
* @param event the event which was applied.
*/
protected abstract void publishEvent(E event);
protected abstract void publishEvent(@Nullable S previousEntity, E event);

/**
* Get the implemented schema version of an entity.
Expand Down Expand Up @@ -577,8 +580,9 @@ private boolean snapshotThresholdPassed() {
}

private void applyEvent(final E event) {
final S previousEntity = entity;
handleEvents.onMessage().apply(event);
publishEvent(event);
publishEvent(previousEntity, event);
}

private void notifySender(final WithDittoHeaders message) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import java.time.format.DateTimeParseException;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
Expand All @@ -37,18 +38,18 @@
import javax.annotation.Nullable;
import javax.annotation.concurrent.Immutable;

import org.eclipse.ditto.base.model.entity.metadata.Metadata;
import org.eclipse.ditto.base.model.entity.metadata.MetadataModelFactory;
import org.eclipse.ditto.base.model.exceptions.DittoJsonException;
import org.eclipse.ditto.base.model.json.FieldType;
import org.eclipse.ditto.base.model.json.JsonSchemaVersion;
import org.eclipse.ditto.json.JsonCollectors;
import org.eclipse.ditto.json.JsonFactory;
import org.eclipse.ditto.json.JsonField;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonObjectBuilder;
import org.eclipse.ditto.json.JsonParseException;
import org.eclipse.ditto.json.JsonValue;
import org.eclipse.ditto.base.model.entity.metadata.Metadata;
import org.eclipse.ditto.base.model.entity.metadata.MetadataModelFactory;
import org.eclipse.ditto.base.model.exceptions.DittoJsonException;
import org.eclipse.ditto.base.model.json.FieldType;
import org.eclipse.ditto.base.model.json.JsonSchemaVersion;

/**
* Immutable implementation of {@link Policy}.
Expand Down Expand Up @@ -436,6 +437,19 @@ public Stream<PolicyEntry> stream() {
return entries.values().stream();
}

@Override
public boolean isSemanticallySameAs(final Collection<PolicyEntry> otherPolicyEntries) {
// wrapping the passed HashSets eliminates relevance of order:
final Iterator<PolicyEntry> others = new HashSet<>(otherPolicyEntries).iterator();
final Iterator<PolicyEntry> owns = new HashSet<>(entries.values()).iterator();
boolean semanticallyTheSame = true;
while(others.hasNext() && owns.hasNext()) {
semanticallyTheSame &= others.next().isSemanticallySameAs(owns.next());
}
semanticallyTheSame &= !others.hasNext() && !owns.hasNext();
return semanticallyTheSame;
}

@Override
public Iterator<PolicyEntry> iterator() {
final Set<PolicyEntry> policyEntries = getEntriesSet();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@

import javax.annotation.concurrent.Immutable;

import org.eclipse.ditto.base.model.exceptions.DittoJsonException;
import org.eclipse.ditto.base.model.json.JsonSchemaVersion;
import org.eclipse.ditto.json.JsonFactory;
import org.eclipse.ditto.json.JsonField;
import org.eclipse.ditto.json.JsonMissingFieldException;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.base.model.exceptions.DittoJsonException;
import org.eclipse.ditto.base.model.json.JsonSchemaVersion;

/**
* An immutable implementation of {@link PolicyEntry}.
Expand Down Expand Up @@ -103,6 +103,12 @@ public Resources getResources() {
return resources;
}

@Override
public boolean isSemanticallySameAs(final PolicyEntry otherPolicyEntry) {
return subjects.isSemanticallySameAs(otherPolicyEntry.getSubjects()) &&
resources.equals(otherPolicyEntry.getResources());
}

@Override
public JsonObject toJson(final JsonSchemaVersion schemaVersion, final Predicate<JsonField> thePredicate) {
final Predicate<JsonField> predicate = schemaVersion.and(thePredicate);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,12 @@ public Stream<Subject> stream() {
return subjects.values().stream();
}

@Override
public boolean isSemanticallySameAs(final Subjects otherSubjects) {
return subjects.keySet()
.equals(otherSubjects.stream().map(Subject::getId).collect(Collectors.toSet()));
}

@SuppressWarnings({"squid:MethodCyclomaticComplexity", "squid:S1067"})
@Override
public boolean equals(final Object o) {
Expand Down
Loading

0 comments on commit 474a9c1

Please sign in to comment.