mirror of https://github.com/dapr/java-sdk.git
				
				
				
			Fix handling of metadata, headers. Removes etag from getState. (#440)
* Fix handling of metadata, headers. Removes etag from getState(). * Update CLI and runtime. * Fix ITs.
This commit is contained in:
		
							parent
							
								
									76d877c9c0
								
							
						
					
					
						commit
						019dee9a8b
					
				|  | @ -22,11 +22,11 @@ jobs: | ||||||
|       GOARCH: amd64 |       GOARCH: amd64 | ||||||
|       GOPROXY: https://proxy.golang.org |       GOPROXY: https://proxy.golang.org | ||||||
|       JDK_VER: 13.0.x |       JDK_VER: 13.0.x | ||||||
|       DAPR_CLI_VER: 1.0.0-rc.2 |       DAPR_CLI_VER: 1.0.0-rc.3 | ||||||
|       DAPR_RUNTIME_VER: 1.0.0-rc.1 |       DAPR_RUNTIME_VER: 1.0.0-rc.2 | ||||||
|       DAPR_INSTALL_URL: https://raw.githubusercontent.com/dapr/cli/3dacfb672d55f1436c249057aaebbe597e1066f3/install/install.sh |       DAPR_INSTALL_URL: https://raw.githubusercontent.com/dapr/cli/3dacfb672d55f1436c249057aaebbe597e1066f3/install/install.sh | ||||||
|       DAPR_CLI_REF: 3dacfb672d55f1436c249057aaebbe597e1066f3 |       DAPR_CLI_REF: | ||||||
|       DAPR_REF: 3cca3cc1567f1cb955ae69b8fd784f075f62ad42 |       DAPR_REF: 4678e477562e7e35a1d6ba04a9b17b6c9c00a025 | ||||||
|       OSSRH_USER_TOKEN: ${{ secrets.OSSRH_USER_TOKEN }} |       OSSRH_USER_TOKEN: ${{ secrets.OSSRH_USER_TOKEN }} | ||||||
|       OSSRH_PWD_TOKEN: ${{ secrets.OSSRH_PWD_TOKEN }} |       OSSRH_PWD_TOKEN: ${{ secrets.OSSRH_PWD_TOKEN }} | ||||||
|       GPG_KEY: ${{ secrets.GPG_KEY }} |       GPG_KEY: ${{ secrets.GPG_KEY }} | ||||||
|  |  | ||||||
|  | @ -9,18 +9,22 @@ import io.dapr.client.DaprClient; | ||||||
| import io.dapr.client.DaprClientBuilder; | import io.dapr.client.DaprClientBuilder; | ||||||
| import io.dapr.client.DaprHttp; | import io.dapr.client.DaprHttp; | ||||||
| import io.dapr.client.domain.HttpExtension; | import io.dapr.client.domain.HttpExtension; | ||||||
|  | import io.dapr.client.domain.Metadata; | ||||||
| import io.dapr.it.BaseIT; | import io.dapr.it.BaseIT; | ||||||
| import io.dapr.it.DaprRun; | import io.dapr.it.DaprRun; | ||||||
|  | import org.junit.After; | ||||||
| import org.junit.Test; | import org.junit.Test; | ||||||
| import org.junit.runner.RunWith; | import org.junit.runner.RunWith; | ||||||
| import org.junit.runners.Parameterized; | import org.junit.runners.Parameterized; | ||||||
| 
 | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
| import java.util.Arrays; | import java.util.Arrays; | ||||||
| import java.util.Collection; | import java.util.Collection; | ||||||
| import java.util.Collections; | import java.util.Collections; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| 
 | 
 | ||||||
| import static io.dapr.it.Retry.callWithRetry; | import static io.dapr.it.Retry.callWithRetry; | ||||||
|  | import static io.dapr.it.TestUtils.assertThrowsDaprException; | ||||||
| import static org.junit.Assert.assertEquals; | import static org.junit.Assert.assertEquals; | ||||||
| import static org.junit.Assert.assertTrue; | import static org.junit.Assert.assertTrue; | ||||||
| 
 | 
 | ||||||
|  | @ -34,6 +38,8 @@ public class PubSubIT extends BaseIT { | ||||||
|   //The title of the topic to be used for publishing |   //The title of the topic to be used for publishing | ||||||
|   private static final String TOPIC_NAME = "testingtopic"; |   private static final String TOPIC_NAME = "testingtopic"; | ||||||
|   private static final String ANOTHER_TOPIC_NAME = "anothertopic"; |   private static final String ANOTHER_TOPIC_NAME = "anothertopic"; | ||||||
|  |   // Topic used for TTL test | ||||||
|  |   private static final String TTL_TOPIC_NAME = "ttltopic"; | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|    * Parameters for this test. |    * Parameters for this test. | ||||||
|  | @ -49,16 +55,57 @@ public class PubSubIT extends BaseIT { | ||||||
|   @Parameterized.Parameter |   @Parameterized.Parameter | ||||||
|   public boolean useGrpc; |   public boolean useGrpc; | ||||||
| 
 | 
 | ||||||
|  |   private final List<DaprRun> runs = new ArrayList<>(); | ||||||
|  | 
 | ||||||
|  |   private DaprRun closeLater(DaprRun run) { | ||||||
|  |     this.runs.add(run); | ||||||
|  |     return run; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   @After | ||||||
|  |   public void tearDown() throws Exception { | ||||||
|  |     for (DaprRun run : runs) { | ||||||
|  |       run.stop(); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   @Test | ||||||
|  |   public void publishPubSubNotFound() throws Exception { | ||||||
|  |     DaprRun daprRun = closeLater(startDaprApp( | ||||||
|  |         this.getClass().getSimpleName(), | ||||||
|  |         60000)); | ||||||
|  |     if (this.useGrpc) { | ||||||
|  |       daprRun.switchToGRPC(); | ||||||
|  |     } else { | ||||||
|  |       daprRun.switchToHTTP(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     try (DaprClient client = new DaprClientBuilder().build()) { | ||||||
|  | 
 | ||||||
|  |       if (this.useGrpc) { | ||||||
|  |         assertThrowsDaprException( | ||||||
|  |             "INVALID_ARGUMENT", | ||||||
|  |             "INVALID_ARGUMENT: pubsub unknown pubsub not found", | ||||||
|  |             () -> client.publishEvent("unknown pubsub", "mytopic", "payload").block()); | ||||||
|  |       } else { | ||||||
|  |         assertThrowsDaprException( | ||||||
|  |             "ERR_PUBSUB_NOT_FOUND", | ||||||
|  |             "ERR_PUBSUB_NOT_FOUND: pubsub unknown pubsub not found", | ||||||
|  |             () -> client.publishEvent("unknown pubsub", "mytopic", "payload").block()); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   @Test |   @Test | ||||||
|   public void testPubSub() throws Exception { |   public void testPubSub() throws Exception { | ||||||
|     System.out.println("Working Directory = " + System.getProperty("user.dir")); |     System.out.println("Working Directory = " + System.getProperty("user.dir")); | ||||||
| 
 | 
 | ||||||
|     final DaprRun daprRun = startDaprApp( |     final DaprRun daprRun = closeLater(startDaprApp( | ||||||
|         this.getClass().getSimpleName(), |         this.getClass().getSimpleName(), | ||||||
|         SubscriberService.SUCCESS_MESSAGE, |         SubscriberService.SUCCESS_MESSAGE, | ||||||
|         SubscriberService.class, |         SubscriberService.class, | ||||||
|         true, |         true, | ||||||
|         60000); |         60000)); | ||||||
|     // At this point, it is guaranteed that the service above is running and all ports being listened to. |     // At this point, it is guaranteed that the service above is running and all ports being listened to. | ||||||
|     if (this.useGrpc) { |     if (this.useGrpc) { | ||||||
|       daprRun.switchToGRPC(); |       daprRun.switchToGRPC(); | ||||||
|  | @ -123,4 +170,62 @@ public class PubSubIT extends BaseIT { | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   @Test | ||||||
|  |   public void testPubSubTTLMetadata() throws Exception { | ||||||
|  |     System.out.println("Working Directory = " + System.getProperty("user.dir")); | ||||||
|  | 
 | ||||||
|  |     DaprRun daprRun = closeLater(startDaprApp( | ||||||
|  |         this.getClass().getSimpleName(), | ||||||
|  |         60000)); | ||||||
|  |     if (this.useGrpc) { | ||||||
|  |       daprRun.switchToGRPC(); | ||||||
|  |     } else { | ||||||
|  |       daprRun.switchToHTTP(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Send a batch of messages on one topic, all to be expired in 1 second. | ||||||
|  |     try (DaprClient client = new DaprClientBuilder().build()) { | ||||||
|  |       for (int i = 0; i < NUM_MESSAGES; i++) { | ||||||
|  |         String message = String.format("This is message #%d on topic %s", i, TTL_TOPIC_NAME); | ||||||
|  |         //Publishing messages | ||||||
|  |         client.publishEvent( | ||||||
|  |             PUBSUB_NAME, | ||||||
|  |             TTL_TOPIC_NAME, | ||||||
|  |             message, | ||||||
|  |             Collections.singletonMap(Metadata.TTL_IN_SECONDS, "1")).block(); | ||||||
|  |         System.out.println(String.format("Published message: '%s' to topic '%s' pubsub_name '%s'", message, TOPIC_NAME, PUBSUB_NAME)); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     daprRun.stop(); | ||||||
|  | 
 | ||||||
|  |     // Sleeps for two seconds to let them expire. | ||||||
|  |     Thread.sleep(2000); | ||||||
|  | 
 | ||||||
|  |     daprRun = closeLater(startDaprApp( | ||||||
|  |         this.getClass().getSimpleName(), | ||||||
|  |         SubscriberService.SUCCESS_MESSAGE, | ||||||
|  |         SubscriberService.class, | ||||||
|  |         true, | ||||||
|  |         60000)); | ||||||
|  |     if (this.useGrpc) { | ||||||
|  |       daprRun.switchToGRPC(); | ||||||
|  |     } else { | ||||||
|  |       daprRun.switchToHTTP(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // Sleeps for five seconds to give subscriber a chance to receive messages. | ||||||
|  |     Thread.sleep(5000); | ||||||
|  | 
 | ||||||
|  |     final String appId = daprRun.getAppName(); | ||||||
|  |     try (DaprClient client = new DaprClientBuilder().build()) { | ||||||
|  |       callWithRetry(() -> { | ||||||
|  |         System.out.println("Checking results for topic " + TTL_TOPIC_NAME); | ||||||
|  |         final List<String> messages = client.invokeMethod(appId, "messages/" + TTL_TOPIC_NAME, null, HttpExtension.GET, List.class).block(); | ||||||
|  |         assertEquals(0, messages.size()); | ||||||
|  |       }, 2000); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     daprRun.stop(); | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -23,6 +23,7 @@ public class SubscriberController { | ||||||
| 
 | 
 | ||||||
|   private static final List<Object> messagesReceivedTestingTopic = new ArrayList(); |   private static final List<Object> messagesReceivedTestingTopic = new ArrayList(); | ||||||
|   private static final List<Object> messagesReceivedAnotherTopic = new ArrayList(); |   private static final List<Object> messagesReceivedAnotherTopic = new ArrayList(); | ||||||
|  |   private static final List<Object> messagesReceivedTTLTopic = new ArrayList(); | ||||||
| 
 | 
 | ||||||
|   @GetMapping(path = "/messages/testingtopic") |   @GetMapping(path = "/messages/testingtopic") | ||||||
|   public List<Object> getMessagesReceivedTestingTopic() { |   public List<Object> getMessagesReceivedTestingTopic() { | ||||||
|  | @ -34,6 +35,11 @@ public class SubscriberController { | ||||||
|     return messagesReceivedAnotherTopic; |     return messagesReceivedAnotherTopic; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   @GetMapping(path = "/messages/ttltopic") | ||||||
|  |   public List<Object> getMessagesReceivedTTLTopic() { | ||||||
|  |     return messagesReceivedTTLTopic; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|   @Topic(name = "testingtopic", pubsubName = "messagebus") |   @Topic(name = "testingtopic", pubsubName = "messagebus") | ||||||
|   @PostMapping(path = "/route1") |   @PostMapping(path = "/route1") | ||||||
|   public Mono<Void> handleMessage(@RequestBody(required = false) CloudEvent envelope) { |   public Mono<Void> handleMessage(@RequestBody(required = false) CloudEvent envelope) { | ||||||
|  | @ -62,4 +68,18 @@ public class SubscriberController { | ||||||
|     }); |     }); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   @Topic(name = "ttltopic", pubsubName = "messagebus") | ||||||
|  |   @PostMapping(path = "/route3") | ||||||
|  |   public Mono<Void> handleMessageTTLTopic(@RequestBody(required = false) CloudEvent envelope) { | ||||||
|  |     return Mono.fromRunnable(() -> { | ||||||
|  |       try { | ||||||
|  |         String message = envelope.getData() == null ? "" : envelope.getData().toString(); | ||||||
|  |         System.out.println("TTL topic Subscriber got message: " + message); | ||||||
|  |         messagesReceivedTTLTopic.add(envelope.getData()); | ||||||
|  |       } catch (Exception e) { | ||||||
|  |         throw new RuntimeException(e); | ||||||
|  |       } | ||||||
|  |     }); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -79,14 +79,4 @@ public class GRPCStateClientIT extends AbstractStateClientIT { | ||||||
|             byte[].class).block()); |             byte[].class).block()); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   @Test |  | ||||||
|   public void publishPubSubNotFound() { |  | ||||||
|     DaprClient daprClient = buildDaprClient(); |  | ||||||
| 
 |  | ||||||
|     // DaprException is guaranteed in the Dapr SDK but getCause() is null in HTTP while present in GRPC implementation. |  | ||||||
|     assertThrowsDaprException( |  | ||||||
|         "NOT_FOUND", |  | ||||||
|         "NOT_FOUND: pubsub 'unknown pubsub' not found", |  | ||||||
|         () -> daprClient.publishEvent("unknown pubsub", "mytopic", "payload").block()); |  | ||||||
|   } |  | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -58,7 +58,7 @@ public class HttpStateClientIT extends AbstractStateClientIT { | ||||||
|     // DaprException is guaranteed in the Dapr SDK but getCause() is null in HTTP while present in GRPC implementation. |     // DaprException is guaranteed in the Dapr SDK but getCause() is null in HTTP while present in GRPC implementation. | ||||||
|     assertThrowsDaprException( |     assertThrowsDaprException( | ||||||
|         "ERR_STATE_STORE_NOT_FOUND", |         "ERR_STATE_STORE_NOT_FOUND", | ||||||
|         "ERR_STATE_STORE_NOT_FOUND: state store unknown%20state%20store is not found", |         "ERR_STATE_STORE_NOT_FOUND: state store unknown state store is not found", | ||||||
|         () -> daprClient.getState("unknown state store", new State(stateKey), byte[].class).block()); |         () -> daprClient.getState("unknown state store", new State(stateKey), byte[].class).block()); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  | @ -71,7 +71,7 @@ public class HttpStateClientIT extends AbstractStateClientIT { | ||||||
|     // DaprException is guaranteed in the Dapr SDK but getCause() is null in HTTP while present in GRPC implementation. |     // DaprException is guaranteed in the Dapr SDK but getCause() is null in HTTP while present in GRPC implementation. | ||||||
|     assertThrowsDaprException( |     assertThrowsDaprException( | ||||||
|         "ERR_STATE_STORE_NOT_FOUND", |         "ERR_STATE_STORE_NOT_FOUND", | ||||||
|         "ERR_STATE_STORE_NOT_FOUND: state store unknown%20state%20store is not found", |         "ERR_STATE_STORE_NOT_FOUND: state store unknown state store is not found", | ||||||
|         () -> daprClient.getBulkState( |         () -> daprClient.getBulkState( | ||||||
|             "unknown state store", |             "unknown state store", | ||||||
|             Collections.singletonList(stateKey), |             Collections.singletonList(stateKey), | ||||||
|  | @ -82,10 +82,6 @@ public class HttpStateClientIT extends AbstractStateClientIT { | ||||||
|   public void publishPubSubNotFound() { |   public void publishPubSubNotFound() { | ||||||
|     DaprClient daprClient = buildDaprClient(); |     DaprClient daprClient = buildDaprClient(); | ||||||
| 
 | 
 | ||||||
|     // DaprException is guaranteed in the Dapr SDK but getCause() is null in HTTP while present in GRPC implementation. | 
 | ||||||
|     assertThrowsDaprException( |  | ||||||
|         "ERR_PUBSUB_NOT_FOUND", |  | ||||||
|         "ERR_PUBSUB_NOT_FOUND: pubsub 'unknown%20pubsub' not found", |  | ||||||
|         () -> daprClient.publishEvent("unknown pubsub", "mytopic", "payload").block()); |  | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -100,7 +100,6 @@ abstract class AbstractDaprClient implements DaprClient { | ||||||
|     InvokeServiceRequest req = builder |     InvokeServiceRequest req = builder | ||||||
|         .withBody(data) |         .withBody(data) | ||||||
|         .withHttpExtension(httpExtension) |         .withHttpExtension(httpExtension) | ||||||
|         .withMetadata(metadata) |  | ||||||
|         .withContentType(objectSerializer.getContentType()) |         .withContentType(objectSerializer.getContentType()) | ||||||
|         .build(); |         .build(); | ||||||
| 
 | 
 | ||||||
|  | @ -252,7 +251,7 @@ abstract class AbstractDaprClient implements DaprClient { | ||||||
|    */ |    */ | ||||||
|   @Override |   @Override | ||||||
|   public <T> Mono<State<T>> getState(String storeName, State<T> state, TypeRef<T> type) { |   public <T> Mono<State<T>> getState(String storeName, State<T> state, TypeRef<T> type) { | ||||||
|     return this.getState(storeName, state.getKey(), state.getEtag(), state.getOptions(), type); |     return this.getState(storeName, state.getKey(), state.getOptions(), type); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|  | @ -260,7 +259,7 @@ abstract class AbstractDaprClient implements DaprClient { | ||||||
|    */ |    */ | ||||||
|   @Override |   @Override | ||||||
|   public <T> Mono<State<T>> getState(String storeName, State<T> state, Class<T> clazz) { |   public <T> Mono<State<T>> getState(String storeName, State<T> state, Class<T> clazz) { | ||||||
|     return this.getState(storeName, state.getKey(), state.getEtag(), state.getOptions(), TypeRef.get(clazz)); |     return this.getState(storeName, state.getKey(), state.getOptions(), TypeRef.get(clazz)); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|  | @ -268,7 +267,7 @@ abstract class AbstractDaprClient implements DaprClient { | ||||||
|    */ |    */ | ||||||
|   @Override |   @Override | ||||||
|   public <T> Mono<State<T>> getState(String storeName, String key, TypeRef<T> type) { |   public <T> Mono<State<T>> getState(String storeName, String key, TypeRef<T> type) { | ||||||
|     return this.getState(storeName, key, null, null, type); |     return this.getState(storeName, key, null, type); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|  | @ -276,7 +275,7 @@ abstract class AbstractDaprClient implements DaprClient { | ||||||
|    */ |    */ | ||||||
|   @Override |   @Override | ||||||
|   public <T> Mono<State<T>> getState(String storeName, String key, Class<T> clazz) { |   public <T> Mono<State<T>> getState(String storeName, String key, Class<T> clazz) { | ||||||
|     return this.getState(storeName, key, null, null, TypeRef.get(clazz)); |     return this.getState(storeName, key, null, TypeRef.get(clazz)); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|  | @ -284,9 +283,8 @@ abstract class AbstractDaprClient implements DaprClient { | ||||||
|    */ |    */ | ||||||
|   @Override |   @Override | ||||||
|   public <T> Mono<State<T>> getState( |   public <T> Mono<State<T>> getState( | ||||||
|           String storeName, String key, String etag, StateOptions options, TypeRef<T> type) { |           String storeName, String key, StateOptions options, TypeRef<T> type) { | ||||||
|     GetStateRequest request = new GetStateRequestBuilder(storeName, key) |     GetStateRequest request = new GetStateRequestBuilder(storeName, key) | ||||||
|         .withEtag(etag) |  | ||||||
|         .withStateOptions(options) |         .withStateOptions(options) | ||||||
|         .build(); |         .build(); | ||||||
|     return this.getState(request, type).map(r -> r.getObject()); |     return this.getState(request, type).map(r -> r.getObject()); | ||||||
|  | @ -298,8 +296,8 @@ abstract class AbstractDaprClient implements DaprClient { | ||||||
|    */ |    */ | ||||||
|   @Override |   @Override | ||||||
|   public <T> Mono<State<T>> getState( |   public <T> Mono<State<T>> getState( | ||||||
|           String storeName, String key, String etag, StateOptions options, Class<T> clazz) { |           String storeName, String key, StateOptions options, Class<T> clazz) { | ||||||
|     return this.getState(storeName, key, etag, options, TypeRef.get(clazz)); |     return this.getState(storeName, key, options, TypeRef.get(clazz)); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|  |  | ||||||
|  | @ -354,26 +354,24 @@ public interface DaprClient extends AutoCloseable { | ||||||
|    * |    * | ||||||
|    * @param storeName The name of the state store. |    * @param storeName The name of the state store. | ||||||
|    * @param key            The key of the State to be retrieved. |    * @param key            The key of the State to be retrieved. | ||||||
|    * @param etag           Optional etag for conditional get |  | ||||||
|    * @param options        Optional settings for retrieve operation. |    * @param options        Optional settings for retrieve operation. | ||||||
|    * @param type           The Type of State needed as return. |    * @param type           The Type of State needed as return. | ||||||
|    * @param <T>            The Type of the return. |    * @param <T>            The Type of the return. | ||||||
|    * @return A Mono Plan for the requested State. |    * @return A Mono Plan for the requested State. | ||||||
|    */ |    */ | ||||||
|   <T> Mono<State<T>> getState(String storeName, String key, String etag, StateOptions options, TypeRef<T> type); |   <T> Mono<State<T>> getState(String storeName, String key, StateOptions options, TypeRef<T> type); | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|    * Retrieve a State based on their key. |    * Retrieve a State based on their key. | ||||||
|    * |    * | ||||||
|    * @param storeName The name of the state store. |    * @param storeName The name of the state store. | ||||||
|    * @param key            The key of the State to be retrieved. |    * @param key            The key of the State to be retrieved. | ||||||
|    * @param etag           Optional etag for conditional get |  | ||||||
|    * @param options        Optional settings for retrieve operation. |    * @param options        Optional settings for retrieve operation. | ||||||
|    * @param clazz          The Type of State needed as return. |    * @param clazz          The Type of State needed as return. | ||||||
|    * @param <T>            The Type of the return. |    * @param <T>            The Type of the return. | ||||||
|    * @return A Mono Plan for the requested State. |    * @return A Mono Plan for the requested State. | ||||||
|    */ |    */ | ||||||
|   <T> Mono<State<T>> getState(String storeName, String key, String etag, StateOptions options, Class<T> clazz); |   <T> Mono<State<T>> getState(String storeName, String key, StateOptions options, Class<T> clazz); | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|    * Retrieve a State based on their key. |    * Retrieve a State based on their key. | ||||||
|  |  | ||||||
|  | @ -58,7 +58,6 @@ import java.io.IOException; | ||||||
| import java.util.HashMap; | import java.util.HashMap; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| import java.util.concurrent.Callable; |  | ||||||
| import java.util.concurrent.ExecutionException; | import java.util.concurrent.ExecutionException; | ||||||
| import java.util.function.Consumer; | import java.util.function.Consumer; | ||||||
| import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||||
|  | @ -163,6 +162,7 @@ public class DaprClientGrpc extends AbstractDaprClient { | ||||||
|           .setTopic(topic) |           .setTopic(topic) | ||||||
|           .setPubsubName(pubsubName) |           .setPubsubName(pubsubName) | ||||||
|           .setData(ByteString.copyFrom(objectSerializer.serialize(data))); |           .setData(ByteString.copyFrom(objectSerializer.serialize(data))); | ||||||
|  |       envelopeBuilder.setDataContentType(objectSerializer.getContentType()); | ||||||
|       Map<String, String> metadata = request.getMetadata(); |       Map<String, String> metadata = request.getMetadata(); | ||||||
|       if (metadata != null) { |       if (metadata != null) { | ||||||
|         envelopeBuilder.putAllMetadata(metadata); |         envelopeBuilder.putAllMetadata(metadata); | ||||||
|  | @ -189,14 +189,17 @@ public class DaprClientGrpc extends AbstractDaprClient { | ||||||
|     try { |     try { | ||||||
|       String appId = invokeServiceRequest.getAppId(); |       String appId = invokeServiceRequest.getAppId(); | ||||||
|       String method = invokeServiceRequest.getMethod(); |       String method = invokeServiceRequest.getMethod(); | ||||||
|       Object request = invokeServiceRequest.getBody(); |       Object body = invokeServiceRequest.getBody(); | ||||||
|       HttpExtension httpExtension = invokeServiceRequest.getHttpExtension(); |       HttpExtension httpExtension = invokeServiceRequest.getHttpExtension(); | ||||||
|       Context context = invokeServiceRequest.getContext(); |       Context context = invokeServiceRequest.getContext(); | ||||||
|       DaprProtos.InvokeServiceRequest envelope = buildInvokeServiceRequest( |       DaprProtos.InvokeServiceRequest envelope = buildInvokeServiceRequest( | ||||||
|           httpExtension, |           httpExtension, | ||||||
|           appId, |           appId, | ||||||
|           method, |           method, | ||||||
|           request); |           body); | ||||||
|  |       // Regarding missing metadata in method invocation for gRPC: | ||||||
|  |       // gRPC to gRPC does not handle metadata in Dapr runtime proto. | ||||||
|  |       // gRPC to HTTP does not map correctly in Dapr runtime as per https://github.com/dapr/dapr/issues/2342 | ||||||
| 
 | 
 | ||||||
|       return this.<CommonProtos.InvokeResponse>createMono( |       return this.<CommonProtos.InvokeResponse>createMono( | ||||||
|               context, |               context, | ||||||
|  | @ -271,8 +274,7 @@ public class DaprClientGrpc extends AbstractDaprClient { | ||||||
|       final String stateStoreName = request.getStoreName(); |       final String stateStoreName = request.getStoreName(); | ||||||
|       final String key = request.getKey(); |       final String key = request.getKey(); | ||||||
|       final StateOptions options = request.getStateOptions(); |       final StateOptions options = request.getStateOptions(); | ||||||
|       // TODO(artursouza): handle etag once available in proto. |       final Map<String, String> metadata = request.getMetadata(); | ||||||
|       // String etag = request.getEtag(); |  | ||||||
|       final Context context = request.getContext(); |       final Context context = request.getContext(); | ||||||
| 
 | 
 | ||||||
|       if ((stateStoreName == null) || (stateStoreName.trim().isEmpty())) { |       if ((stateStoreName == null) || (stateStoreName.trim().isEmpty())) { | ||||||
|  | @ -283,8 +285,10 @@ public class DaprClientGrpc extends AbstractDaprClient { | ||||||
|       } |       } | ||||||
|       DaprProtos.GetStateRequest.Builder builder = DaprProtos.GetStateRequest.newBuilder() |       DaprProtos.GetStateRequest.Builder builder = DaprProtos.GetStateRequest.newBuilder() | ||||||
|           .setStoreName(stateStoreName) |           .setStoreName(stateStoreName) | ||||||
|           .setKey(key) |           .setKey(key); | ||||||
|           .putAllMetadata(request.getMetadata()); |       if (metadata != null) { | ||||||
|  |         builder.putAllMetadata(metadata); | ||||||
|  |       } | ||||||
|       if (options != null && options.getConsistency() != null) { |       if (options != null && options.getConsistency() != null) { | ||||||
|         builder.setConsistency(getGrpcStateConsistency(options)); |         builder.setConsistency(getGrpcStateConsistency(options)); | ||||||
|       } |       } | ||||||
|  | @ -317,6 +321,7 @@ public class DaprClientGrpc extends AbstractDaprClient { | ||||||
|       final String stateStoreName = request.getStoreName(); |       final String stateStoreName = request.getStoreName(); | ||||||
|       final List<String> keys = request.getKeys(); |       final List<String> keys = request.getKeys(); | ||||||
|       final int parallelism = request.getParallelism(); |       final int parallelism = request.getParallelism(); | ||||||
|  |       final Map<String, String> metadata = request.getMetadata(); | ||||||
|       final Context context = request.getContext(); |       final Context context = request.getContext(); | ||||||
|       if ((stateStoreName == null) || (stateStoreName.trim().isEmpty())) { |       if ((stateStoreName == null) || (stateStoreName.trim().isEmpty())) { | ||||||
|         throw new IllegalArgumentException("State store name cannot be null or empty."); |         throw new IllegalArgumentException("State store name cannot be null or empty."); | ||||||
|  | @ -332,8 +337,8 @@ public class DaprClientGrpc extends AbstractDaprClient { | ||||||
|           .setStoreName(stateStoreName) |           .setStoreName(stateStoreName) | ||||||
|           .addAllKeys(keys) |           .addAllKeys(keys) | ||||||
|           .setParallelism(parallelism); |           .setParallelism(parallelism); | ||||||
|       if (request.getMetadata() != null) { |       if (metadata != null) { | ||||||
|         builder.putAllMetadata(request.getMetadata()); |         builder.putAllMetadata(metadata); | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       DaprProtos.GetBulkStateRequest envelope = builder.build(); |       DaprProtos.GetBulkStateRequest envelope = builder.build(); | ||||||
|  | @ -500,6 +505,7 @@ public class DaprClientGrpc extends AbstractDaprClient { | ||||||
|       final String key = request.getKey(); |       final String key = request.getKey(); | ||||||
|       final StateOptions options = request.getStateOptions(); |       final StateOptions options = request.getStateOptions(); | ||||||
|       final String etag = request.getEtag(); |       final String etag = request.getEtag(); | ||||||
|  |       final Map<String, String> metadata = request.getMetadata(); | ||||||
|       final Context context = request.getContext(); |       final Context context = request.getContext(); | ||||||
| 
 | 
 | ||||||
|       if ((stateStoreName == null) || (stateStoreName.trim().isEmpty())) { |       if ((stateStoreName == null) || (stateStoreName.trim().isEmpty())) { | ||||||
|  | @ -521,8 +527,10 @@ public class DaprClientGrpc extends AbstractDaprClient { | ||||||
|       } |       } | ||||||
|       DaprProtos.DeleteStateRequest.Builder builder = DaprProtos.DeleteStateRequest.newBuilder() |       DaprProtos.DeleteStateRequest.Builder builder = DaprProtos.DeleteStateRequest.newBuilder() | ||||||
|           .setStoreName(stateStoreName) |           .setStoreName(stateStoreName) | ||||||
|           .setKey(key) |           .setKey(key); | ||||||
|           .putAllMetadata(request.getMetadata()); |       if (metadata != null) { | ||||||
|  |         builder.putAllMetadata(metadata); | ||||||
|  |       } | ||||||
|       if (etag != null) { |       if (etag != null) { | ||||||
|         builder.setEtag(etag); |         builder.setEtag(etag); | ||||||
|       } |       } | ||||||
|  | @ -548,7 +556,7 @@ public class DaprClientGrpc extends AbstractDaprClient { | ||||||
|    * @param httpExtension Object for HttpExtension |    * @param httpExtension Object for HttpExtension | ||||||
|    * @param appId         The application id to be invoked |    * @param appId         The application id to be invoked | ||||||
|    * @param method        The application method to be invoked |    * @param method        The application method to be invoked | ||||||
|    * @param request       The body of the request to be send as part of the invocation |    * @param body          The body of the request to be send as part of the invocation | ||||||
|    * @param <K>           The Type of the Body |    * @param <K>           The Type of the Body | ||||||
|    * @return The object to be sent as part of the invocation. |    * @return The object to be sent as part of the invocation. | ||||||
|    * @throws IOException If there's an issue serializing the request. |    * @throws IOException If there's an issue serializing the request. | ||||||
|  | @ -557,14 +565,14 @@ public class DaprClientGrpc extends AbstractDaprClient { | ||||||
|       HttpExtension httpExtension, |       HttpExtension httpExtension, | ||||||
|       String appId, |       String appId, | ||||||
|       String method, |       String method, | ||||||
|       K request) throws IOException { |       K body) throws IOException { | ||||||
|     if (httpExtension == null) { |     if (httpExtension == null) { | ||||||
|       throw new IllegalArgumentException("HttpExtension cannot be null. Use HttpExtension.NONE instead."); |       throw new IllegalArgumentException("HttpExtension cannot be null. Use HttpExtension.NONE instead."); | ||||||
|     } |     } | ||||||
|     CommonProtos.InvokeRequest.Builder requestBuilder = CommonProtos.InvokeRequest.newBuilder(); |     CommonProtos.InvokeRequest.Builder requestBuilder = CommonProtos.InvokeRequest.newBuilder(); | ||||||
|     requestBuilder.setMethod(method); |     requestBuilder.setMethod(method); | ||||||
|     if (request != null) { |     if (body != null) { | ||||||
|       byte[] byteRequest = objectSerializer.serialize(request); |       byte[] byteRequest = objectSerializer.serialize(body); | ||||||
|       Any data = Any.newBuilder().setValue(ByteString.copyFrom(byteRequest)).build(); |       Any data = Any.newBuilder().setValue(ByteString.copyFrom(byteRequest)).build(); | ||||||
|       requestBuilder.setData(data); |       requestBuilder.setData(data); | ||||||
|     } else { |     } else { | ||||||
|  |  | ||||||
|  | @ -39,6 +39,7 @@ import java.util.Iterator; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| import java.util.Optional; | import java.util.Optional; | ||||||
|  | import java.util.stream.Collectors; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | @ -53,6 +54,11 @@ public class DaprClientHttp extends AbstractDaprClient { | ||||||
|    */ |    */ | ||||||
|   private static final String HEADER_HTTP_ETAG_ID = "If-Match"; |   private static final String HEADER_HTTP_ETAG_ID = "If-Match"; | ||||||
| 
 | 
 | ||||||
|  |   /** | ||||||
|  |    * Metadata prefix in query params. | ||||||
|  |    */ | ||||||
|  |   private static final String METADATA_PREFIX = "metadata."; | ||||||
|  | 
 | ||||||
|   /** |   /** | ||||||
|    * Serializer for internal objects. |    * Serializer for internal objects. | ||||||
|    */ |    */ | ||||||
|  | @ -133,11 +139,13 @@ public class DaprClientHttp extends AbstractDaprClient { | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       byte[] serializedEvent = objectSerializer.serialize(data); |       byte[] serializedEvent = objectSerializer.serialize(data); | ||||||
|  |       Map<String, String> headers = Collections.singletonMap("content-type", objectSerializer.getContentType()); | ||||||
| 
 | 
 | ||||||
|       String[] pathSegments = new String[]{ DaprHttp.API_VERSION, "publish", pubsubName, topic }; |       String[] pathSegments = new String[]{ DaprHttp.API_VERSION, "publish", pubsubName, topic }; | ||||||
| 
 | 
 | ||||||
|  |       Map<String, String> queryArgs = metadataToQueryArgs(metadata); | ||||||
|       return this.client.invokeApi( |       return this.client.invokeApi( | ||||||
|           DaprHttp.HttpMethods.POST.name(), pathSegments, null, serializedEvent, metadata, context) |           DaprHttp.HttpMethods.POST.name(), pathSegments, queryArgs, serializedEvent, headers, context) | ||||||
|           .thenReturn(new Response<>(context, null)); |           .thenReturn(new Response<>(context, null)); | ||||||
|     } catch (Exception ex) { |     } catch (Exception ex) { | ||||||
|       return DaprException.wrapMono(ex); |       return DaprException.wrapMono(ex); | ||||||
|  | @ -152,14 +160,14 @@ public class DaprClientHttp extends AbstractDaprClient { | ||||||
|       final String appId = invokeServiceRequest.getAppId(); |       final String appId = invokeServiceRequest.getAppId(); | ||||||
|       final String method = invokeServiceRequest.getMethod(); |       final String method = invokeServiceRequest.getMethod(); | ||||||
|       final Object request = invokeServiceRequest.getBody(); |       final Object request = invokeServiceRequest.getBody(); | ||||||
|       final Map<String, String> metadata = invokeServiceRequest.getMetadata(); |  | ||||||
|       final HttpExtension httpExtension = invokeServiceRequest.getHttpExtension(); |       final HttpExtension httpExtension = invokeServiceRequest.getHttpExtension(); | ||||||
|  |       final String contentType = invokeServiceRequest.getContentType(); | ||||||
|       final Context context = invokeServiceRequest.getContext(); |       final Context context = invokeServiceRequest.getContext(); | ||||||
|       if (httpExtension == null) { |       if (httpExtension == null) { | ||||||
|         throw new IllegalArgumentException("HttpExtension cannot be null. Use HttpExtension.NONE instead."); |         throw new IllegalArgumentException("HttpExtension cannot be null. Use HttpExtension.NONE instead."); | ||||||
|       } |       } | ||||||
|       // If the httpExtension is not null, then the method will not be null based on checks in constructor |       // If the httpExtension is not null, then the method will not be null based on checks in constructor | ||||||
|       String httMethod = httpExtension.getMethod().toString(); |       final String httpMethod = httpExtension.getMethod().toString(); | ||||||
|       if (appId == null || appId.trim().isEmpty()) { |       if (appId == null || appId.trim().isEmpty()) { | ||||||
|         throw new IllegalArgumentException("App Id cannot be null or empty."); |         throw new IllegalArgumentException("App Id cannot be null or empty."); | ||||||
|       } |       } | ||||||
|  | @ -170,8 +178,13 @@ public class DaprClientHttp extends AbstractDaprClient { | ||||||
| 
 | 
 | ||||||
|       String[] pathSegments = new String[]{ DaprHttp.API_VERSION, "invoke", appId, "method", method }; |       String[] pathSegments = new String[]{ DaprHttp.API_VERSION, "invoke", appId, "method", method }; | ||||||
| 
 | 
 | ||||||
|       Mono<DaprHttp.Response> response = this.client.invokeApi(httMethod, pathSegments, |       final Map<String, String> headers = new HashMap<>(); | ||||||
|           httpExtension.getQueryString(), serializedRequestBody, metadata, context); |       if (contentType != null && !contentType.isEmpty()) { | ||||||
|  |         headers.put("content-type", contentType); | ||||||
|  |       } | ||||||
|  |       headers.putAll(httpExtension.getHeaders()); | ||||||
|  |       Mono<DaprHttp.Response> response = this.client.invokeApi(httpMethod, pathSegments, | ||||||
|  |           httpExtension.getQueryString(), serializedRequestBody, headers, context); | ||||||
|       return response.flatMap(r -> getMono(type, r)).map(r -> new Response<>(context, r)); |       return response.flatMap(r -> getMono(type, r)).map(r -> new Response<>(context, r)); | ||||||
|     } catch (Exception ex) { |     } catch (Exception ex) { | ||||||
|       return DaprException.wrapMono(ex); |       return DaprException.wrapMono(ex); | ||||||
|  | @ -258,6 +271,7 @@ public class DaprClientHttp extends AbstractDaprClient { | ||||||
|       final String stateStoreName = request.getStoreName(); |       final String stateStoreName = request.getStoreName(); | ||||||
|       final List<String> keys = request.getKeys(); |       final List<String> keys = request.getKeys(); | ||||||
|       final int parallelism = request.getParallelism(); |       final int parallelism = request.getParallelism(); | ||||||
|  |       final Map<String, String> metadata = request.getMetadata(); | ||||||
|       final Context context = request.getContext(); |       final Context context = request.getContext(); | ||||||
|       if ((stateStoreName == null) || (stateStoreName.trim().isEmpty())) { |       if ((stateStoreName == null) || (stateStoreName.trim().isEmpty())) { | ||||||
|         throw new IllegalArgumentException("State store name cannot be null or empty."); |         throw new IllegalArgumentException("State store name cannot be null or empty."); | ||||||
|  | @ -278,8 +292,9 @@ public class DaprClientHttp extends AbstractDaprClient { | ||||||
| 
 | 
 | ||||||
|       String[] pathSegments = new String[]{ DaprHttp.API_VERSION, "state", stateStoreName, "bulk"}; |       String[] pathSegments = new String[]{ DaprHttp.API_VERSION, "state", stateStoreName, "bulk"}; | ||||||
| 
 | 
 | ||||||
|  |       Map<String, String> queryArgs = metadataToQueryArgs(metadata); | ||||||
|       return this.client |       return this.client | ||||||
|           .invokeApi(DaprHttp.HttpMethods.POST.name(), pathSegments, null, requestBody, null, context) |           .invokeApi(DaprHttp.HttpMethods.POST.name(), pathSegments, queryArgs, requestBody, null, context) | ||||||
|           .flatMap(s -> { |           .flatMap(s -> { | ||||||
|             try { |             try { | ||||||
|               return Mono.just(buildStates(s, type)); |               return Mono.just(buildStates(s, type)); | ||||||
|  | @ -304,7 +319,7 @@ public class DaprClientHttp extends AbstractDaprClient { | ||||||
|       final String stateStoreName = request.getStoreName(); |       final String stateStoreName = request.getStoreName(); | ||||||
|       final String key = request.getKey(); |       final String key = request.getKey(); | ||||||
|       final StateOptions options = request.getStateOptions(); |       final StateOptions options = request.getStateOptions(); | ||||||
|       final String etag = request.getEtag(); |       final Map<String, String> metadata = request.getMetadata(); | ||||||
|       final Context context = request.getContext(); |       final Context context = request.getContext(); | ||||||
| 
 | 
 | ||||||
|       if ((stateStoreName == null) || (stateStoreName.trim().isEmpty())) { |       if ((stateStoreName == null) || (stateStoreName.trim().isEmpty())) { | ||||||
|  | @ -313,21 +328,18 @@ public class DaprClientHttp extends AbstractDaprClient { | ||||||
|       if ((key == null) || (key.trim().isEmpty())) { |       if ((key == null) || (key.trim().isEmpty())) { | ||||||
|         throw new IllegalArgumentException("Key cannot be null or empty."); |         throw new IllegalArgumentException("Key cannot be null or empty."); | ||||||
|       } |       } | ||||||
|       Map<String, String> headers = new HashMap<>(); |       Map<String, String> optionsMap = Optional.ofNullable(options) | ||||||
|       if (etag != null && !etag.trim().isEmpty()) { |  | ||||||
|         headers.put(HEADER_HTTP_ETAG_ID, etag); |  | ||||||
|       } |  | ||||||
| 
 |  | ||||||
|       Map<String, String> urlParameters = Optional.ofNullable(options) |  | ||||||
|           .map(o -> o.getStateOptionsAsMap()) |           .map(o -> o.getStateOptionsAsMap()) | ||||||
|           .orElse(new HashMap<>()); |           .orElse(Collections.EMPTY_MAP); | ||||||
| 
 | 
 | ||||||
|       request.getMetadata().forEach(urlParameters::put); |       final Map<String, String> queryParams = new HashMap<>(); | ||||||
|  |       queryParams.putAll(metadataToQueryArgs(metadata)); | ||||||
|  |       queryParams.putAll(optionsMap); | ||||||
| 
 | 
 | ||||||
|       String[] pathSegments = new String[]{ DaprHttp.API_VERSION, "state", stateStoreName, key}; |       String[] pathSegments = new String[]{ DaprHttp.API_VERSION, "state", stateStoreName, key}; | ||||||
| 
 | 
 | ||||||
|       return this.client |       return this.client | ||||||
|           .invokeApi(DaprHttp.HttpMethods.GET.name(), pathSegments, urlParameters, headers, context) |           .invokeApi(DaprHttp.HttpMethods.GET.name(), pathSegments, queryParams, null, context) | ||||||
|           .flatMap(s -> { |           .flatMap(s -> { | ||||||
|             try { |             try { | ||||||
|               return Mono.just(buildState(s, key, options, type)); |               return Mono.just(buildState(s, key, options, type)); | ||||||
|  | @ -450,6 +462,7 @@ public class DaprClientHttp extends AbstractDaprClient { | ||||||
|       final String key = request.getKey(); |       final String key = request.getKey(); | ||||||
|       final StateOptions options = request.getStateOptions(); |       final StateOptions options = request.getStateOptions(); | ||||||
|       final String etag = request.getEtag(); |       final String etag = request.getEtag(); | ||||||
|  |       final Map<String, String> metadata = request.getMetadata(); | ||||||
|       final Context context = request.getContext(); |       final Context context = request.getContext(); | ||||||
| 
 | 
 | ||||||
|       if ((stateStoreName == null) || (stateStoreName.trim().isEmpty())) { |       if ((stateStoreName == null) || (stateStoreName.trim().isEmpty())) { | ||||||
|  | @ -463,16 +476,18 @@ public class DaprClientHttp extends AbstractDaprClient { | ||||||
|         headers.put(HEADER_HTTP_ETAG_ID, etag); |         headers.put(HEADER_HTTP_ETAG_ID, etag); | ||||||
|       } |       } | ||||||
| 
 | 
 | ||||||
|       Map<String, String> urlParameters = Optional.ofNullable(options) |       Map<String, String> optionsMap = Optional.ofNullable(options) | ||||||
|           .map(stateOptions -> stateOptions.getStateOptionsAsMap()) |           .map(stateOptions -> stateOptions.getStateOptionsAsMap()) | ||||||
|           .orElse(new HashMap<>()); |           .orElse(Collections.EMPTY_MAP); | ||||||
| 
 | 
 | ||||||
|       request.getMetadata().forEach(urlParameters::put); |       final Map<String, String> queryParams = new HashMap<>(); | ||||||
|  |       queryParams.putAll(metadataToQueryArgs(metadata)); | ||||||
|  |       queryParams.putAll(optionsMap); | ||||||
| 
 | 
 | ||||||
|       String[] pathSegments = new String[]{ DaprHttp.API_VERSION, "state", stateStoreName, key}; |       String[] pathSegments = new String[]{ DaprHttp.API_VERSION, "state", stateStoreName, key}; | ||||||
| 
 | 
 | ||||||
|       return this.client.invokeApi( |       return this.client.invokeApi( | ||||||
|               DaprHttp.HttpMethods.DELETE.name(), pathSegments, urlParameters, headers, context) |               DaprHttp.HttpMethods.DELETE.name(), pathSegments, queryParams, headers, context) | ||||||
|           .thenReturn(new Response<>(context, null)); |           .thenReturn(new Response<>(context, null)); | ||||||
|     } catch (Exception ex) { |     } catch (Exception ex) { | ||||||
|       return DaprException.wrapMono(ex); |       return DaprException.wrapMono(ex); | ||||||
|  | @ -556,9 +571,10 @@ public class DaprClientHttp extends AbstractDaprClient { | ||||||
|       return DaprException.wrapMono(e); |       return DaprException.wrapMono(e); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     Map<String, String> queryArgs = metadataToQueryArgs(metadata); | ||||||
|     String[] pathSegments = new String[]{ DaprHttp.API_VERSION, "secrets", secretStoreName, key}; |     String[] pathSegments = new String[]{ DaprHttp.API_VERSION, "secrets", secretStoreName, key}; | ||||||
|     return this.client |     return this.client | ||||||
|       .invokeApi(DaprHttp.HttpMethods.GET.name(), pathSegments, metadata, (String)null, null, context) |       .invokeApi(DaprHttp.HttpMethods.GET.name(), pathSegments, queryArgs, (String)null, null, context) | ||||||
|       .flatMap(response -> { |       .flatMap(response -> { | ||||||
|         try { |         try { | ||||||
|           Map m =  INTERNAL_SERIALIZER.deserialize(response.getBody(), Map.class); |           Map m =  INTERNAL_SERIALIZER.deserialize(response.getBody(), Map.class); | ||||||
|  | @ -575,8 +591,28 @@ public class DaprClientHttp extends AbstractDaprClient { | ||||||
|       .map(m -> new Response<>(context, m)); |       .map(m -> new Response<>(context, m)); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|  |   /** | ||||||
|  |    * {@inheritDoc} | ||||||
|  |    */ | ||||||
|   @Override |   @Override | ||||||
|   public void close() { |   public void close() { | ||||||
|     client.close(); |     client.close(); | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * Converts metadata map into HTTP headers. | ||||||
|  |    * @param metadata metadata map | ||||||
|  |    * @return HTTP headers | ||||||
|  |    */ | ||||||
|  |   private static Map<String, String> metadataToQueryArgs(Map<String, String> metadata) { | ||||||
|  |     if (metadata == null) { | ||||||
|  |       return Collections.EMPTY_MAP; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return metadata | ||||||
|  |         .entrySet() | ||||||
|  |         .stream() | ||||||
|  |         .filter(e -> e.getKey() != null) | ||||||
|  |         .collect(Collectors.toMap(e -> METADATA_PREFIX + e.getKey(), e -> e.getValue())); | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -21,8 +21,6 @@ public class GetStateRequest { | ||||||
| 
 | 
 | ||||||
|   private Map<String, String> metadata; |   private Map<String, String> metadata; | ||||||
| 
 | 
 | ||||||
|   private String etag; |  | ||||||
| 
 |  | ||||||
|   private StateOptions stateOptions; |   private StateOptions stateOptions; | ||||||
| 
 | 
 | ||||||
|   private Context context; |   private Context context; | ||||||
|  | @ -43,14 +41,6 @@ public class GetStateRequest { | ||||||
|     this.key = key; |     this.key = key; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   public String getEtag() { |  | ||||||
|     return etag; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   void setEtag(String etag) { |  | ||||||
|     this.etag = etag; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   public StateOptions getStateOptions() { |   public StateOptions getStateOptions() { | ||||||
|     return stateOptions; |     return stateOptions; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | @ -20,8 +20,6 @@ public class GetStateRequestBuilder { | ||||||
| 
 | 
 | ||||||
|   private Map<String, String> metadata; |   private Map<String, String> metadata; | ||||||
| 
 | 
 | ||||||
|   private String etag; |  | ||||||
| 
 |  | ||||||
|   private StateOptions stateOptions; |   private StateOptions stateOptions; | ||||||
| 
 | 
 | ||||||
|   private Context context; |   private Context context; | ||||||
|  | @ -36,11 +34,6 @@ public class GetStateRequestBuilder { | ||||||
|     return this; |     return this; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   public GetStateRequestBuilder withEtag(String etag) { |  | ||||||
|     this.etag = etag; |  | ||||||
|     return this; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   public GetStateRequestBuilder withStateOptions(StateOptions stateOptions) { |   public GetStateRequestBuilder withStateOptions(StateOptions stateOptions) { | ||||||
|     this.stateOptions = stateOptions; |     this.stateOptions = stateOptions; | ||||||
|     return this; |     return this; | ||||||
|  | @ -60,7 +53,6 @@ public class GetStateRequestBuilder { | ||||||
|     request.setStoreName(this.storeName); |     request.setStoreName(this.storeName); | ||||||
|     request.setKey(this.key); |     request.setKey(this.key); | ||||||
|     request.setMetadata(this.metadata); |     request.setMetadata(this.metadata); | ||||||
|     request.setEtag(this.etag); |  | ||||||
|     request.setStateOptions(this.stateOptions); |     request.setStateOptions(this.stateOptions); | ||||||
|     request.setContext(this.context); |     request.setContext(this.context); | ||||||
|     return request; |     return request; | ||||||
|  |  | ||||||
|  | @ -6,10 +6,8 @@ | ||||||
| package io.dapr.client.domain; | package io.dapr.client.domain; | ||||||
| 
 | 
 | ||||||
| import io.dapr.client.DaprHttp; | import io.dapr.client.DaprHttp; | ||||||
| import io.dapr.exceptions.DaprException; |  | ||||||
| 
 | 
 | ||||||
| import java.util.Collections; | import java.util.Collections; | ||||||
| import java.util.HashMap; |  | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  | @ -22,39 +20,39 @@ public final class HttpExtension { | ||||||
|   /** |   /** | ||||||
|    * Convenience HttpExtension object for {@link io.dapr.client.DaprHttp.HttpMethods#NONE} with empty queryString. |    * Convenience HttpExtension object for {@link io.dapr.client.DaprHttp.HttpMethods#NONE} with empty queryString. | ||||||
|    */ |    */ | ||||||
|   public static final HttpExtension NONE = new HttpExtension(DaprHttp.HttpMethods.NONE, new HashMap<>()); |   public static final HttpExtension NONE = new HttpExtension(DaprHttp.HttpMethods.NONE); | ||||||
|   /** |   /** | ||||||
|    * Convenience HttpExtension object for the {@link DaprHttp.HttpMethods#GET} Verb with empty queryString. |    * Convenience HttpExtension object for the {@link DaprHttp.HttpMethods#GET} Verb with empty queryString. | ||||||
|    */ |    */ | ||||||
|   public static final HttpExtension GET = new HttpExtension(DaprHttp.HttpMethods.GET, new HashMap<>()); |   public static final HttpExtension GET = new HttpExtension(DaprHttp.HttpMethods.GET); | ||||||
|   /** |   /** | ||||||
|    * Convenience HttpExtension object for the {@link DaprHttp.HttpMethods#PUT} Verb with empty queryString. |    * Convenience HttpExtension object for the {@link DaprHttp.HttpMethods#PUT} Verb with empty queryString. | ||||||
|    */ |    */ | ||||||
|   public static final HttpExtension PUT = new HttpExtension(DaprHttp.HttpMethods.PUT, new HashMap<>()); |   public static final HttpExtension PUT = new HttpExtension(DaprHttp.HttpMethods.PUT); | ||||||
|   /** |   /** | ||||||
|    * Convenience HttpExtension object for the {@link DaprHttp.HttpMethods#POST} Verb with empty queryString. |    * Convenience HttpExtension object for the {@link DaprHttp.HttpMethods#POST} Verb with empty queryString. | ||||||
|    */ |    */ | ||||||
|   public static final HttpExtension POST = new HttpExtension(DaprHttp.HttpMethods.POST, new HashMap<>()); |   public static final HttpExtension POST = new HttpExtension(DaprHttp.HttpMethods.POST); | ||||||
|   /** |   /** | ||||||
|    * Convenience HttpExtension object for the {@link DaprHttp.HttpMethods#DELETE} Verb with empty queryString. |    * Convenience HttpExtension object for the {@link DaprHttp.HttpMethods#DELETE} Verb with empty queryString. | ||||||
|    */ |    */ | ||||||
|   public static final HttpExtension DELETE = new HttpExtension(DaprHttp.HttpMethods.DELETE, new HashMap<>()); |   public static final HttpExtension DELETE = new HttpExtension(DaprHttp.HttpMethods.DELETE); | ||||||
|   /** |   /** | ||||||
|    * Convenience HttpExtension object for the {@link DaprHttp.HttpMethods#HEAD} Verb with empty queryString. |    * Convenience HttpExtension object for the {@link DaprHttp.HttpMethods#HEAD} Verb with empty queryString. | ||||||
|    */ |    */ | ||||||
|   public static final HttpExtension HEAD = new HttpExtension(DaprHttp.HttpMethods.HEAD, new HashMap<>()); |   public static final HttpExtension HEAD = new HttpExtension(DaprHttp.HttpMethods.HEAD); | ||||||
|   /** |   /** | ||||||
|    * Convenience HttpExtension object for the {@link DaprHttp.HttpMethods#CONNECT} Verb with empty queryString. |    * Convenience HttpExtension object for the {@link DaprHttp.HttpMethods#CONNECT} Verb with empty queryString. | ||||||
|    */ |    */ | ||||||
|   public static final HttpExtension CONNECT = new HttpExtension(DaprHttp.HttpMethods.CONNECT, new HashMap<>()); |   public static final HttpExtension CONNECT = new HttpExtension(DaprHttp.HttpMethods.CONNECT); | ||||||
|   /** |   /** | ||||||
|    * Convenience HttpExtension object for the {@link DaprHttp.HttpMethods#OPTIONS} Verb with empty queryString. |    * Convenience HttpExtension object for the {@link DaprHttp.HttpMethods#OPTIONS} Verb with empty queryString. | ||||||
|    */ |    */ | ||||||
|   public static final HttpExtension OPTIONS = new HttpExtension(DaprHttp.HttpMethods.OPTIONS, new HashMap<>()); |   public static final HttpExtension OPTIONS = new HttpExtension(DaprHttp.HttpMethods.OPTIONS); | ||||||
|   /** |   /** | ||||||
|    * Convenience HttpExtension object for the {@link DaprHttp.HttpMethods#TRACE} Verb with empty queryString. |    * Convenience HttpExtension object for the {@link DaprHttp.HttpMethods#TRACE} Verb with empty queryString. | ||||||
|    */ |    */ | ||||||
|   public static final HttpExtension TRACE = new HttpExtension(DaprHttp.HttpMethods.TRACE, new HashMap<>()); |   public static final HttpExtension TRACE = new HttpExtension(DaprHttp.HttpMethods.TRACE); | ||||||
| 
 | 
 | ||||||
|   /** |   /** | ||||||
|    * HTTP verb. |    * HTTP verb. | ||||||
|  | @ -66,26 +64,37 @@ public final class HttpExtension { | ||||||
|    */ |    */ | ||||||
|   private Map<String, String> queryString; |   private Map<String, String> queryString; | ||||||
| 
 | 
 | ||||||
|  |   /** | ||||||
|  |    * HTTP headers. | ||||||
|  |    */ | ||||||
|  |   private Map<String, String> headers; | ||||||
|  | 
 | ||||||
|   /** |   /** | ||||||
|    * Construct a HttpExtension object. |    * Construct a HttpExtension object. | ||||||
|    * @param method      Required value denoting the HttpMethod. |    * @param method      Required value denoting the HttpMethod. | ||||||
|    * @param queryString Non-null map value for the queryString for a HTTP listener. |    * @param queryString map for the queryString the HTTP call. | ||||||
|  |    * @param headers     map to set HTTP headers. | ||||||
|    * @see io.dapr.client.DaprHttp.HttpMethods for supported methods. |    * @see io.dapr.client.DaprHttp.HttpMethods for supported methods. | ||||||
|    * @throws IllegalArgumentException on null method or queryString. |    * @throws IllegalArgumentException on null method or queryString. | ||||||
|    */ |    */ | ||||||
|   public HttpExtension(DaprHttp.HttpMethods method, Map<String, String> queryString) { |   public HttpExtension(DaprHttp.HttpMethods method, Map<String, String> queryString, Map<String, String> headers) { | ||||||
|     try { |  | ||||||
|     if (method == null) { |     if (method == null) { | ||||||
|       throw new IllegalArgumentException("HttpExtension method cannot be null"); |       throw new IllegalArgumentException("HttpExtension method cannot be null"); | ||||||
|       } else if (queryString == null) { |  | ||||||
|         throw new IllegalArgumentException("HttpExtension queryString map cannot be null"); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     this.method = method; |     this.method = method; | ||||||
|       this.queryString = Collections.unmodifiableMap(queryString); |     this.queryString = Collections.unmodifiableMap(queryString == null ? Collections.EMPTY_MAP : queryString); | ||||||
|     } catch (RuntimeException e) { |     this.headers = Collections.unmodifiableMap(headers == null ? Collections.EMPTY_MAP : headers); | ||||||
|       DaprException.wrap(e); |  | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * Construct a HttpExtension object. | ||||||
|  |    * @param method      Required value denoting the HttpMethod. | ||||||
|  |    * @see io.dapr.client.DaprHttp.HttpMethods for supported methods. | ||||||
|  |    * @throws IllegalArgumentException on null method or queryString. | ||||||
|  |    */ | ||||||
|  |   public HttpExtension(DaprHttp.HttpMethods method) { | ||||||
|  |     this(method, null, null); | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   public DaprHttp.HttpMethods getMethod() { |   public DaprHttp.HttpMethods getMethod() { | ||||||
|  | @ -95,4 +104,8 @@ public final class HttpExtension { | ||||||
|   public Map<String, String> getQueryString() { |   public Map<String, String> getQueryString() { | ||||||
|     return queryString; |     return queryString; | ||||||
|   } |   } | ||||||
|  | 
 | ||||||
|  |   public Map<String, String> getHeaders() { | ||||||
|  |     return headers; | ||||||
|  |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -20,8 +20,6 @@ public class InvokeServiceRequest { | ||||||
| 
 | 
 | ||||||
|   private Object body; |   private Object body; | ||||||
| 
 | 
 | ||||||
|   private Map<String, String> metadata; |  | ||||||
| 
 |  | ||||||
|   private HttpExtension httpExtension; |   private HttpExtension httpExtension; | ||||||
| 
 | 
 | ||||||
|   private Context context; |   private Context context; | ||||||
|  | @ -52,14 +50,6 @@ public class InvokeServiceRequest { | ||||||
|     this.body = body; |     this.body = body; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   public Map<String, String> getMetadata() { |  | ||||||
|     return metadata; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   void setMetadata(Map<String, String> metadata) { |  | ||||||
|     this.metadata = metadata; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   public HttpExtension getHttpExtension() { |   public HttpExtension getHttpExtension() { | ||||||
|     return httpExtension; |     return httpExtension; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | @ -7,10 +7,6 @@ package io.dapr.client.domain; | ||||||
| 
 | 
 | ||||||
| import io.opentelemetry.context.Context; | import io.opentelemetry.context.Context; | ||||||
| 
 | 
 | ||||||
| import java.util.Collections; |  | ||||||
| import java.util.HashMap; |  | ||||||
| import java.util.Map; |  | ||||||
| 
 |  | ||||||
| /** | /** | ||||||
|  * Builds a request to invoke a service. |  * Builds a request to invoke a service. | ||||||
|  */ |  */ | ||||||
|  | @ -24,8 +20,6 @@ public class InvokeServiceRequestBuilder { | ||||||
| 
 | 
 | ||||||
|   private Object body; |   private Object body; | ||||||
| 
 | 
 | ||||||
|   private Map<String, String> metadata = new HashMap<>(); |  | ||||||
| 
 |  | ||||||
|   private HttpExtension httpExtension = HttpExtension.NONE; |   private HttpExtension httpExtension = HttpExtension.NONE; | ||||||
| 
 | 
 | ||||||
|   private Context context; |   private Context context; | ||||||
|  | @ -45,11 +39,6 @@ public class InvokeServiceRequestBuilder { | ||||||
|     return this; |     return this; | ||||||
|   } |   } | ||||||
| 
 | 
 | ||||||
|   public InvokeServiceRequestBuilder withMetadata(Map<String, String> metadata) { |  | ||||||
|     this.metadata = metadata == null ? null : Collections.unmodifiableMap(metadata); |  | ||||||
|     return this; |  | ||||||
|   } |  | ||||||
| 
 |  | ||||||
|   public InvokeServiceRequestBuilder withHttpExtension(HttpExtension httpExtension) { |   public InvokeServiceRequestBuilder withHttpExtension(HttpExtension httpExtension) { | ||||||
|     this.httpExtension = httpExtension; |     this.httpExtension = httpExtension; | ||||||
|     return this; |     return this; | ||||||
|  | @ -71,7 +60,6 @@ public class InvokeServiceRequestBuilder { | ||||||
|     request.setMethod(this.method); |     request.setMethod(this.method); | ||||||
|     request.setBody(this.body); |     request.setBody(this.body); | ||||||
|     request.setHttpExtension(this.httpExtension); |     request.setHttpExtension(this.httpExtension); | ||||||
|     request.setMetadata(this.metadata); |  | ||||||
|     request.setContext(this.context); |     request.setContext(this.context); | ||||||
|     return request; |     return request; | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | @ -532,9 +532,8 @@ public class DaprClientGrpcTest { | ||||||
| 
 | 
 | ||||||
|   @Test |   @Test | ||||||
|   public void invokeServiceWithHttpExtensionTest() throws IOException { |   public void invokeServiceWithHttpExtensionTest() throws IOException { | ||||||
|     HttpExtension httpExtension = new HttpExtension(DaprHttp.HttpMethods.GET, new HashMap<String, String>() {{ |     HttpExtension httpExtension = new HttpExtension( | ||||||
|       put("test", "1"); |         DaprHttp.HttpMethods.GET, Collections.singletonMap("test", "1"), null); | ||||||
|     }}); |  | ||||||
|     CommonProtos.InvokeRequest message = CommonProtos.InvokeRequest.newBuilder() |     CommonProtos.InvokeRequest message = CommonProtos.InvokeRequest.newBuilder() | ||||||
|         .setMethod("method") |         .setMethod("method") | ||||||
|         .setData(getAny("request")) |         .setData(getAny("request")) | ||||||
|  | @ -951,7 +950,7 @@ public class DaprClientGrpcTest { | ||||||
|         .setEtag(etag) |         .setEtag(etag) | ||||||
|         .build(); |         .build(); | ||||||
|     GetStateRequestBuilder builder = new GetStateRequestBuilder(STATE_STORE_NAME, key); |     GetStateRequestBuilder builder = new GetStateRequestBuilder(STATE_STORE_NAME, key); | ||||||
|     builder.withMetadata(metadata).withEtag(etag).withStateOptions(options); |     builder.withMetadata(metadata).withStateOptions(options); | ||||||
|     GetStateRequest request = builder.build(); |     GetStateRequest request = builder.build(); | ||||||
|     doAnswer((Answer<Void>) invocation -> { |     doAnswer((Answer<Void>) invocation -> { | ||||||
|       StreamObserver<DaprProtos.GetStateResponse> observer = (StreamObserver<DaprProtos.GetStateResponse>) invocation.getArguments()[1]; |       StreamObserver<DaprProtos.GetStateResponse> observer = (StreamObserver<DaprProtos.GetStateResponse>) invocation.getArguments()[1]; | ||||||
|  |  | ||||||
|  | @ -161,7 +161,7 @@ public class DaprClientHttpTest { | ||||||
|     daprClientHttp = new DaprClientHttp(daprHttp); |     daprClientHttp = new DaprClientHttp(daprHttp); | ||||||
|     assertThrows(IllegalArgumentException.class, () -> { |     assertThrows(IllegalArgumentException.class, () -> { | ||||||
|       // null HttpMethod |       // null HttpMethod | ||||||
|       daprClientHttp.invokeMethod("1", "2", "3", new HttpExtension(null, null), null, (Class)null).block(); |       daprClientHttp.invokeMethod("1", "2", "3", new HttpExtension(null), null, (Class)null).block(); | ||||||
|     }); |     }); | ||||||
|     assertThrows(IllegalArgumentException.class, () -> { |     assertThrows(IllegalArgumentException.class, () -> { | ||||||
|       // null HttpExtension |       // null HttpExtension | ||||||
|  | @ -282,7 +282,7 @@ public class DaprClientHttpTest { | ||||||
|     daprClientHttp = new DaprClientHttp(daprHttp); |     daprClientHttp = new DaprClientHttp(daprHttp); | ||||||
|     Map<String, String> queryString = new HashMap<>(); |     Map<String, String> queryString = new HashMap<>(); | ||||||
|     queryString.put("test", "1"); |     queryString.put("test", "1"); | ||||||
|     HttpExtension httpExtension = new HttpExtension(DaprHttp.HttpMethods.GET, queryString); |     HttpExtension httpExtension = new HttpExtension(DaprHttp.HttpMethods.GET, queryString, null); | ||||||
|     Mono<Void> mono = daprClientHttp.invokeMethod("41", "neworder", "", httpExtension, map); |     Mono<Void> mono = daprClientHttp.invokeMethod("41", "neworder", "", httpExtension, map); | ||||||
|     assertNull(mono.block()); |     assertNull(mono.block()); | ||||||
|   } |   } | ||||||
|  | @ -679,12 +679,12 @@ public class DaprClientHttpTest { | ||||||
|     Map<String, String> metadata = new HashMap<>(); |     Map<String, String> metadata = new HashMap<>(); | ||||||
|     metadata.put("key_1", "val_1"); |     metadata.put("key_1", "val_1"); | ||||||
|     mockInterceptor.addRule() |     mockInterceptor.addRule() | ||||||
|       .get("http://127.0.0.1:3000/v1.0/state/MyStateStore/key?key_1=val_1") |       .get("http://127.0.0.1:3000/v1.0/state/MyStateStore/key?metadata.key_1=val_1") | ||||||
|       .respond("\"" + EXPECTED_RESULT + "\""); |       .respond("\"" + EXPECTED_RESULT + "\""); | ||||||
|     daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3000, okHttpClient); |     daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3000, okHttpClient); | ||||||
|     daprClientHttp = new DaprClientHttp(daprHttp); |     daprClientHttp = new DaprClientHttp(daprHttp); | ||||||
|     GetStateRequestBuilder builder = new GetStateRequestBuilder(STATE_STORE_NAME, "key"); |     GetStateRequestBuilder builder = new GetStateRequestBuilder(STATE_STORE_NAME, "key"); | ||||||
|     builder.withMetadata(metadata).withEtag(""); |     builder.withMetadata(metadata); | ||||||
|     Mono<Response<State<String>>> monoMetadata = daprClientHttp.getState(builder.build(), TypeRef.get(String.class)); |     Mono<Response<State<String>>> monoMetadata = daprClientHttp.getState(builder.build(), TypeRef.get(String.class)); | ||||||
|     assertEquals(monoMetadata.block().getObject().getKey(), "key"); |     assertEquals(monoMetadata.block().getObject().getKey(), "key"); | ||||||
|   } |   } | ||||||
|  | @ -956,7 +956,7 @@ public class DaprClientHttpTest { | ||||||
|     StateOptions stateOptions = mock(StateOptions.class); |     StateOptions stateOptions = mock(StateOptions.class); | ||||||
|     State<String> stateKeyValue = new State<>("value", "key", "etag", stateOptions); |     State<String> stateKeyValue = new State<>("value", "key", "etag", stateOptions); | ||||||
|     mockInterceptor.addRule() |     mockInterceptor.addRule() | ||||||
|       .delete("http://127.0.0.1:3000/v1.0/state/MyStateStore/key?key_1=val_1") |       .delete("http://127.0.0.1:3000/v1.0/state/MyStateStore/key?metadata.key_1=val_1") | ||||||
|       .respond(EXPECTED_RESULT); |       .respond(EXPECTED_RESULT); | ||||||
|     daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3000, okHttpClient); |     daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3000, okHttpClient); | ||||||
|     daprClientHttp = new DaprClientHttp(daprHttp); |     daprClientHttp = new DaprClientHttp(daprHttp); | ||||||
|  | @ -1134,7 +1134,7 @@ public class DaprClientHttpTest { | ||||||
|       .get("http://127.0.0.1:3000/v1.0/secrets/MySecretStore/key") |       .get("http://127.0.0.1:3000/v1.0/secrets/MySecretStore/key") | ||||||
|       .respond("{ \"mysecretkey\": \"mysecretvalue\"}"); |       .respond("{ \"mysecretkey\": \"mysecretvalue\"}"); | ||||||
|     mockInterceptor.addRule() |     mockInterceptor.addRule() | ||||||
|       .get("http://127.0.0.1:3000/v1.0/secrets/MySecretStore/key?metakey=metavalue") |       .get("http://127.0.0.1:3000/v1.0/secrets/MySecretStore/key?metadata.metakey=metavalue") | ||||||
|       .respond("{ \"mysecretkey2\": \"mysecretvalue2\"}"); |       .respond("{ \"mysecretkey2\": \"mysecretvalue2\"}"); | ||||||
|     daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3000, okHttpClient); |     daprHttp = new DaprHttp(Properties.SIDECAR_IP.get(), 3000, okHttpClient); | ||||||
|     daprClientHttp = new DaprClientHttp(daprHttp); |     daprClientHttp = new DaprClientHttp(daprHttp); | ||||||
|  |  | ||||||
|  | @ -8,7 +8,6 @@ package io.dapr.runtime; | ||||||
| import com.fasterxml.jackson.core.JsonFactory; | import com.fasterxml.jackson.core.JsonFactory; | ||||||
| import com.fasterxml.jackson.core.JsonGenerator; | import com.fasterxml.jackson.core.JsonGenerator; | ||||||
| import io.dapr.client.DaprClient; | import io.dapr.client.DaprClient; | ||||||
| import io.dapr.client.DaprClientHttp; |  | ||||||
| import io.dapr.client.DaprClientTestBuilder; | import io.dapr.client.DaprClientTestBuilder; | ||||||
| import io.dapr.client.DaprHttp; | import io.dapr.client.DaprHttp; | ||||||
| import io.dapr.client.DaprHttpStub; | import io.dapr.client.DaprHttpStub; | ||||||
|  | @ -129,7 +128,7 @@ public class DaprRuntimeTest { | ||||||
|           eq((PUBLISH_PATH + "/" + PUBSUB_NAME + "/" + TOPIC_NAME).split("/")), |           eq((PUBLISH_PATH + "/" + PUBSUB_NAME + "/" + TOPIC_NAME).split("/")), | ||||||
|           any(), |           any(), | ||||||
|           eq(serializer.serialize(message.data)), |           eq(serializer.serialize(message.data)), | ||||||
|           eq(null), |           any(), | ||||||
|           any())) |           any())) | ||||||
|           .thenAnswer(invocationOnMock -> this.daprRuntime.handleInvocation( |           .thenAnswer(invocationOnMock -> this.daprRuntime.handleInvocation( | ||||||
|               TOPIC_NAME, |               TOPIC_NAME, | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue