From d3728c01036dde83b606de4a87c6fdae1bc3903b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Jos=C3=A9=20Herrera=20de=20la=20Garza?= Date: Fri, 31 Jan 2020 14:34:21 -0600 Subject: [PATCH 1/4] Fix Metata for Invoke Method --- .../src/test/java/io/dapr/it/pubsub/http/PubSubIT.java | 1 - sdk/src/main/java/io/dapr/client/DaprClientHttp.java | 2 +- sdk/src/test/java/io/dapr/runtime/DaprRuntimeTest.java | 6 +++--- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/sdk-tests/src/test/java/io/dapr/it/pubsub/http/PubSubIT.java b/sdk-tests/src/test/java/io/dapr/it/pubsub/http/PubSubIT.java index 8e916b1b74..eadf416d7f 100644 --- a/sdk-tests/src/test/java/io/dapr/it/pubsub/http/PubSubIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/pubsub/http/PubSubIT.java @@ -10,7 +10,6 @@ import io.dapr.client.domain.Verb; import io.dapr.it.BaseIT; import io.dapr.it.DaprRun; -import io.dapr.serializer.DefaultObjectSerializer; import org.junit.Test; import java.util.Collections; diff --git a/sdk/src/main/java/io/dapr/client/DaprClientHttp.java b/sdk/src/main/java/io/dapr/client/DaprClientHttp.java index 28710ef563..0e79a3bd8b 100644 --- a/sdk/src/main/java/io/dapr/client/DaprClientHttp.java +++ b/sdk/src/main/java/io/dapr/client/DaprClientHttp.java @@ -131,7 +131,7 @@ public Mono invokeService( } String path = String.format("%s/%s/method/%s", Constants.INVOKE_PATH, appId, method); byte[] serializedRequestBody = objectSerializer.serialize(request); - Mono response = this.client.invokeApi(httMethod, path, null, serializedRequestBody, metadata); + Mono response = this.client.invokeApi(httMethod, path, metadata, serializedRequestBody, null); return response.flatMap(r -> { try { T object = objectSerializer.deserialize(r.getBody(), clazz); diff --git a/sdk/src/test/java/io/dapr/runtime/DaprRuntimeTest.java b/sdk/src/test/java/io/dapr/runtime/DaprRuntimeTest.java index c81635c1f3..99e70c50c4 100644 --- a/sdk/src/test/java/io/dapr/runtime/DaprRuntimeTest.java +++ b/sdk/src/test/java/io/dapr/runtime/DaprRuntimeTest.java @@ -113,7 +113,7 @@ public void pubSubHappyCase() throws Exception { when(daprHttp.invokeApi( eq("POST"), eq(Constants.PUBLISH_PATH + "/" + TOPIC_NAME), - eq(null), + any(), eq(serializer.serialize(message.data)), eq(null))) .thenAnswer(invocationOnMock -> this.daprRuntime.handleInvocation( @@ -200,9 +200,9 @@ public void invokeHappyCase() throws Exception { when(daprHttp.invokeApi( eq("POST"), eq(Constants.INVOKE_PATH + "/" + APP_ID + "/method/" + METHOD_NAME), - eq(null), + any(), eq(serializer.serialize(message.data)), - any())) + eq(null))) .thenAnswer(x -> this.daprRuntime.handleInvocation( METHOD_NAME, From 0d457e348c823a06bb9f2726c0329834968e9df8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Jos=C3=A9=20Herrera=20de=20la=20Garza?= Date: Fri, 31 Jan 2020 19:32:41 -0600 Subject: [PATCH 2/4] Add Integration Test for Method Invoke --- sdk-tests/pom.xml | 6 + .../http/MethodInvokeController.java | 76 +++++++++++++ .../it/methodinvoke/http/MethodInvokeIT.java | 106 ++++++++++++++++++ .../http/MethodInvokeService.java | 39 +++++++ .../io/dapr/it/methodinvoke/http/Person.java | 53 +++++++++ 5 files changed, 280 insertions(+) create mode 100644 sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java create mode 100644 sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java create mode 100644 sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeService.java create mode 100644 sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/Person.java diff --git a/sdk-tests/pom.xml b/sdk-tests/pom.xml index f839656640..7ddb197ba5 100644 --- a/sdk-tests/pom.xml +++ b/sdk-tests/pom.xml @@ -65,6 +65,12 @@ 2.2.2.RELEASE test + + com.github.javafaker + javafaker + 0.15 + test + diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java new file mode 100644 index 0000000000..9379b5ad98 --- /dev/null +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java @@ -0,0 +1,76 @@ +package io.dapr.it.methodinvoke.http; + +import org.springframework.web.bind.annotation.*; + +import java.util.*; + +/** + * SpringBoot Controller to handle input binding. + */ +@RestController +public class MethodInvokeController { + + private static final Map messagesReceived = new HashMap<>(); + private static final List persons= new ArrayList<>(); + + @PostMapping("/messages") + public void postMessages(@RequestBody String message){ + System.out.println("Controller got message: " + message); + final Optional maxKey = messagesReceived.keySet().stream().max(Integer::compareTo); + final Integer key = maxKey.orElse(-1)+1; + messagesReceived.put(key,message); + System.out.println("Controller save the message: " + message); + } + + @PutMapping(path = "/messages/{messageId}") + public void putMessages(@PathVariable Integer messageId, @RequestBody String message){ + messagesReceived.put(messageId,message); + } + + @DeleteMapping(path = "/messages/{messageId}") + public void deleteMessages(@PathVariable Integer messageId){ + messagesReceived.remove(messageId); + } + + @GetMapping(path = "/messages") + public Map getMessages() { + return messagesReceived; + } + + + + + @PostMapping("/persons") + public void postPerson(@RequestBody Person person){ + System.out.println("Controller get person: " + person); + final Optional max = persons.stream().map(person1 -> person1.getId()).max(Integer::compareTo); + final Integer key = max.orElse(-1)+1; + person.setId(key); + persons.add(person); + System.out.println("Controller save the person: " + person); + } + + @PutMapping(path = "/persons/{personId}") + public void putPerson(@PathVariable Integer personId, @RequestBody Person person){ + final Optional auxPerson = persons.stream().filter(person1 -> person1.getId() == personId).findFirst(); + if(auxPerson.isPresent()){ + auxPerson.get().setName(person.getName()); + auxPerson.get().setLastName(person.getLastName()); + auxPerson.get().setBirthDate(person.getBirthDate()); + } + } + + @DeleteMapping(path = "/persons/{personId}") + public void deletePerson(@PathVariable Integer personId){ + final Optional auxPerson = persons.stream().filter(person1 -> person1.getId() == personId).findFirst(); + if(auxPerson.isPresent()) { + persons.remove(auxPerson.get()); + } + } + + @GetMapping(path = "/persons") + public List getPersons() { + return persons; + } + +} diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java new file mode 100644 index 0000000000..0535a429c1 --- /dev/null +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java @@ -0,0 +1,106 @@ +package io.dapr.it.methodinvoke.http; + +import com.github.javafaker.Faker; +import io.dapr.client.DaprClient; +import io.dapr.client.DaprClientBuilder; +import io.dapr.client.domain.Verb; +import io.dapr.it.BaseIT; +import io.dapr.it.DaprRun; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Calendar; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; + +public class MethodInvokeIT extends BaseIT { + + //Number of messages to be sent: 10 + private static final int NUM_MESSAGES = 10; + private static DaprRun daprRun=null; + + @BeforeClass + public static void init() throws Exception { + System.out.println("Working Directory = " + System.getProperty("user.dir")); + + daprRun = startDaprApp( + MethodInvokeIT.class.getSimpleName(), + MethodInvokeService.SUCCESS_MESSAGE, + MethodInvokeService.class, + true, + 60000); + } + + @Test + public void testInvoke() { + + // At this point, it is guaranteed that the service above is running and all ports being listened to. + + DaprClient client = new DaprClientBuilder().build(); + for (int i = 0; i < NUM_MESSAGES; i++) { + String message = String.format("This is message #%d", i); + //Publishing messages + client.invokeService(Verb.POST, daprRun.getAppName(), "messages", message).block(); + System.out.println("Invoke method messages : " + message); + } + + Map messages = client.invokeService(Verb.GET, daprRun.getAppName(), "messages", null, Map.class).block(); + assertEquals(10, messages.size()); + + client.invokeService(Verb.DELETE,daprRun.getAppName(),"messages/1",null).block(); + + messages = client.invokeService(Verb.GET, daprRun.getAppName(), "messages", null, Map.class).block(); + assertEquals(9, messages.size()); + + client.invokeService(Verb.PUT, daprRun.getAppName(), "messages/2", "updated message").block(); + messages = client.invokeService(Verb.GET, daprRun.getAppName(), "messages", null, Map.class).block(); + assertEquals("updated message", messages.get("2")); + + } + + + @Test + public void testInvokeWithObjects() { + + // At this point, it is guaranteed that the service above is running and all ports being listened to. + + DaprClient client = new DaprClientBuilder().build(); + + Faker faker = new Faker(); + + for (int i = 0; i < NUM_MESSAGES; i++) { + Person person= new Person(); + person.setName(faker.name().name()); + person.setLastName(faker.name().lastName()); + person.setBirthDate(faker.date().birthday()); + //Publishing messages + client.invokeService(Verb.POST, daprRun.getAppName(), "persons", person).block(); + System.out.println("Invoke method persons with parameter : " + person); + } + + List persons = Arrays.asList(client.invokeService(Verb.GET, daprRun.getAppName(), "persons", null, Person[].class).block()); + assertEquals(10, persons.size()); + + client.invokeService(Verb.DELETE,daprRun.getAppName(),"persons/1",null).block(); + + persons = Arrays.asList(client.invokeService(Verb.GET, daprRun.getAppName(), "persons", null, Person[].class).block()); + assertEquals(9, persons.size()); + + Person person= new Person(); + person.setName("John"); + person.setLastName("Smith"); + person.setBirthDate(Calendar.getInstance().getTime()); + + client.invokeService(Verb.PUT, daprRun.getAppName(), "persons/2", person).block(); + + persons = Arrays.asList(client.invokeService(Verb.GET, daprRun.getAppName(), "persons", null, Person[].class).block()); + Person resultPerson= persons.get(1); + assertEquals("John", resultPerson.getName()); + assertEquals("Smith", resultPerson.getLastName()); + + } + +} diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeService.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeService.java new file mode 100644 index 0000000000..f2dd6f6df4 --- /dev/null +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeService.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) Microsoft Corporation. + * Licensed under the MIT License. + */ + +package io.dapr.it.methodinvoke.http; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + + +/** + * Service for subscriber. + */ +@SpringBootApplication(scanBasePackages = {"io.dapr.it.methodinvoke.http"}) +public class MethodInvokeService { + + public static final String SUCCESS_MESSAGE = "dapr initialized. Status: Running. Init Elapsed"; + + public static void main(String[] args) { + int port = Integer.parseInt(args[0]); + + System.out.printf("Service starting on port %d ...\n", port); + + // Start Dapr's callback endpoint. + start(port); + } + + /** + * Starts Dapr's callback in a given port. + * + * @param port Port to listen to. + */ + private static void start(int port) { + SpringApplication app = new SpringApplication(MethodInvokeService.class); + app.run(String.format("--server.port=%d", port)); + } + +} \ No newline at end of file diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/Person.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/Person.java new file mode 100644 index 0000000000..4e9eec69d7 --- /dev/null +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/Person.java @@ -0,0 +1,53 @@ +package io.dapr.it.methodinvoke.http; + +import java.util.Date; + +public class Person { + + private int id; + private String name; + private String lastName; + private Date birthDate; + + @Override + public String toString() { + return "Person{" + + "id=" + id + + ", name='" + name + '\'' + + ", lastName='" + lastName + '\'' + + ", birthDate=" + birthDate + + '}'; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public Date getBirthDate() { + return birthDate; + } + + public void setBirthDate(Date birthDate) { + this.birthDate = birthDate; + } +} From f7fdd9b61dcd495423472cdc49b356c4484b4c16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Jos=C3=A9=20Herrera=20de=20la=20Garza?= Date: Mon, 3 Feb 2020 17:06:26 -0600 Subject: [PATCH 3/4] Remove javafaker dependncy --- sdk-tests/pom.xml | 6 ------ .../http/MethodInvokeController.java | 4 ---- .../it/methodinvoke/http/MethodInvokeIT.java | 20 ++++--------------- 3 files changed, 4 insertions(+), 26 deletions(-) diff --git a/sdk-tests/pom.xml b/sdk-tests/pom.xml index 7ddb197ba5..f839656640 100644 --- a/sdk-tests/pom.xml +++ b/sdk-tests/pom.xml @@ -65,12 +65,6 @@ 2.2.2.RELEASE test - - com.github.javafaker - javafaker - 0.15 - test - diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java index 9379b5ad98..8f1a676ee5 100644 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeController.java @@ -37,9 +37,6 @@ public Map getMessages() { return messagesReceived; } - - - @PostMapping("/persons") public void postPerson(@RequestBody Person person){ System.out.println("Controller get person: " + person); @@ -72,5 +69,4 @@ public void deletePerson(@PathVariable Integer personId){ public List getPersons() { return persons; } - } diff --git a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java index 0535a429c1..67ab3d16ca 100644 --- a/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java +++ b/sdk-tests/src/test/java/io/dapr/it/methodinvoke/http/MethodInvokeIT.java @@ -1,6 +1,5 @@ package io.dapr.it.methodinvoke.http; -import com.github.javafaker.Faker; import io.dapr.client.DaprClient; import io.dapr.client.DaprClientBuilder; import io.dapr.client.domain.Verb; @@ -9,10 +8,7 @@ import org.junit.BeforeClass; import org.junit.Test; -import java.util.Arrays; -import java.util.Calendar; -import java.util.List; -import java.util.Map; +import java.util.*; import static org.junit.Assert.assertEquals; @@ -61,21 +57,15 @@ public void testInvoke() { } - @Test public void testInvokeWithObjects() { - - // At this point, it is guaranteed that the service above is running and all ports being listened to. - DaprClient client = new DaprClientBuilder().build(); - Faker faker = new Faker(); - for (int i = 0; i < NUM_MESSAGES; i++) { Person person= new Person(); - person.setName(faker.name().name()); - person.setLastName(faker.name().lastName()); - person.setBirthDate(faker.date().birthday()); + person.setName(String.format("Name %d", i)); + person.setLastName(String.format("Last Name %d", i)); + person.setBirthDate(new Date()); //Publishing messages client.invokeService(Verb.POST, daprRun.getAppName(), "persons", person).block(); System.out.println("Invoke method persons with parameter : " + person); @@ -100,7 +90,5 @@ public void testInvokeWithObjects() { Person resultPerson= persons.get(1); assertEquals("John", resultPerson.getName()); assertEquals("Smith", resultPerson.getLastName()); - } - } From 82e692749b7a3e11eb1abcf022cec238e880aee3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Jos=C3=A9=20Herrera=20de=20la=20Garza?= Date: Tue, 4 Feb 2020 20:29:39 -0600 Subject: [PATCH 4/4] Get Proto files from the DAPR repository. --- .gitignore | 2 + pom.xml | 2 + proto/dapr/dapr.proto | 106 ------------------------------ proto/daprclient/daprclient.proto | 76 --------------------- sdk-autogen/pom.xml | 35 ++++++++++ 5 files changed, 39 insertions(+), 182 deletions(-) delete mode 100644 proto/dapr/dapr.proto delete mode 100644 proto/daprclient/daprclient.proto diff --git a/.gitignore b/.gitignore index 323dad2409..474c650f34 100644 --- a/.gitignore +++ b/.gitignore @@ -41,3 +41,5 @@ hs_err_pid* # Some other generated folders/files **/components/redis.yaml **/components/redis_messagebus.yaml +/proto/dapr +/proto/daprclient diff --git a/pom.xml b/pom.xml index fba7e3506b..eeae23bf6b 100644 --- a/pom.xml +++ b/pom.xml @@ -17,6 +17,8 @@ 1.25.0 3.11.0 3.10.0 + https://raw.githubusercontent.com/dapr/dapr/master/pkg/proto/dapr/dapr.proto + https://raw.githubusercontent.com/dapr/dapr/master/pkg/proto/daprclient/daprclient.proto 1.6.2 3.1.1 1.8 diff --git a/proto/dapr/dapr.proto b/proto/dapr/dapr.proto deleted file mode 100644 index b87d0f4fc9..0000000000 --- a/proto/dapr/dapr.proto +++ /dev/null @@ -1,106 +0,0 @@ -syntax = "proto3"; - -package dapr; - -import "google/protobuf/any.proto"; -import "google/protobuf/empty.proto"; -import "google/protobuf/duration.proto"; - -option java_outer_classname = "DaprProtos"; -option java_package = "io.dapr"; - -option csharp_namespace = "Dapr.Client.Grpc"; - - -// Dapr definitions -service Dapr { - rpc PublishEvent(PublishEventEnvelope) returns (google.protobuf.Empty) {} - rpc InvokeService(InvokeServiceEnvelope) returns (InvokeServiceResponseEnvelope) {} - rpc InvokeBinding(InvokeBindingEnvelope) returns (google.protobuf.Empty) {} - rpc GetState(GetStateEnvelope) returns (GetStateResponseEnvelope) {} - rpc SaveState(SaveStateEnvelope) returns (google.protobuf.Empty) {} - rpc DeleteState(DeleteStateEnvelope) returns (google.protobuf.Empty) {} -} - -message InvokeServiceResponseEnvelope { - google.protobuf.Any data = 1; - map metadata = 2; -} - -message DeleteStateEnvelope { - string key = 1; - string etag = 2; - StateOptions options = 3; -} - -message SaveStateEnvelope { - repeated StateRequest requests = 1; -} - -message GetStateEnvelope { - string key = 1; - string consistency = 2; -} - -message GetStateResponseEnvelope { - google.protobuf.Any data = 1; - string etag = 2; -} - -message InvokeBindingEnvelope { - string name = 1; - google.protobuf.Any data = 2; - map metadata = 3; -} - -message InvokeServiceEnvelope { - string id = 1; - string method = 2; - google.protobuf.Any data = 3; - map metadata = 4; -} - -message PublishEventEnvelope { - string topic = 1; - google.protobuf.Any data = 2; -} - -message State { - string key = 1; - google.protobuf.Any value = 2; - string etag = 3; - map metadata = 4; - StateOptions options = 5; -} - -message StateOptions { - string concurrency = 1; - string consistency = 2; - RetryPolicy retryPolicy = 3; -} - -message RetryPolicy { - int32 threshold = 1; - string pattern = 2; - google.protobuf.Duration interval = 3; -} - -message StateRequest { - string key = 1; - google.protobuf.Any value = 2; - string etag = 3; - map metadata = 4; - StateRequestOptions options = 5; -} - -message StateRequestOptions { - string concurrency = 1; - string consistency = 2; - StateRetryPolicy retryPolicy = 3; -} - -message StateRetryPolicy { - int32 threshold = 1; - string pattern = 2; - google.protobuf.Duration interval = 3; -} diff --git a/proto/daprclient/daprclient.proto b/proto/daprclient/daprclient.proto deleted file mode 100644 index a383ba16c5..0000000000 --- a/proto/daprclient/daprclient.proto +++ /dev/null @@ -1,76 +0,0 @@ -syntax = "proto3"; - -package daprclient; - -import "google/protobuf/any.proto"; -import "google/protobuf/empty.proto"; -import "google/protobuf/duration.proto"; - -option java_outer_classname = "DaprClientProtos"; -option java_package = "io.dapr"; - -// User Code definitions -service DaprClient { - rpc OnInvoke (InvokeEnvelope) returns (google.protobuf.Any) {} - rpc GetTopicSubscriptions(google.protobuf.Empty) returns (GetTopicSubscriptionsEnvelope) {} - rpc GetBindingsSubscriptions(google.protobuf.Empty) returns (GetBindingsSubscriptionsEnvelope) {} - rpc OnBindingEvent(BindingEventEnvelope) returns (BindingResponseEnvelope) {} - rpc OnTopicEvent(CloudEventEnvelope) returns (google.protobuf.Empty) {} -} - -message CloudEventEnvelope { - string id = 1; - string source = 2; - string type = 3; - string specVersion = 4; - string dataContentType = 5; - string topic = 6; - google.protobuf.Any data = 7; -} - -message BindingEventEnvelope { - string name = 1; - google.protobuf.Any data = 2; - map metadata = 3; -} - -message BindingResponseEnvelope { - google.protobuf.Any data = 1; - repeated string to = 2; - repeated State state = 3; - string concurrency = 4; -} - -message InvokeEnvelope { - string method = 1; - google.protobuf.Any data = 2; - map metadata = 3; -} - -message GetTopicSubscriptionsEnvelope { - repeated string topics = 1; -} - -message GetBindingsSubscriptionsEnvelope { - repeated string bindings = 1; -} - -message State { - string key = 1; - google.protobuf.Any value = 2; - string etag = 3; - map metadata = 4; - StateOptions options = 5; -} - -message StateOptions { - string concurrency = 1; - string consistency = 2; - RetryPolicy retryPolicy = 3; -} - -message RetryPolicy { - int32 threshold = 1; - string pattern = 2; - google.protobuf.Duration interval = 3; -} diff --git a/sdk-autogen/pom.xml b/sdk-autogen/pom.xml index 6d9bfe4355..56fbf91f2a 100644 --- a/sdk-autogen/pom.xml +++ b/sdk-autogen/pom.xml @@ -56,6 +56,41 @@ + + com.googlecode.maven-download-plugin + download-maven-plugin + 1.3.0 + + + getDaprProto + + initialize + + wget + + + ${dapr.proto.url} + dapr.proto + + ${protobuf.input.directory}/dapr + + + + getDaprClientProto + + initialize + + wget + + + ${dapr.client.proto.url} + daprclient.proto + + ${protobuf.input.directory}/daprclient + + + + com.github.os72 protoc-jar-maven-plugin