20
20
21
21
import javax .annotation .Nonnull ;
22
22
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 ;
23
27
import org .eclipse .ditto .client .internal .AbstractHandle ;
24
28
import org .eclipse .ditto .client .internal .OutgoingMessageFactory ;
25
29
import org .eclipse .ditto .client .internal .bus .PointerBus ;
28
32
import org .eclipse .ditto .client .policies .Policies ;
29
33
import org .eclipse .ditto .json .JsonObject ;
30
34
import org .eclipse .ditto .json .JsonValue ;
31
- import org .eclipse .ditto .base .model .acks .AcknowledgementLabel ;
32
- import org .eclipse .ditto .base .model .acks .DittoAcknowledgementLabel ;
33
35
import org .eclipse .ditto .policies .model .PoliciesModelFactory ;
34
36
import org .eclipse .ditto .policies .model .Policy ;
35
37
import org .eclipse .ditto .policies .model .PolicyId ;
36
- import org .eclipse .ditto .protocol . TopicPath ;
38
+ import org .eclipse .ditto .policies . model . PolicyRevision ;
37
39
import org .eclipse .ditto .policies .model .signals .commands .modify .CreatePolicy ;
38
40
import org .eclipse .ditto .policies .model .signals .commands .modify .CreatePolicyResponse ;
39
41
import org .eclipse .ditto .policies .model .signals .commands .modify .DeletePolicy ;
42
44
import org .eclipse .ditto .policies .model .signals .commands .modify .PolicyModifyCommandResponse ;
43
45
import org .eclipse .ditto .policies .model .signals .commands .query .RetrievePolicy ;
44
46
import org .eclipse .ditto .policies .model .signals .commands .query .RetrievePolicyResponse ;
47
+ import org .eclipse .ditto .protocol .TopicPath ;
45
48
46
49
/**
47
50
* Default implementation for {@link Policies}.
@@ -75,14 +78,44 @@ public static PoliciesImpl newInstance(final MessagingProvider messagingProvider
75
78
return new PoliciesImpl (messagingProvider , outgoingMessageFactory , bus );
76
79
}
77
80
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
+
78
108
@ Override
79
109
public CompletionStage <Policy > create (final Policy policy , final Option <?>... options ) {
80
110
argumentNotNull (policy );
81
111
assertThatPolicyHasId (policy );
82
112
83
113
final CreatePolicy command = outgoingMessageFactory .createPolicy (policy , options );
84
114
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 ));
86
119
}
87
120
88
121
@ Override
@@ -104,6 +137,8 @@ public CompletionStage<Optional<Policy>> put(final Policy policy, final Option<?
104
137
response -> response .getEntity (response .getImplementedSchemaVersion ())
105
138
.map (JsonValue ::asObject )
106
139
.map (PoliciesModelFactory ::newPolicy )
140
+ .map (policyFromResponse -> appendRevisionFromHeadersIfNeeded (policyFromResponse ,
141
+ response .getDittoHeaders ()))
107
142
);
108
143
}
109
144
@@ -143,7 +178,10 @@ public CompletionStage<Void> delete(final PolicyId policyId, final Option<?>...
143
178
@ Override
144
179
public CompletionStage <Policy > retrieve (PolicyId policyId ) {
145
180
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
+ });
147
185
}
148
186
149
187
private static void assertThatPolicyHasId (final Policy policy ) {
0 commit comments