Skip to content

Commit 3f8114f

Browse files
authored
Merge pull request #2121 from beyonnex-io/feature/provide-entity-revision-header
#2055: provide entity-revision header for all command responses and all events
2 parents 602abb4 + edf95c2 commit 3f8114f

File tree

113 files changed

+673
-317
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

113 files changed

+673
-317
lines changed

.run/ConnectivityService.run.xml

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
<component name="ProjectRunConfigurationManager">
22
<configuration default="false" name="ConnectivityService" type="Application" factoryName="Application" folderName="Ditto" nameIsGenerated="true">
33
<envs>
4-
<env name="LOG_LEVEL_APPLICATION" value="INFO" />
54
<env name="CLEANUP_HISTORY_RETENTION_DURATION" value="6d" />
65
<env name="CONNECTION_EVENT_HISTORICAL_HEADERS_TO_PERSIST.0" value="ditto-originator" />
6+
<env name="DITTO_TRACING_ENABLED" value="true" />
7+
<env name="LOG_LEVEL_APPLICATION" value="INFO" />
8+
<env name="DITTO_TRACING_SAMPLER" value="always" />
79
</envs>
810
<option name="MAIN_CLASS_NAME" value="org.eclipse.ditto.connectivity.service.ConnectivityService" />
911
<module name="ditto-connectivity-service" />

.run/GatewayService.run.xml

+2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
<component name="ProjectRunConfigurationManager">
22
<configuration default="false" name="GatewayService" type="Application" factoryName="Application" folderName="Ditto">
33
<envs>
4+
<env name="DITTO_TRACING_ENABLED" value="true" />
45
<env name="LOG_LEVEL_APPLICATION" value="INFO" />
6+
<env name="DITTO_TRACING_SAMPLER" value="always" />
57
</envs>
68
<option name="MAIN_CLASS_NAME" value="org.eclipse.ditto.gateway.service.starter.GatewayService" />
79
<module name="ditto-gateway-service" />

.run/PoliciesService.run.xml

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
<component name="ProjectRunConfigurationManager">
22
<configuration default="false" name="PoliciesService" type="Application" factoryName="Application" folderName="Ditto" nameIsGenerated="true">
33
<envs>
4-
<env name="LOG_LEVEL_APPLICATION" value="INFO" />
54
<env name="CLEANUP_HISTORY_RETENTION_DURATION" value="5d" />
5+
<env name="DITTO_TRACING_ENABLED" value="true" />
6+
<env name="LOG_LEVEL_APPLICATION" value="INFO" />
67
<env name="POLICY_EVENT_HISTORICAL_HEADERS_TO_PERSIST.0" value="ditto-originator" />
78
<env name="POLICY_EVENT_HISTORICAL_HEADERS_TO_PERSIST.1" value="correlation-id" />
9+
<env name="DITTO_TRACING_SAMPLER" value="always" />
810
</envs>
911
<option name="MAIN_CLASS_NAME" value="org.eclipse.ditto.policies.service.starter.PoliciesService" />
1012
<module name="ditto-policies-service" />

.run/SearchService.run.xml

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
<component name="ProjectRunConfigurationManager">
22
<configuration default="false" name="SearchService" type="Application" factoryName="Application" folderName="Ditto" nameIsGenerated="true">
33
<envs>
4-
<env name="LOG_LEVEL_APPLICATION" value="INFO" />
54
<env name="ACTIVITY_CHECK_INTERVAL" value="1h" />
65
<env name="BACKGROUND_SYNC_QUIET_PERIOD" value="1h" />
6+
<env name="DITTO_TRACING_ENABLED" value="true" />
7+
<env name="LOG_LEVEL_APPLICATION" value="INFO" />
8+
<env name="THINGS_SEARCH_UPDATER_STREAM_PERSISTENCE_MAX_BULK_SIZE" value="8" />
79
<env name="THINGS_SEARCH_UPDATER_STREAM_PERSISTENCE_PARALLELISM" value="4" />
810
<env name="THINGS_SEARCH_UPDATER_STREAM_WRITE_INTERVAL" value="1s" />
9-
<env name="THINGS_SEARCH_UPDATER_STREAM_PERSISTENCE_MAX_BULK_SIZE" value="8" />
11+
<env name="DITTO_TRACING_SAMPLER" value="always" />
1012
</envs>
1113
<option name="MAIN_CLASS_NAME" value="org.eclipse.ditto.thingsearch.service.starter.SearchService" />
1214
<module name="ditto-thingsearch-service" />

