From 1c6308dcda4936139c74cfe2908df19067abb7b7 Mon Sep 17 00:00:00 2001 From: salaboy Date: Wed, 1 Oct 2025 13:04:05 +0200 Subject: [PATCH 01/10] adding new method signature plus test Signed-off-by: salaboy --- .../io/dapr/client/AbstractDaprClient.java | 24 +++++++++++++++---- .../main/java/io/dapr/client/DaprClient.java | 15 ++++++++++++ .../io/dapr/client/DaprClientGrpcTest.java | 21 ++++++++++++++++ 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java b/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java index 203f3f00a2..26bf83881c 100644 --- a/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java +++ b/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java @@ -48,11 +48,7 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; /** @@ -509,6 +505,24 @@ public Mono saveState(String storeName, String key, String etag, Object va return this.saveBulkState(storeName, Collections.singletonList(state)); } + /** + * {@inheritDoc} + */ + @Override + public Mono saveState(String storeName, String key, String etag, Object value, Map meta, + StateOptions options) { + if (meta == null) { + meta = new HashMap<>(); + } + + if( value != null){ + meta.put("contentType", stateSerializer.getContentType()); + } + + State state = new State<>(key, value, etag, meta, options); + return this.saveBulkState(storeName, Collections.singletonList(state)); + } + /** * {@inheritDoc} */ diff --git a/sdk/src/main/java/io/dapr/client/DaprClient.java b/sdk/src/main/java/io/dapr/client/DaprClient.java index f51a6d0ffb..6ac6086e76 100644 --- a/sdk/src/main/java/io/dapr/client/DaprClient.java +++ b/sdk/src/main/java/io/dapr/client/DaprClient.java @@ -498,6 +498,21 @@ Mono executeStateTransaction(String storeName, */ Mono saveState(String storeName, String key, String etag, Object value, StateOptions options); + + /** + * Save/Update a state. + * + * @param storeName The name of the state store. + * @param key The key of the state. + * @param etag The etag to be used. + * @param value The value of the state. + * @param meta The metadata to be set to the state. + * @param options The Options to use for each state. + * @return a Mono plan of type Void. + */ + Mono saveState(String storeName, String key, String etag, Object value, Map meta, + StateOptions options); + /** * Delete a state. * diff --git a/sdk/src/test/java/io/dapr/client/DaprClientGrpcTest.java b/sdk/src/test/java/io/dapr/client/DaprClientGrpcTest.java index 54240d70ca..818ff2257c 100644 --- a/sdk/src/test/java/io/dapr/client/DaprClientGrpcTest.java +++ b/sdk/src/test/java/io/dapr/client/DaprClientGrpcTest.java @@ -1241,6 +1241,27 @@ public void saveStateNoOptionsTest() { result.block(); } + @Test + public void saveStateWithMetaTest() { + String key = "key1"; + String etag = "ETag1"; + String value = "State value"; + Map metadata = new HashMap<>(); + metadata.put("custom", "customValue"); + ArgumentCaptor argument = ArgumentCaptor.forClass(DaprProtos.SaveStateRequest.class); + doAnswer((Answer) invocation -> { + StreamObserver observer = (StreamObserver) invocation.getArguments()[1]; + observer.onNext(Empty.getDefaultInstance()); + observer.onCompleted(); + return null; + }).when(daprStub).saveState(argument.capture(), any()); + + + Mono result = client.saveState(STATE_STORE_NAME, key, etag, value, metadata,null); + result.block(); + assertEquals("customValue", argument.getValue().getStates(0).getMetadata().get("custom")); + } + @Test public void saveStateTest() { String key = "key1"; From 906173c2acf52994573dd6caeaacbce2c251b236 Mon Sep 17 00:00:00 2001 From: salaboy Date: Wed, 1 Oct 2025 16:57:06 +0200 Subject: [PATCH 02/10] re adding imports Signed-off-by: salaboy --- sdk/src/main/java/io/dapr/client/AbstractDaprClient.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java b/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java index 26bf83881c..7a8859c40f 100644 --- a/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java +++ b/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java @@ -48,7 +48,12 @@ import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.HashMap; import java.util.stream.Collectors; /** From 0837a37c88a643294381567f2325924ae3c09bc1 Mon Sep 17 00:00:00 2001 From: salaboy Date: Wed, 1 Oct 2025 17:34:06 +0200 Subject: [PATCH 03/10] fixing style Signed-off-by: salaboy --- sdk/src/main/java/io/dapr/client/AbstractDaprClient.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java b/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java index 7a8859c40f..d13c463cb6 100644 --- a/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java +++ b/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java @@ -51,9 +51,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.HashMap; import java.util.stream.Collectors; /** @@ -520,7 +520,7 @@ public Mono saveState(String storeName, String key, String etag, Object va meta = new HashMap<>(); } - if( value != null){ + if (value != null) { meta.put("contentType", stateSerializer.getContentType()); } From 97ae3218d0c6a802df85584b451467de0cfa0c3d Mon Sep 17 00:00:00 2001 From: salaboy Date: Thu, 2 Oct 2025 09:24:40 +0200 Subject: [PATCH 04/10] checking empty metadata Signed-off-by: salaboy --- .../io/dapr/client/DaprClientGrpcTest.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/sdk/src/test/java/io/dapr/client/DaprClientGrpcTest.java b/sdk/src/test/java/io/dapr/client/DaprClientGrpcTest.java index 818ff2257c..7ac6ab3cf5 100644 --- a/sdk/src/test/java/io/dapr/client/DaprClientGrpcTest.java +++ b/sdk/src/test/java/io/dapr/client/DaprClientGrpcTest.java @@ -1262,6 +1262,43 @@ public void saveStateWithMetaTest() { assertEquals("customValue", argument.getValue().getStates(0).getMetadata().get("custom")); } + @Test + public void saveStateWithMetaContentTypeTest() { + String key = "key1"; + String etag = "ETag1"; + String value = "State value"; + Map metadata = new HashMap<>(); + ArgumentCaptor argument = ArgumentCaptor.forClass(DaprProtos.SaveStateRequest.class); + doAnswer((Answer) invocation -> { + StreamObserver observer = (StreamObserver) invocation.getArguments()[1]; + observer.onNext(Empty.getDefaultInstance()); + observer.onCompleted(); + return null; + }).when(daprStub).saveState(argument.capture(), any()); + + + Mono result = client.saveState(STATE_STORE_NAME, key, etag, value, metadata,null); + result.block(); + assertEquals("application/json", argument.getValue().getStates(0).getMetadata().get("contentType")); + } + + @Test + public void saveStateWithMetaEmptyTest() { + String key = "key1"; + String etag = "ETag1"; + ArgumentCaptor argument = ArgumentCaptor.forClass(DaprProtos.SaveStateRequest.class); + doAnswer((Answer) invocation -> { + StreamObserver observer = (StreamObserver) invocation.getArguments()[1]; + observer.onNext(Empty.getDefaultInstance()); + observer.onCompleted(); + return null; + }).when(daprStub).saveState(argument.capture(), any()); + + Mono result = client.saveState(STATE_STORE_NAME, key, etag, null, null,null); + result.block(); + assertTrue(argument.getValue().getStates(0).getMetadata().keySet().isEmpty()); + } + @Test public void saveStateTest() { String key = "key1"; From 80125ad122f6320e82bf1fad55d86771f9f32442 Mon Sep 17 00:00:00 2001 From: salaboy Date: Fri, 24 Oct 2025 10:30:54 +0100 Subject: [PATCH 05/10] copy meta for safety and check if key is present Signed-off-by: salaboy --- sdk/src/main/java/io/dapr/client/AbstractDaprClient.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java b/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java index d13c463cb6..eedaa57cb1 100644 --- a/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java +++ b/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java @@ -516,12 +516,15 @@ public Mono saveState(String storeName, String key, String etag, Object va @Override public Mono saveState(String storeName, String key, String etag, Object value, Map meta, StateOptions options) { + Map metaCopy = null; if (meta == null) { - meta = new HashMap<>(); + metaCopy = new HashMap<>(); + } else{ + metaCopy = new HashMap<>(meta); } if (value != null) { - meta.put("contentType", stateSerializer.getContentType()); + metaCopy.putIfAbsent("contentType", stateSerializer.getContentType()); } State state = new State<>(key, value, etag, meta, options); From b842835ed384045e2fbe2ce88bf86e135c73bfc2 Mon Sep 17 00:00:00 2001 From: artur-ciocanu Date: Thu, 2 Oct 2025 19:45:16 +0300 Subject: [PATCH 06/10] Centralize Maven dependency version management (#1564) Signed-off-by: salaboy --- sdk/pom.xml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/sdk/pom.xml b/sdk/pom.xml index f77de232dd..67c352f0c7 100644 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -20,6 +20,7 @@ --add-opens java.base/java.util=ALL-UNNAMED + @@ -35,10 +36,12 @@ com.fasterxml.jackson.core jackson-databind + 2.15.1 io.projectreactor reactor-core + 3.5.0 org.mockito @@ -48,16 +51,19 @@ com.fasterxml.jackson.dataformat jackson-dataformat-xml + 2.15.1 test commons-cli commons-cli + 1.9.0 test com.github.stefanbirkner system-rules + 1.19.0 test @@ -73,16 +79,19 @@ org.springframework.boot spring-boot-starter-web + ${springboot.version} test org.springframework.boot spring-boot-autoconfigure + ${springboot.version} test uk.org.webcompere system-stubs-jupiter + 2.1.1 test @@ -93,6 +102,7 @@ commons-validator commons-validator + 1.7 test @@ -113,16 +123,18 @@ com.fasterxml.jackson.datatype jackson-datatype-jsr310 + ${jackson.version} test org.assertj assertj-core - test + ${assertj.version} io.grpc grpc-netty + ${grpc.version} From add4e963d51f4a075fc48a604d9aa831d9b475f4 Mon Sep 17 00:00:00 2001 From: artur-ciocanu Date: Tue, 21 Oct 2025 16:40:23 +0300 Subject: [PATCH 07/10] Fix dependencies multi app build and add proper test deps (#1572) * Force Jackson version to override the SB Jackson version Signed-off-by: Artur Ciocanu * Move all the Jackson deps to parent POM. Signed-off-by: Artur Ciocanu * Ensure app JAR build order Signed-off-by: Artur Ciocanu * Remove explicit Jackson from sdk-tests module. Signed-off-by: Artur Ciocanu * Make sure test is used for test dependencies. Signed-off-by: Artur Ciocanu * Remove extra Jackson modules. Signed-off-by: Artur Ciocanu --------- Signed-off-by: Artur Ciocanu Signed-off-by: salaboy --- sdk/pom.xml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/sdk/pom.xml b/sdk/pom.xml index 67c352f0c7..3a4fef35d2 100644 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -20,7 +20,6 @@ --add-opens java.base/java.util=ALL-UNNAMED - @@ -36,12 +35,10 @@ com.fasterxml.jackson.core jackson-databind - 2.15.1 io.projectreactor reactor-core - 3.5.0 org.mockito @@ -51,19 +48,16 @@ com.fasterxml.jackson.dataformat jackson-dataformat-xml - 2.15.1 test commons-cli commons-cli - 1.9.0 test com.github.stefanbirkner system-rules - 1.19.0 test @@ -79,19 +73,16 @@ org.springframework.boot spring-boot-starter-web - ${springboot.version} test org.springframework.boot spring-boot-autoconfigure - ${springboot.version} test uk.org.webcompere system-stubs-jupiter - 2.1.1 test @@ -102,7 +93,6 @@ commons-validator commons-validator - 1.7 test @@ -123,18 +113,15 @@ com.fasterxml.jackson.datatype jackson-datatype-jsr310 - ${jackson.version} test org.assertj assertj-core - ${assertj.version} io.grpc grpc-netty - ${grpc.version} From 29067fdbce1c55333d30f766d38f27096d236d3e Mon Sep 17 00:00:00 2001 From: salaboy Date: Fri, 24 Oct 2025 11:03:10 +0100 Subject: [PATCH 08/10] reverting pom Signed-off-by: salaboy --- sdk/pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/sdk/pom.xml b/sdk/pom.xml index 3a4fef35d2..f77de232dd 100644 --- a/sdk/pom.xml +++ b/sdk/pom.xml @@ -118,6 +118,7 @@ org.assertj assertj-core + test io.grpc From 0c71d0c71b8574655926d92af97784f6a149e4dc Mon Sep 17 00:00:00 2001 From: salaboy Date: Fri, 24 Oct 2025 11:12:24 +0100 Subject: [PATCH 09/10] fix codestyle Signed-off-by: salaboy --- sdk/src/main/java/io/dapr/client/AbstractDaprClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java b/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java index eedaa57cb1..7f18c7f06b 100644 --- a/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java +++ b/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java @@ -519,7 +519,7 @@ public Mono saveState(String storeName, String key, String etag, Object va Map metaCopy = null; if (meta == null) { metaCopy = new HashMap<>(); - } else{ + } else { metaCopy = new HashMap<>(meta); } From c7f2aeaabbb05951ce1c91f66c99d2add2220e1e Mon Sep 17 00:00:00 2001 From: salaboy Date: Fri, 24 Oct 2025 11:29:20 +0100 Subject: [PATCH 10/10] using metaCopy Signed-off-by: salaboy --- sdk/src/main/java/io/dapr/client/AbstractDaprClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java b/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java index 7f18c7f06b..c9c4bf8ca4 100644 --- a/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java +++ b/sdk/src/main/java/io/dapr/client/AbstractDaprClient.java @@ -527,7 +527,7 @@ public Mono saveState(String storeName, String key, String etag, Object va metaCopy.putIfAbsent("contentType", stateSerializer.getContentType()); } - State state = new State<>(key, value, etag, meta, options); + State state = new State<>(key, value, etag, metaCopy, options); return this.saveBulkState(storeName, Collections.singletonList(state)); }