Skip to content

Commit 4ca55ac

Browse files
authored
Merge pull request #182 from bosch-io/feature/ditto-client-policy-rev
Set revision to policy when it can be derived from the entity tag contained in the response headers
2 parents d3acd80 + ae0886d commit 4ca55ac

File tree

1 file changed

+43
-5
lines changed

1 file changed

+43
-5
lines changed

java/src/main/java/org/eclipse/ditto/client/policies/internal/PoliciesImpl.java

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020

2121
import javax.annotation.Nonnull;
2222

23+
import org.eclipse.ditto.base.model.acks.AcknowledgementLabel;
24+
import org.eclipse.ditto.base.model.acks.DittoAcknowledgementLabel;
25+
import org.eclipse.ditto.base.model.headers.DittoHeaders;
26+
import org.eclipse.ditto.base.model.headers.entitytag.EntityTag;
2327
import org.eclipse.ditto.client.internal.AbstractHandle;
2428
import org.eclipse.ditto.client.internal.OutgoingMessageFactory;
2529
import org.eclipse.ditto.client.internal.bus.PointerBus;
@@ -28,12 +32,10 @@
2832
import org.eclipse.ditto.client.policies.Policies;
2933
import org.eclipse.ditto.json.JsonObject;
3034
import org.eclipse.ditto.json.JsonValue;
31-
import org.eclipse.ditto.base.model.acks.AcknowledgementLabel;
32-
import org.eclipse.ditto.base.model.acks.DittoAcknowledgementLabel;
3335
import org.eclipse.ditto.policies.model.PoliciesModelFactory;
3436
import org.eclipse.ditto.policies.model.Policy;
3537
import org.eclipse.ditto.policies.model.PolicyId;
36-
import org.eclipse.ditto.protocol.TopicPath;
38+
import org.eclipse.ditto.policies.model.PolicyRevision;
3739
import org.eclipse.ditto.policies.model.signals.commands.modify.CreatePolicy;
3840
import org.eclipse.ditto.policies.model.signals.commands.modify.CreatePolicyResponse;
3941
import org.eclipse.ditto.policies.model.signals.commands.modify.DeletePolicy;
@@ -42,6 +44,7 @@
4244
import org.eclipse.ditto.policies.model.signals.commands.modify.PolicyModifyCommandResponse;
4345
import org.eclipse.ditto.policies.model.signals.commands.query.RetrievePolicy;
4446
import org.eclipse.ditto.policies.model.signals.commands.query.RetrievePolicyResponse;
47+
import org.eclipse.ditto.protocol.TopicPath;
4548

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

81+
private static Optional<PolicyRevision> getRevisionFromDittoHeaders(final DittoHeaders dittoHeaders) {
82+
return dittoHeaders
83+
.getETag()
84+
.map(EntityTag::getOpaqueTag)
85+
.filter(tag -> tag.contains("rev:"))
86+
.map(tag -> tag.replace("rev:", "").replaceAll("\"", ""))
87+
.map(Long::parseLong)
88+
.map(PolicyRevision::newInstance);
89+
}
90+
91+
private static Policy setRevisionToPolicy(final PolicyRevision policyRevision, final Policy policy) {
92+
return policy.toBuilder()
93+
.setRevision(policyRevision)
94+
.build();
95+
}
96+
97+
private static Policy appendRevisionFromHeadersIfNeeded(final Policy policy, final DittoHeaders dittoHeaders) {
98+
final Policy policyWithRevision;
99+
final Optional<PolicyRevision> revisionFromPolicy = policy.getRevision();
100+
policyWithRevision = revisionFromPolicy
101+
.map(policyRevision -> setRevisionToPolicy(policyRevision, policy))
102+
.orElseGet(() -> getRevisionFromDittoHeaders(dittoHeaders)
103+
.map(revisionFromHeaders -> setRevisionToPolicy(revisionFromHeaders, policy))
104+
.orElse(policy));
105+
return policyWithRevision;
106+
}
107+
78108
@Override
79109
public CompletionStage<Policy> create(final Policy policy, final Option<?>... options) {
80110
argumentNotNull(policy);
81111
assertThatPolicyHasId(policy);
82112

83113
final CreatePolicy command = outgoingMessageFactory.createPolicy(policy, options);
84114
return askPolicyCommand(command, CreatePolicyResponse.class,
85-
response -> response.getPolicyCreated().orElse(null));
115+
response -> response.getPolicyCreated()
116+
.map(policyFromResponse -> appendRevisionFromHeadersIfNeeded(policyFromResponse,
117+
response.getDittoHeaders()))
118+
.orElse(null));
86119
}
87120

88121
@Override
@@ -104,6 +137,8 @@ public CompletionStage<Optional<Policy>> put(final Policy policy, final Option<?
104137
response -> response.getEntity(response.getImplementedSchemaVersion())
105138
.map(JsonValue::asObject)
106139
.map(PoliciesModelFactory::newPolicy)
140+
.map(policyFromResponse -> appendRevisionFromHeadersIfNeeded(policyFromResponse,
141+
response.getDittoHeaders()))
107142
);
108143
}
109144

@@ -143,7 +178,10 @@ public CompletionStage<Void> delete(final PolicyId policyId, final Option<?>...
143178
@Override
144179
public CompletionStage<Policy> retrieve(PolicyId policyId) {
145180
final RetrievePolicy command = outgoingMessageFactory.retrievePolicy(policyId);
146-
return askPolicyCommand(command, RetrievePolicyResponse.class, RetrievePolicyResponse::getPolicy);
181+
return askPolicyCommand(command, RetrievePolicyResponse.class, response -> {
182+
final Policy policyFromResponse = response.getPolicy();
183+
return appendRevisionFromHeadersIfNeeded(policyFromResponse, response.getDittoHeaders());
184+
});
147185
}
148186

149187
private static void assertThatPolicyHasId(final Policy policy) {

0 commit comments

Comments
 (0)