.run/ThingsService.run.xml

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
<component name="ProjectRunConfigurationManager">
22
<configuration default="false" name="ThingsService" type="Application" factoryName="Application" folderName="Ditto" nameIsGenerated="true">
33
<envs>
4-
<env name="LOG_LEVEL_APPLICATION" value="INFO" />
54
<env name="CLEANUP_HISTORY_RETENTION_DURATION" value="24h" />
5+
<env name="DITTO_TRACING_ENABLED" value="true" />
6+
<env name="LOG_LEVEL_APPLICATION" value="INFO" />
7+
<env name="DITTO_TRACING_SAMPLER" value="always" />
68
</envs>
79
<option name="MAIN_CLASS_NAME" value="org.eclipse.ditto.things.service.starter.ThingsService" />
810
<module name="ditto-things-service" />

base/model/src/main/java/org/eclipse/ditto/base/model/headers/DittoHeaderDefinition.java

+11
Original file line numberDiff line numberDiff line change
@@ -529,6 +529,17 @@ public enum DittoHeaderDefinition implements HeaderDefinition {
529529
true,
530530
HeaderValueValidators.getJsonObjectValidator()),
531531

532+
/**
533+
* Header containing the current revision of the entity (e.g. thing/policy) which was e.g. modified or fetched.
534+
*
535+
* @since 3.7.0
536+
*/
537+
ENTITY_REVISION("entity-revision",
538+
Long.class,
539+
false,
540+
true,
541+
HeaderValueValidators.getLongValidator()),
542+
532543
/**
533544
* Internal header containing the pre-defined configured {@code extraFields} as list of jsonPointers for the
534545
* emitted thing event.

base/model/src/main/java/org/eclipse/ditto/base/model/signals/events/AbstractEventsourcedEvent.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import org.eclipse.ditto.base.model.entity.id.EntityId;
2525
import org.eclipse.ditto.base.model.entity.metadata.Metadata;
26+
import org.eclipse.ditto.base.model.headers.DittoHeaderDefinition;
2627
import org.eclipse.ditto.base.model.headers.DittoHeaders;
2728
import org.eclipse.ditto.base.model.json.JsonSchemaVersion;
2829
import org.eclipse.ditto.json.JsonFactory;
@@ -65,7 +66,12 @@ protected AbstractEventsourcedEvent(final String type,
6566
final long revision,
6667
final JsonFieldDefinition<String> entityIdFieldDefinition) {
6768

68-
super(type, timestamp, dittoHeaders, metadata);
69+
super(type, timestamp,
70+
dittoHeaders.toBuilder()
71+
.putHeader(DittoHeaderDefinition.ENTITY_REVISION.getKey(), String.valueOf(revision))
72+
.build(),
73+
metadata
74+
);
6975
this.entityId = checkNotNull(entityId, "entityId");
7076
this.revision = revision;
7177
this.entityIdFieldDefinition = entityIdFieldDefinition;

base/model/src/test/java/org/eclipse/ditto/base/model/headers/ImmutableDittoHeadersTest.java

+5
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ public final class ImmutableDittoHeadersTest {
137137
.set(DittoHeaderDefinition.ORIGINATOR.getKey(), "foo:bar")
138138
.build();
139139

140+
private static final Long KNOWN_ENTITY_REVISION = 42L;
141+
140142
private static final JsonArray KNOWN_PRE_DEFINED_EXTRA_FIELDS = JsonArray.newBuilder()
141143
.add("foo:bar:123")
142144
.build();
@@ -215,6 +217,7 @@ public void settingAllKnownHeadersWorksAsExpected() {
215217
.putHeader(DittoHeaderDefinition.AT_HISTORICAL_REVISION.getKey(), String.valueOf(KNOWN_AT_HISTORICAL_REVISION))
216218
.putHeader(DittoHeaderDefinition.AT_HISTORICAL_TIMESTAMP.getKey(), String.valueOf(KNOWN_AT_HISTORICAL_TIMESTAMP))
217219
.putHeader(DittoHeaderDefinition.HISTORICAL_HEADERS.getKey(), KNOWN_HISTORICAL_HEADERS.formatAsString())
220+
.putHeader(DittoHeaderDefinition.ENTITY_REVISION.getKey(), String.valueOf(KNOWN_ENTITY_REVISION))
218221
.putHeader(DittoHeaderDefinition.PRE_DEFINED_EXTRA_FIELDS.getKey(),
219222
KNOWN_PRE_DEFINED_EXTRA_FIELDS.formatAsString())
220223
.putHeader(DittoHeaderDefinition.PRE_DEFINED_EXTRA_FIELDS_READ_GRANT_OBJECT.getKey(),
@@ -551,6 +554,7 @@ public void toJsonReturnsExpected() {
551554
.set(DittoHeaderDefinition.AT_HISTORICAL_REVISION.getKey(), KNOWN_AT_HISTORICAL_REVISION)
552555
.set(DittoHeaderDefinition.AT_HISTORICAL_TIMESTAMP.getKey(), KNOWN_AT_HISTORICAL_TIMESTAMP.toString())
553556
.set(DittoHeaderDefinition.HISTORICAL_HEADERS.getKey(), KNOWN_HISTORICAL_HEADERS)
557+
.set(DittoHeaderDefinition.ENTITY_REVISION.getKey(), KNOWN_ENTITY_REVISION)
554558
.set(DittoHeaderDefinition.PRE_DEFINED_EXTRA_FIELDS.getKey(), KNOWN_PRE_DEFINED_EXTRA_FIELDS)
555559
.set(DittoHeaderDefinition.PRE_DEFINED_EXTRA_FIELDS_READ_GRANT_OBJECT.getKey(),
556560
KNOWN_PRE_DEFINED_EXTRA_FIELDS_READ_GRANT_OBJECT)
@@ -795,6 +799,7 @@ private static Map<String, String> createMapContainingAllKnownHeaders() {
795799
result.put(DittoHeaderDefinition.AT_HISTORICAL_REVISION.getKey(), String.valueOf(KNOWN_AT_HISTORICAL_REVISION));
796800
result.put(DittoHeaderDefinition.AT_HISTORICAL_TIMESTAMP.getKey(), String.valueOf(KNOWN_AT_HISTORICAL_TIMESTAMP));
797801
result.put(DittoHeaderDefinition.HISTORICAL_HEADERS.getKey(), KNOWN_HISTORICAL_HEADERS.formatAsString());
802+
result.put(DittoHeaderDefinition.ENTITY_REVISION.getKey(), String.valueOf(KNOWN_ENTITY_REVISION));
798803
result.put(DittoHeaderDefinition.PRE_DEFINED_EXTRA_FIELDS.getKey(),
799804
KNOWN_PRE_DEFINED_EXTRA_FIELDS.formatAsString());
800805
result.put(DittoHeaderDefinition.PRE_DEFINED_EXTRA_FIELDS_READ_GRANT_OBJECT.getKey(),

connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/persistence/strategies/commands/AbstractEphemeralStrategy.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@
2222
import org.eclipse.ditto.base.model.headers.DittoHeaders;
2323
import org.eclipse.ditto.base.model.headers.WithDittoHeaders;
2424
import org.eclipse.ditto.connectivity.model.Connection;
25+
import org.eclipse.ditto.connectivity.model.signals.commands.ConnectivityCommand;
26+
import org.eclipse.ditto.connectivity.model.signals.events.ConnectivityEvent;
2527
import org.eclipse.ditto.connectivity.service.messaging.persistence.stages.ConnectionAction;
2628
import org.eclipse.ditto.connectivity.service.messaging.persistence.stages.ConnectionState;
2729
import org.eclipse.ditto.connectivity.service.messaging.persistence.stages.StagedCommand;
2830
import org.eclipse.ditto.internal.utils.persistentactors.results.Result;
29-
import org.eclipse.ditto.connectivity.model.signals.commands.ConnectivityCommand;
30-
import org.eclipse.ditto.connectivity.model.signals.events.ConnectivityEvent;
3131

3232
/**
3333
* Abstract base class for ephemeral strategies not affecting the persistence.
@@ -53,7 +53,8 @@ protected Result<ConnectivityEvent<?>> doApply(final Context<ConnectionState> co
5353
final C command,
5454
@Nullable final Metadata metadata) {
5555

56-
final WithDittoHeaders response = getResponse(context.getState(), command.getDittoHeaders());
56+
final WithDittoHeaders response = getResponse(context.getState(),
57+
createCommandResponseDittoHeaders(command.getDittoHeaders(), nextRevision));
5758
final List<ConnectionAction> actions = getActions();
5859
return newMutationResult(StagedCommand.of(command, null, response, actions), null, response);
5960
}

connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/persistence/strategies/commands/CloseConnectionStrategy.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ protected Result<ConnectivityEvent<?>> doApply(final Context<ConnectionState> co
5252
final ConnectivityEvent<?> event = ConnectionClosed.of(context.getState().id(), nextRevision,
5353
getEventTimestamp(), command.getDittoHeaders(), metadata);
5454
final WithDittoHeaders response =
55-
CloseConnectionResponse.of(context.getState().id(), command.getDittoHeaders());
55+
CloseConnectionResponse.of(context.getState().id(),
56+
createCommandResponseDittoHeaders(command.getDittoHeaders(), nextRevision));
5657
final List<ConnectionAction> actions =
5758
Arrays.asList(ConnectionAction.PERSIST_AND_APPLY_EVENT, ConnectionAction.UPDATE_SUBSCRIPTIONS, ConnectionAction.CLOSE_CONNECTION, ConnectionAction.STOP_CLIENT_ACTORS,
5859
ConnectionAction.SEND_RESPONSE);

connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/persistence/strategies/commands/CreateConnectionStrategy.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
import org.eclipse.ditto.base.model.entity.metadata.Metadata;
3333
import org.eclipse.ditto.base.model.exceptions.DittoRuntimeException;
34+
import org.eclipse.ditto.base.model.headers.DittoHeaders;
3435
import org.eclipse.ditto.base.model.headers.WithDittoHeaders;
3536
import org.eclipse.ditto.base.model.headers.entitytag.EntityTag;
3637
import org.eclipse.ditto.connectivity.model.Connection;
@@ -81,11 +82,11 @@ protected Result<ConnectivityEvent<?>> doApply(final Context<ConnectionState> co
8182
.created(timestamp)
8283
.modified(timestamp)
8384
.build();
85+
final DittoHeaders dittoHeaders = command.getDittoHeaders();
8486
final ConnectivityEvent<?> event =
85-
ConnectionCreated.of(connection, nextRevision, getEventTimestamp(), command.getDittoHeaders(),
86-
metadata);
87+
ConnectionCreated.of(connection, nextRevision, getEventTimestamp(), dittoHeaders, metadata);
8788
final WithDittoHeaders response =
88-
CreateConnectionResponse.of(connection, command.getDittoHeaders());
89+
CreateConnectionResponse.of(connection, createCommandResponseDittoHeaders(dittoHeaders, nextRevision));
8990
final Optional<DittoRuntimeException> validationError = validate(context, command);
9091
if (validationError.isPresent()) {
9192
return newErrorResult(validationError.get(), command);

connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/persistence/strategies/commands/DeleteConnectionStrategy.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import javax.annotation.Nullable;
2222

2323
import org.eclipse.ditto.base.model.entity.metadata.Metadata;
24+
import org.eclipse.ditto.base.model.headers.DittoHeaders;
2425
import org.eclipse.ditto.base.model.headers.WithDittoHeaders;
2526
import org.eclipse.ditto.base.model.headers.entitytag.EntityTag;
2627
import org.eclipse.ditto.connectivity.model.Connection;
@@ -50,10 +51,12 @@ protected Result<ConnectivityEvent<?>> doApply(final Context<ConnectionState> co
5051
final DeleteConnection command,
5152
@Nullable final Metadata metadata) {
5253

54+
final DittoHeaders dittoHeaders = command.getDittoHeaders();
5355
final ConnectivityEvent<?> event = ConnectionDeleted.of(context.getState().id(), nextRevision,
54-
getEventTimestamp(), command.getDittoHeaders(), metadata);
56+
getEventTimestamp(), dittoHeaders, metadata);
5557
final WithDittoHeaders response =
56-
DeleteConnectionResponse.of(context.getState().id(), command.getDittoHeaders());
58+
DeleteConnectionResponse.of(context.getState().id(),
59+
createCommandResponseDittoHeaders(dittoHeaders, nextRevision));
5760
// Not closing the connection asynchronously; rely on client actors to cleanup all resources when stopped.
5861
final List<ConnectionAction> actions =
5962
Arrays.asList(ConnectionAction.PERSIST_AND_APPLY_EVENT, ConnectionAction.UPDATE_SUBSCRIPTIONS,

connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/persistence/strategies/commands/ModifyConnectionStrategy.java

+7-5
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import org.eclipse.ditto.base.model.entity.metadata.Metadata;
2727
import org.eclipse.ditto.base.model.exceptions.DittoRuntimeException;
28+
import org.eclipse.ditto.base.model.headers.DittoHeaders;
2829
import org.eclipse.ditto.base.model.headers.WithDittoHeaders;
2930
import org.eclipse.ditto.base.model.headers.entitytag.EntityTag;
3031
import org.eclipse.ditto.connectivity.model.Connection;
@@ -61,22 +62,23 @@ protected Result<ConnectivityEvent<?>> doApply(final Context<ConnectionState> co
6162
.revision(nextRevision)
6263
.modified(eventTs)
6364
.build();
64-
if (entity != null && entity.getConnectionType() != connection.getConnectionType() &&
65-
!command.getDittoHeaders().isSudo()) {
65+
final DittoHeaders dittoHeaders = command.getDittoHeaders();
66+
if (entity != null && entity.getConnectionType() != connection.getConnectionType() && !dittoHeaders.isSudo()) {
6667
return ResultFactory.newErrorResult(
6768
ConnectionConfigurationInvalidException
6869
.newBuilder("ConnectionType <" + connection.getConnectionType().getName() +
6970
"> of existing connection <" + context.getState().id() + "> cannot be changed!")
70-
.dittoHeaders(command.getDittoHeaders())
71+
.dittoHeaders(dittoHeaders)
7172
.build(),
7273
command
7374
);
7475
}
7576
final ConnectivityEvent<?> event =
76-
ConnectionModified.of(connection, nextRevision, getEventTimestamp(), command.getDittoHeaders(),
77+
ConnectionModified.of(connection, nextRevision, getEventTimestamp(), dittoHeaders,
7778
metadata);
7879
final WithDittoHeaders response =
79-
ModifyConnectionResponse.of(context.getState().id(), command.getDittoHeaders());
80+
ModifyConnectionResponse.of(context.getState().id(),
81+
createCommandResponseDittoHeaders(dittoHeaders, nextRevision));
8082
final boolean isCurrentConnectionOpen = Optional.ofNullable(entity)
8183
.map(c -> c.getConnectionStatus() == ConnectivityStatus.OPEN)
8284
.orElse(false);

connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/persistence/strategies/commands/OpenConnectionStrategy.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
import org.eclipse.ditto.base.model.entity.metadata.Metadata;
3030
import org.eclipse.ditto.base.model.exceptions.DittoRuntimeException;
31+
import org.eclipse.ditto.base.model.headers.DittoHeaders;
3132
import org.eclipse.ditto.base.model.headers.WithDittoHeaders;
3233
import org.eclipse.ditto.base.model.headers.entitytag.EntityTag;
3334
import org.eclipse.ditto.connectivity.model.Connection;
@@ -60,10 +61,12 @@ protected Result<ConnectivityEvent<?>> doApply(final Context<ConnectionState> co
6061
if (validationError.isPresent()) {
6162
return newErrorResult(validationError.get(), command);
6263
} else {
64+
final DittoHeaders dittoHeaders = command.getDittoHeaders();
6365
final ConnectivityEvent<?> event = ConnectionOpened.of(context.getState().id(), nextRevision,
64-
getEventTimestamp(), command.getDittoHeaders(), metadata);
66+
getEventTimestamp(), dittoHeaders, metadata);
6567
final WithDittoHeaders response =
66-
OpenConnectionResponse.of(context.getState().id(), command.getDittoHeaders());
68+
OpenConnectionResponse.of(context.getState().id(),
69+
createCommandResponseDittoHeaders(dittoHeaders, nextRevision));
6770
final List<ConnectionAction> actions =
6871
Arrays.asList(ENABLE_LOGGING, PERSIST_AND_APPLY_EVENT, OPEN_CONNECTION, UPDATE_SUBSCRIPTIONS,
6972
SEND_RESPONSE);

connectivity/service/src/main/java/org/eclipse/ditto/connectivity/service/messaging/persistence/strategies/commands/RetrieveConnectionStrategy.java

+8-5
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import javax.annotation.Nullable;
1818

1919
import org.eclipse.ditto.base.model.entity.metadata.Metadata;
20+
import org.eclipse.ditto.base.model.headers.DittoHeaders;
2021
import org.eclipse.ditto.base.model.headers.DittoHeadersSettable;
2122
import org.eclipse.ditto.base.model.headers.entitytag.EntityTag;
2223
import org.eclipse.ditto.connectivity.model.Connection;
@@ -48,7 +49,8 @@ protected Result<ConnectivityEvent<?>> doApply(final Context<ConnectionState> co
4849

4950
if (entity != null) {
5051
return ResultFactory.newQueryResult(command,
51-
appendETagHeaderIfProvided(command, getRetrieveConnectionResponse(entity, command), entity)
52+
appendETagHeaderIfProvided(command, getRetrieveConnectionResponse(entity, command, nextRevision),
53+
entity)
5254
);
5355
} else {
5456
return ResultFactory.newErrorResult(notAccessible(context, command), command);
@@ -66,14 +68,15 @@ public Optional<EntityTag> nextEntityTag(final RetrieveConnection command, @Null
6668
return Optional.ofNullable(newEntity).flatMap(EntityTag::fromEntity);
6769
}
6870

69-
private static DittoHeadersSettable<?> getRetrieveConnectionResponse(@Nullable final Connection connection,
70-
final ConnectivityQueryCommand<RetrieveConnection> command) {
71+
private DittoHeadersSettable<?> getRetrieveConnectionResponse(@Nullable final Connection connection,
72+
final ConnectivityQueryCommand<RetrieveConnection> command, final long nextRevision) {
73+
final DittoHeaders dittoHeaders = command.getDittoHeaders();
7174
if (connection != null) {
7275
return RetrieveConnectionResponse.of(getConnectionJson(connection, command),
73-
command.getDittoHeaders());
76+
createCommandResponseDittoHeaders(dittoHeaders, nextRevision-1));
7477
} else {
7578
return ConnectionNotAccessibleException.newBuilder(((RetrieveConnection) command).getEntityId())
76-
.dittoHeaders(command.getDittoHeaders())
79+
.dittoHeaders(dittoHeaders)
7780
.build();
7881
}
7982
}

0 commit comments

Comments
 (0)