Skip to content

Commit

Permalink
Set revision to policy when it can be derived from the entity tag con…
Browse files Browse the repository at this point in the history
…tained in the response headers

Signed-off-by: Yannic Klem <Yannic.Klem@bosch.io>
  • Loading branch information
Yannic92 committed Mar 21, 2022
1 parent d3acd80 commit ae0886d
Showing 1 changed file with 43 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@

import javax.annotation.Nonnull;

import org.eclipse.ditto.base.model.acks.AcknowledgementLabel;
import org.eclipse.ditto.base.model.acks.DittoAcknowledgementLabel;
import org.eclipse.ditto.base.model.headers.DittoHeaders;
import org.eclipse.ditto.base.model.headers.entitytag.EntityTag;
import org.eclipse.ditto.client.internal.AbstractHandle;
import org.eclipse.ditto.client.internal.OutgoingMessageFactory;
import org.eclipse.ditto.client.internal.bus.PointerBus;
Expand All @@ -28,12 +32,10 @@
import org.eclipse.ditto.client.policies.Policies;
import org.eclipse.ditto.json.JsonObject;
import org.eclipse.ditto.json.JsonValue;
import org.eclipse.ditto.base.model.acks.AcknowledgementLabel;
import org.eclipse.ditto.base.model.acks.DittoAcknowledgementLabel;
import org.eclipse.ditto.policies.model.PoliciesModelFactory;
import org.eclipse.ditto.policies.model.Policy;
import org.eclipse.ditto.policies.model.PolicyId;
import org.eclipse.ditto.protocol.TopicPath;
import org.eclipse.ditto.policies.model.PolicyRevision;
import org.eclipse.ditto.policies.model.signals.commands.modify.CreatePolicy;
import org.eclipse.ditto.policies.model.signals.commands.modify.CreatePolicyResponse;
import org.eclipse.ditto.policies.model.signals.commands.modify.DeletePolicy;
Expand All @@ -42,6 +44,7 @@
import org.eclipse.ditto.policies.model.signals.commands.modify.PolicyModifyCommandResponse;
import org.eclipse.ditto.policies.model.signals.commands.query.RetrievePolicy;
import org.eclipse.ditto.policies.model.signals.commands.query.RetrievePolicyResponse;
import org.eclipse.ditto.protocol.TopicPath;

/**
* Default implementation for {@link Policies}.
Expand Down Expand Up @@ -75,14 +78,44 @@ public static PoliciesImpl newInstance(final MessagingProvider messagingProvider
return new PoliciesImpl(messagingProvider, outgoingMessageFactory, bus);
}

private static Optional<PolicyRevision> getRevisionFromDittoHeaders(final DittoHeaders dittoHeaders) {
return dittoHeaders
.getETag()
.map(EntityTag::getOpaqueTag)
.filter(tag -> tag.contains("rev:"))
.map(tag -> tag.replace("rev:", "").replaceAll("\"", ""))
.map(Long::parseLong)
.map(PolicyRevision::newInstance);
}

private static Policy setRevisionToPolicy(final PolicyRevision policyRevision, final Policy policy) {
return policy.toBuilder()
.setRevision(policyRevision)
.build();
}

private static Policy appendRevisionFromHeadersIfNeeded(final Policy policy, final DittoHeaders dittoHeaders) {
final Policy policyWithRevision;
final Optional<PolicyRevision> revisionFromPolicy = policy.getRevision();
policyWithRevision = revisionFromPolicy
.map(policyRevision -> setRevisionToPolicy(policyRevision, policy))
.orElseGet(() -> getRevisionFromDittoHeaders(dittoHeaders)
.map(revisionFromHeaders -> setRevisionToPolicy(revisionFromHeaders, policy))
.orElse(policy));
return policyWithRevision;
}

@Override
public CompletionStage<Policy> create(final Policy policy, final Option<?>... options) {
argumentNotNull(policy);
assertThatPolicyHasId(policy);

final CreatePolicy command = outgoingMessageFactory.createPolicy(policy, options);
return askPolicyCommand(command, CreatePolicyResponse.class,
response -> response.getPolicyCreated().orElse(null));
response -> response.getPolicyCreated()
.map(policyFromResponse -> appendRevisionFromHeadersIfNeeded(policyFromResponse,
response.getDittoHeaders()))
.orElse(null));
}

@Override
Expand All @@ -104,6 +137,8 @@ public CompletionStage<Optional<Policy>> put(final Policy policy, final Option<?
response -> response.getEntity(response.getImplementedSchemaVersion())
.map(JsonValue::asObject)
.map(PoliciesModelFactory::newPolicy)
.map(policyFromResponse -> appendRevisionFromHeadersIfNeeded(policyFromResponse,
response.getDittoHeaders()))
);
}

Expand Down Expand Up @@ -143,7 +178,10 @@ public CompletionStage<Void> delete(final PolicyId policyId, final Option<?>...
@Override
public CompletionStage<Policy> retrieve(PolicyId policyId) {
final RetrievePolicy command = outgoingMessageFactory.retrievePolicy(policyId);
return askPolicyCommand(command, RetrievePolicyResponse.class, RetrievePolicyResponse::getPolicy);
return askPolicyCommand(command, RetrievePolicyResponse.class, response -> {
final Policy policyFromResponse = response.getPolicy();
return appendRevisionFromHeadersIfNeeded(policyFromResponse, response.getDittoHeaders());
});
}

private static void assertThatPolicyHasId(final Policy policy) {
Expand Down

0 comments on commit ae0886d

Please sign in to comment.