diff --git a/README.md b/README.md index 2186dde3b..d3a3db4a3 100644 --- a/README.md +++ b/README.md @@ -42,14 +42,27 @@ The A2A Java SDK provides a [reference A2A server implementation](reference-impl [Server Integrations](#server-integrations) contains a list of community contributed integrations of the server with various runtimes. You might be able to use one of these for your target runtime, or you can use them as inspiration to create your own. -To use the reference implementation add the following dependency to your project: +To use the reference implementation with the JSONRPC protocol add the following dependency to your project: > *⚠️ The `io.github.a2asdk` `groupId` below is temporary and will likely change for future releases.* ```xml io.github.a2asdk - a2a-java-reference-server + a2a-java-sdk-reference-jsonrpc + + ${io.a2a.sdk.version} + +``` + +To use the reference implementation with the gRPC protocol add the following dependency to your project: + +> *⚠️ The `io.github.a2asdk` `groupId` below is temporary and will likely change for future releases.* + +```xml + + io.github.a2asdk + a2a-java-sdk-reference-grpc ${io.a2a.sdk.version} diff --git a/client/pom.xml b/client/pom.xml index d593b54ef..0a71440b4 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -24,12 +24,12 @@ ${project.groupId} - a2a-java-sdk-grpc + a2a-java-sdk-spec ${project.version} ${project.groupId} - a2a-java-sdk-spec + a2a-java-sdk-spec-grpc ${project.version} diff --git a/examples/helloworld/pom.xml b/examples/helloworld/pom.xml index 7900d3cef..d026edb21 100644 --- a/examples/helloworld/pom.xml +++ b/examples/helloworld/pom.xml @@ -33,7 +33,7 @@ io.github.a2asdk - a2a-java-reference-server + a2a-java-sdk-reference-jsonrpc ${project.version} diff --git a/examples/helloworld/server/pom.xml b/examples/helloworld/server/pom.xml index ee7c5324b..3a051dbab 100644 --- a/examples/helloworld/server/pom.xml +++ b/examples/helloworld/server/pom.xml @@ -18,7 +18,7 @@ io.github.a2asdk - a2a-java-reference-server + a2a-java-sdk-reference-jsonrpc io.quarkus diff --git a/pom.xml b/pom.xml index 95898110e..f95d6c094 100644 --- a/pom.xml +++ b/pom.xml @@ -276,16 +276,19 @@ - sdk-server-common + client common - grpc + examples/helloworld + reference/common + reference/grpc + reference/jsonrpc + server-common spec - client - reference-grpc - reference-impl + spec-grpc tck - examples/helloworld tests/server-common + transport/jsonrpc + transport/grpc diff --git a/reference-grpc/src/main/resources/application.properties b/reference-grpc/src/main/resources/application.properties deleted file mode 100644 index f8286bd6f..000000000 --- a/reference-grpc/src/main/resources/application.properties +++ /dev/null @@ -1,5 +0,0 @@ -quarkus.grpc.clients.a2-a-service.host=localhost -quarkus.grpc.clients.a2-a-service.port=9001 - -# The GrpcHandler @ApplicationScoped annotation is not compatible with Quarkus -quarkus.arc.exclude-types=io.a2a.server.requesthandlers.GrpcHandler \ No newline at end of file diff --git a/reference-impl/pom.xml b/reference/common/pom.xml similarity index 86% rename from reference-impl/pom.xml rename to reference/common/pom.xml index b128aa3f0..84f4ff74c 100644 --- a/reference-impl/pom.xml +++ b/reference/common/pom.xml @@ -8,20 +8,16 @@ io.github.a2asdk a2a-java-sdk-parent 0.2.6.Beta1-SNAPSHOT + ../../pom.xml - a2a-java-reference-server + a2a-java-sdk-reference-common jar - Java A2A Reference Server - Java SDK for the Agent2Agent Protocol (A2A) - A2A Reference Server (based on Quarkus) + Java A2A Reference Server: Common + Java SDK for the Agent2Agent Protocol (A2A) - Common classes for A2A Reference Servers (based on Quarkus) - - ${project.groupId} - a2a-java-sdk-spec - ${project.version} - ${project.groupId} a2a-java-sdk-server-common diff --git a/reference-impl/src/main/java/io/a2a/server/apps/quarkus/DefaultProducers.java b/reference/common/src/main/java/io/a2a/server/common/quarkus/DefaultProducers.java similarity index 83% rename from reference-impl/src/main/java/io/a2a/server/apps/quarkus/DefaultProducers.java rename to reference/common/src/main/java/io/a2a/server/common/quarkus/DefaultProducers.java index 2264355ac..95227c008 100644 --- a/reference-impl/src/main/java/io/a2a/server/apps/quarkus/DefaultProducers.java +++ b/reference/common/src/main/java/io/a2a/server/common/quarkus/DefaultProducers.java @@ -1,7 +1,4 @@ -package io.a2a.server.apps.quarkus; - -import java.util.ArrayList; -import java.util.Collections; +package io.a2a.server.common.quarkus; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Default; @@ -9,11 +6,7 @@ import io.a2a.server.PublicAgentCard; import io.a2a.server.agentexecution.AgentExecutor; -import io.a2a.server.agentexecution.RequestContext; -import io.a2a.server.events.EventQueue; -import io.a2a.spec.AgentCapabilities; import io.a2a.spec.AgentCard; -import io.a2a.spec.JSONRPCError; import io.quarkus.arc.DefaultBean; /** diff --git a/reference-impl/src/main/resources/META-INF/beans.xml b/reference/common/src/main/resources/META-INF/beans.xml similarity index 100% rename from reference-impl/src/main/resources/META-INF/beans.xml rename to reference/common/src/main/resources/META-INF/beans.xml diff --git a/reference-grpc/pom.xml b/reference/grpc/pom.xml similarity index 86% rename from reference-grpc/pom.xml rename to reference/grpc/pom.xml index d80dae49f..2f2d7edd6 100644 --- a/reference-grpc/pom.xml +++ b/reference/grpc/pom.xml @@ -7,17 +7,22 @@ io.github.a2asdk a2a-java-sdk-parent 0.2.6.Beta1-SNAPSHOT - ../pom.xml + ../../pom.xml - reference-grpc - Java A2A gRPC Reference Server + a2a-java-sdk-reference-grpc + Java A2A Reference Server: gRPC Java SDK for the Agent2Agent Protocol (A2A) - A2A gRPC Reference Server (based on Quarkus) ${project.groupId} - a2a-java-sdk-grpc + a2a-java-sdk-reference-common + ${project.version} + + + ${project.groupId} + a2a-java-sdk-transport-grpc ${project.version} diff --git a/reference-grpc/src/main/java/io/a2a/server/grpc/quarkus/QuarkusGrpcHandler.java b/reference/grpc/src/main/java/io/a2a/server/grpc/quarkus/QuarkusGrpcHandler.java similarity index 55% rename from reference-grpc/src/main/java/io/a2a/server/grpc/quarkus/QuarkusGrpcHandler.java rename to reference/grpc/src/main/java/io/a2a/server/grpc/quarkus/QuarkusGrpcHandler.java index 05207321b..40abbc95c 100644 --- a/reference-grpc/src/main/java/io/a2a/server/grpc/quarkus/QuarkusGrpcHandler.java +++ b/reference/grpc/src/main/java/io/a2a/server/grpc/quarkus/QuarkusGrpcHandler.java @@ -1,20 +1,11 @@ package io.a2a.server.grpc.quarkus; -import jakarta.enterprise.inject.Instance; import jakarta.inject.Inject; -import io.a2a.grpc.SendMessageRequest; -import io.a2a.grpc.SendMessageResponse; -import io.a2a.grpc.StreamResponse; -import io.a2a.grpc.Task; -import io.a2a.grpc.TaskState; -import io.a2a.grpc.TaskStatus; -import io.a2a.grpc.TaskStatusUpdateEvent; import io.a2a.server.PublicAgentCard; -import io.a2a.server.requesthandlers.GrpcHandler; +import io.a2a.grpc.handler.GrpcHandler; import io.a2a.server.requesthandlers.RequestHandler; import io.a2a.spec.AgentCard; -import io.grpc.stub.StreamObserver; import io.quarkus.grpc.GrpcService; @GrpcService diff --git a/reference-grpc/src/test/java/io/a2a/server/grpc/quarkus/A2ATestResource.java b/reference/grpc/src/test/java/io/a2a/server/grpc/quarkus/A2ATestResource.java similarity index 98% rename from reference-grpc/src/test/java/io/a2a/server/grpc/quarkus/A2ATestResource.java rename to reference/grpc/src/test/java/io/a2a/server/grpc/quarkus/A2ATestResource.java index 917606e42..25758da9c 100644 --- a/reference-grpc/src/test/java/io/a2a/server/grpc/quarkus/A2ATestResource.java +++ b/reference/grpc/src/test/java/io/a2a/server/grpc/quarkus/A2ATestResource.java @@ -19,7 +19,7 @@ import jakarta.ws.rs.core.Response; import io.a2a.server.apps.common.TestUtilsBean; -import io.a2a.server.requesthandlers.GrpcHandler; +import io.a2a.grpc.handler.GrpcHandler; import io.a2a.spec.PushNotificationConfig; import io.a2a.spec.Task; import io.a2a.spec.TaskArtifactUpdateEvent; diff --git a/reference-grpc/src/test/java/io/a2a/server/grpc/quarkus/QuarkusA2AGrpcTest.java b/reference/grpc/src/test/java/io/a2a/server/grpc/quarkus/QuarkusA2AGrpcTest.java similarity index 99% rename from reference-grpc/src/test/java/io/a2a/server/grpc/quarkus/QuarkusA2AGrpcTest.java rename to reference/grpc/src/test/java/io/a2a/server/grpc/quarkus/QuarkusA2AGrpcTest.java index 076d9a29b..30fb9c71c 100644 --- a/reference-grpc/src/test/java/io/a2a/server/grpc/quarkus/QuarkusA2AGrpcTest.java +++ b/reference/grpc/src/test/java/io/a2a/server/grpc/quarkus/QuarkusA2AGrpcTest.java @@ -88,7 +88,7 @@ public class QuarkusA2AGrpcTest { .build(); public static final String APPLICATION_JSON = "application/json"; - @GrpcClient("a2-a-service") + @GrpcClient("a2a-service") A2AServiceGrpc.A2AServiceBlockingStub client; private final int serverPort = 8081; diff --git a/reference/grpc/src/test/resources/application.properties b/reference/grpc/src/test/resources/application.properties new file mode 100644 index 000000000..840386426 --- /dev/null +++ b/reference/grpc/src/test/resources/application.properties @@ -0,0 +1,5 @@ +quarkus.grpc.clients.a2a-service.host=localhost +quarkus.grpc.clients.a2a-service.port=9001 + +# The GrpcHandler @ApplicationScoped annotation is not compatible with Quarkus +quarkus.arc.exclude-types=io.a2a.grpc.handler.GrpcHandler \ No newline at end of file diff --git a/reference-impl/README.md b/reference/jsonrpc/README.md similarity index 100% rename from reference-impl/README.md rename to reference/jsonrpc/README.md diff --git a/reference/jsonrpc/pom.xml b/reference/jsonrpc/pom.xml new file mode 100644 index 000000000..3f0116ce2 --- /dev/null +++ b/reference/jsonrpc/pom.xml @@ -0,0 +1,86 @@ + + + 4.0.0 + + + io.github.a2asdk + a2a-java-sdk-parent + 0.2.6.Beta1-SNAPSHOT + ../../pom.xml + + a2a-java-sdk-reference-jsonrpc + + jar + + Java A2A Reference Server: JSONRPC + Java SDK for the Agent2Agent Protocol (A2A) - A2A JSONRPC Reference Server (based on Quarkus) + + + + ${project.groupId} + a2a-java-sdk-reference-common + ${project.version} + + + ${project.groupId} + a2a-java-sdk-transport-jsonrpc + ${project.version} + + + ${project.groupId} + a2a-java-sdk-server-common + ${project.version} + + + ${project.groupId} + a2a-java-sdk-tests-server-common + ${project.version} + provided + + + ${project.groupId} + a2a-java-sdk-tests-server-common + test-jar + test + ${project.version} + + + io.quarkus + quarkus-reactive-routes + + + jakarta.enterprise + jakarta.enterprise.cdi-api + + + jakarta.inject + jakarta.inject-api + + + org.slf4j + slf4j-api + + + io.quarkus + quarkus-junit5 + test + + + io.quarkus + quarkus-rest-client-jackson + test + + + org.junit.jupiter + junit-jupiter-api + test + + + io.rest-assured + rest-assured + test + + + \ No newline at end of file diff --git a/reference-impl/src/main/java/io/a2a/server/apps/quarkus/A2AServerRoutes.java b/reference/jsonrpc/src/main/java/io/a2a/server/apps/quarkus/A2AServerRoutes.java similarity index 99% rename from reference-impl/src/main/java/io/a2a/server/apps/quarkus/A2AServerRoutes.java rename to reference/jsonrpc/src/main/java/io/a2a/server/apps/quarkus/A2AServerRoutes.java index 988736c91..3ebf22ccd 100644 --- a/reference-impl/src/main/java/io/a2a/server/apps/quarkus/A2AServerRoutes.java +++ b/reference/jsonrpc/src/main/java/io/a2a/server/apps/quarkus/A2AServerRoutes.java @@ -20,11 +20,11 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.io.JsonEOFException; import com.fasterxml.jackson.databind.JsonNode; +import io.a2a.jsonrpc.handler.JSONRPCHandler; import io.a2a.server.ExtendedAgentCard; import io.a2a.server.ServerCallContext; import io.a2a.server.auth.UnauthenticatedUser; import io.a2a.server.auth.User; -import io.a2a.server.requesthandlers.JSONRPCHandler; import io.a2a.server.util.async.Internal; import io.a2a.spec.AgentCard; import io.a2a.spec.CancelTaskRequest; diff --git a/reference-impl/src/main/java/io/a2a/server/apps/quarkus/CallContextFactory.java b/reference/jsonrpc/src/main/java/io/a2a/server/apps/quarkus/CallContextFactory.java similarity index 100% rename from reference-impl/src/main/java/io/a2a/server/apps/quarkus/CallContextFactory.java rename to reference/jsonrpc/src/main/java/io/a2a/server/apps/quarkus/CallContextFactory.java diff --git a/reference/jsonrpc/src/main/resources/META-INF/beans.xml b/reference/jsonrpc/src/main/resources/META-INF/beans.xml new file mode 100644 index 000000000..e69de29bb diff --git a/reference-impl/src/test/java/io/a2a/server/apps/quarkus/A2ATestRoutes.java b/reference/jsonrpc/src/test/java/io/a2a/server/apps/quarkus/A2ATestRoutes.java similarity index 100% rename from reference-impl/src/test/java/io/a2a/server/apps/quarkus/A2ATestRoutes.java rename to reference/jsonrpc/src/test/java/io/a2a/server/apps/quarkus/A2ATestRoutes.java diff --git a/reference-impl/src/test/java/io/a2a/server/apps/quarkus/QuarkusA2AServerTest.java b/reference/jsonrpc/src/test/java/io/a2a/server/apps/quarkus/QuarkusA2AJSONRPCTest.java similarity index 63% rename from reference-impl/src/test/java/io/a2a/server/apps/quarkus/QuarkusA2AServerTest.java rename to reference/jsonrpc/src/test/java/io/a2a/server/apps/quarkus/QuarkusA2AJSONRPCTest.java index f9ed48643..f1442da33 100644 --- a/reference-impl/src/test/java/io/a2a/server/apps/quarkus/QuarkusA2AServerTest.java +++ b/reference/jsonrpc/src/test/java/io/a2a/server/apps/quarkus/QuarkusA2AJSONRPCTest.java @@ -4,9 +4,9 @@ import io.quarkus.test.junit.QuarkusTest; @QuarkusTest -public class QuarkusA2AServerTest extends AbstractA2AServerTest { +public class QuarkusA2AJSONRPCTest extends AbstractA2AServerTest { - public QuarkusA2AServerTest() { + public QuarkusA2AJSONRPCTest() { super(8081); } } diff --git a/reference-impl/src/test/resources/application.properties b/reference/jsonrpc/src/test/resources/application.properties similarity index 100% rename from reference-impl/src/test/resources/application.properties rename to reference/jsonrpc/src/test/resources/application.properties diff --git a/sdk-server-common/pom.xml b/server-common/pom.xml similarity index 86% rename from sdk-server-common/pom.xml rename to server-common/pom.xml index a0ed10cca..caf58b2d1 100644 --- a/sdk-server-common/pom.xml +++ b/server-common/pom.xml @@ -27,11 +27,6 @@ a2a-java-sdk-client ${project.version} - - ${project.groupId} - a2a-java-sdk-grpc - ${project.version} - com.fasterxml.jackson.core jackson-databind @@ -89,21 +84,26 @@ mockito-core test - - org.mock-server - mockserver-netty - test - ch.qos.logback logback-classic test - - io.grpc - grpc-testing - test - - \ No newline at end of file + + + + org.apache.maven.plugins + maven-jar-plugin + + + + test-jar + + + + + + + diff --git a/sdk-server-common/src/main/java/io/a2a/server/ExtendedAgentCard.java b/server-common/src/main/java/io/a2a/server/ExtendedAgentCard.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/ExtendedAgentCard.java rename to server-common/src/main/java/io/a2a/server/ExtendedAgentCard.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/JSONRPCException.java b/server-common/src/main/java/io/a2a/server/JSONRPCException.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/JSONRPCException.java rename to server-common/src/main/java/io/a2a/server/JSONRPCException.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/PublicAgentCard.java b/server-common/src/main/java/io/a2a/server/PublicAgentCard.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/PublicAgentCard.java rename to server-common/src/main/java/io/a2a/server/PublicAgentCard.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/ServerCallContext.java b/server-common/src/main/java/io/a2a/server/ServerCallContext.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/ServerCallContext.java rename to server-common/src/main/java/io/a2a/server/ServerCallContext.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/agentexecution/AgentExecutor.java b/server-common/src/main/java/io/a2a/server/agentexecution/AgentExecutor.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/agentexecution/AgentExecutor.java rename to server-common/src/main/java/io/a2a/server/agentexecution/AgentExecutor.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/agentexecution/RequestContext.java b/server-common/src/main/java/io/a2a/server/agentexecution/RequestContext.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/agentexecution/RequestContext.java rename to server-common/src/main/java/io/a2a/server/agentexecution/RequestContext.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/agentexecution/SimpleRequestContextBuilder.java b/server-common/src/main/java/io/a2a/server/agentexecution/SimpleRequestContextBuilder.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/agentexecution/SimpleRequestContextBuilder.java rename to server-common/src/main/java/io/a2a/server/agentexecution/SimpleRequestContextBuilder.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/auth/UnauthenticatedUser.java b/server-common/src/main/java/io/a2a/server/auth/UnauthenticatedUser.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/auth/UnauthenticatedUser.java rename to server-common/src/main/java/io/a2a/server/auth/UnauthenticatedUser.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/auth/User.java b/server-common/src/main/java/io/a2a/server/auth/User.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/auth/User.java rename to server-common/src/main/java/io/a2a/server/auth/User.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/events/EnhancedRunnable.java b/server-common/src/main/java/io/a2a/server/events/EnhancedRunnable.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/events/EnhancedRunnable.java rename to server-common/src/main/java/io/a2a/server/events/EnhancedRunnable.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/events/EventConsumer.java b/server-common/src/main/java/io/a2a/server/events/EventConsumer.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/events/EventConsumer.java rename to server-common/src/main/java/io/a2a/server/events/EventConsumer.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/events/EventQueue.java b/server-common/src/main/java/io/a2a/server/events/EventQueue.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/events/EventQueue.java rename to server-common/src/main/java/io/a2a/server/events/EventQueue.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/events/EventQueueClosedException.java b/server-common/src/main/java/io/a2a/server/events/EventQueueClosedException.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/events/EventQueueClosedException.java rename to server-common/src/main/java/io/a2a/server/events/EventQueueClosedException.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/events/InMemoryQueueManager.java b/server-common/src/main/java/io/a2a/server/events/InMemoryQueueManager.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/events/InMemoryQueueManager.java rename to server-common/src/main/java/io/a2a/server/events/InMemoryQueueManager.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/events/NoTaskQueueException.java b/server-common/src/main/java/io/a2a/server/events/NoTaskQueueException.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/events/NoTaskQueueException.java rename to server-common/src/main/java/io/a2a/server/events/NoTaskQueueException.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/events/QueueManager.java b/server-common/src/main/java/io/a2a/server/events/QueueManager.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/events/QueueManager.java rename to server-common/src/main/java/io/a2a/server/events/QueueManager.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/events/TaskQueueExistsException.java b/server-common/src/main/java/io/a2a/server/events/TaskQueueExistsException.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/events/TaskQueueExistsException.java rename to server-common/src/main/java/io/a2a/server/events/TaskQueueExistsException.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/requesthandlers/CallContextFactory.java b/server-common/src/main/java/io/a2a/server/requesthandlers/CallContextFactory.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/requesthandlers/CallContextFactory.java rename to server-common/src/main/java/io/a2a/server/requesthandlers/CallContextFactory.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/requesthandlers/DefaultRequestHandler.java b/server-common/src/main/java/io/a2a/server/requesthandlers/DefaultRequestHandler.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/requesthandlers/DefaultRequestHandler.java rename to server-common/src/main/java/io/a2a/server/requesthandlers/DefaultRequestHandler.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/requesthandlers/RequestHandler.java b/server-common/src/main/java/io/a2a/server/requesthandlers/RequestHandler.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/requesthandlers/RequestHandler.java rename to server-common/src/main/java/io/a2a/server/requesthandlers/RequestHandler.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/tasks/BasePushNotificationSender.java b/server-common/src/main/java/io/a2a/server/tasks/BasePushNotificationSender.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/tasks/BasePushNotificationSender.java rename to server-common/src/main/java/io/a2a/server/tasks/BasePushNotificationSender.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/tasks/InMemoryPushNotificationConfigStore.java b/server-common/src/main/java/io/a2a/server/tasks/InMemoryPushNotificationConfigStore.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/tasks/InMemoryPushNotificationConfigStore.java rename to server-common/src/main/java/io/a2a/server/tasks/InMemoryPushNotificationConfigStore.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/tasks/InMemoryTaskStore.java b/server-common/src/main/java/io/a2a/server/tasks/InMemoryTaskStore.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/tasks/InMemoryTaskStore.java rename to server-common/src/main/java/io/a2a/server/tasks/InMemoryTaskStore.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/tasks/PushNotificationConfigStore.java b/server-common/src/main/java/io/a2a/server/tasks/PushNotificationConfigStore.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/tasks/PushNotificationConfigStore.java rename to server-common/src/main/java/io/a2a/server/tasks/PushNotificationConfigStore.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/tasks/PushNotificationSender.java b/server-common/src/main/java/io/a2a/server/tasks/PushNotificationSender.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/tasks/PushNotificationSender.java rename to server-common/src/main/java/io/a2a/server/tasks/PushNotificationSender.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/tasks/ResultAggregator.java b/server-common/src/main/java/io/a2a/server/tasks/ResultAggregator.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/tasks/ResultAggregator.java rename to server-common/src/main/java/io/a2a/server/tasks/ResultAggregator.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/tasks/TaskManager.java b/server-common/src/main/java/io/a2a/server/tasks/TaskManager.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/tasks/TaskManager.java rename to server-common/src/main/java/io/a2a/server/tasks/TaskManager.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/tasks/TaskStore.java b/server-common/src/main/java/io/a2a/server/tasks/TaskStore.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/tasks/TaskStore.java rename to server-common/src/main/java/io/a2a/server/tasks/TaskStore.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/tasks/TaskUpdater.java b/server-common/src/main/java/io/a2a/server/tasks/TaskUpdater.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/tasks/TaskUpdater.java rename to server-common/src/main/java/io/a2a/server/tasks/TaskUpdater.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/util/async/AsyncExecutorProducer.java b/server-common/src/main/java/io/a2a/server/util/async/AsyncExecutorProducer.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/util/async/AsyncExecutorProducer.java rename to server-common/src/main/java/io/a2a/server/util/async/AsyncExecutorProducer.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/util/async/AsyncUtils.java b/server-common/src/main/java/io/a2a/server/util/async/AsyncUtils.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/util/async/AsyncUtils.java rename to server-common/src/main/java/io/a2a/server/util/async/AsyncUtils.java diff --git a/sdk-server-common/src/main/java/io/a2a/server/util/async/Internal.java b/server-common/src/main/java/io/a2a/server/util/async/Internal.java similarity index 100% rename from sdk-server-common/src/main/java/io/a2a/server/util/async/Internal.java rename to server-common/src/main/java/io/a2a/server/util/async/Internal.java diff --git a/sdk-server-common/src/main/resources/META-INF/beans.xml b/server-common/src/main/resources/META-INF/beans.xml similarity index 100% rename from sdk-server-common/src/main/resources/META-INF/beans.xml rename to server-common/src/main/resources/META-INF/beans.xml diff --git a/sdk-server-common/src/test/java/io/a2a/server/agentexecution/RequestContextTest.java b/server-common/src/test/java/io/a2a/server/agentexecution/RequestContextTest.java similarity index 100% rename from sdk-server-common/src/test/java/io/a2a/server/agentexecution/RequestContextTest.java rename to server-common/src/test/java/io/a2a/server/agentexecution/RequestContextTest.java diff --git a/sdk-server-common/src/test/java/io/a2a/server/events/EventConsumerTest.java b/server-common/src/test/java/io/a2a/server/events/EventConsumerTest.java similarity index 100% rename from sdk-server-common/src/test/java/io/a2a/server/events/EventConsumerTest.java rename to server-common/src/test/java/io/a2a/server/events/EventConsumerTest.java diff --git a/sdk-server-common/src/test/java/io/a2a/server/events/EventQueueTest.java b/server-common/src/test/java/io/a2a/server/events/EventQueueTest.java similarity index 100% rename from sdk-server-common/src/test/java/io/a2a/server/events/EventQueueTest.java rename to server-common/src/test/java/io/a2a/server/events/EventQueueTest.java diff --git a/sdk-server-common/src/test/java/io/a2a/server/requesthandlers/AbstractA2ARequestHandlerTest.java b/server-common/src/test/java/io/a2a/server/requesthandlers/AbstractA2ARequestHandlerTest.java similarity index 91% rename from sdk-server-common/src/test/java/io/a2a/server/requesthandlers/AbstractA2ARequestHandlerTest.java rename to server-common/src/test/java/io/a2a/server/requesthandlers/AbstractA2ARequestHandlerTest.java index a8cf3fcf0..7232d1a0c 100644 --- a/sdk-server-common/src/test/java/io/a2a/server/requesthandlers/AbstractA2ARequestHandlerTest.java +++ b/server-common/src/test/java/io/a2a/server/requesthandlers/AbstractA2ARequestHandlerTest.java @@ -54,15 +54,15 @@ public class AbstractA2ARequestHandlerTest { .parts(new TextPart("test message")) .build(); - AgentExecutor executor; - TaskStore taskStore; - RequestHandler requestHandler; - AgentExecutorMethod agentExecutorExecute; - AgentExecutorMethod agentExecutorCancel; - InMemoryQueueManager queueManager; - TestHttpClient httpClient; + protected AgentExecutor executor; + protected TaskStore taskStore; + protected RequestHandler requestHandler; + protected AgentExecutorMethod agentExecutorExecute; + protected AgentExecutorMethod agentExecutorCancel; + protected InMemoryQueueManager queueManager; + protected TestHttpClient httpClient; - final Executor internalExecutor = Executors.newCachedThreadPool(); + protected final Executor internalExecutor = Executors.newCachedThreadPool(); @BeforeEach public void init() { @@ -123,8 +123,8 @@ protected interface AgentExecutorMethod { @Dependent @IfBuildProfile("test") protected static class TestHttpClient implements A2AHttpClient { - final List tasks = Collections.synchronizedList(new ArrayList<>()); - volatile CountDownLatch latch; + public final List tasks = Collections.synchronizedList(new ArrayList<>()); + public volatile CountDownLatch latch; @Override public GetBuilder createGet() { @@ -183,6 +183,7 @@ public PostBuilder url(String s) { public PostBuilder addHeader(String name, String value) { return this; } + } } } diff --git a/sdk-server-common/src/test/java/io/a2a/server/tasks/InMemoryTaskStoreTest.java b/server-common/src/test/java/io/a2a/server/tasks/InMemoryTaskStoreTest.java similarity index 100% rename from sdk-server-common/src/test/java/io/a2a/server/tasks/InMemoryTaskStoreTest.java rename to server-common/src/test/java/io/a2a/server/tasks/InMemoryTaskStoreTest.java diff --git a/sdk-server-common/src/test/java/io/a2a/server/tasks/TaskManagerTest.java b/server-common/src/test/java/io/a2a/server/tasks/TaskManagerTest.java similarity index 100% rename from sdk-server-common/src/test/java/io/a2a/server/tasks/TaskManagerTest.java rename to server-common/src/test/java/io/a2a/server/tasks/TaskManagerTest.java diff --git a/sdk-server-common/src/test/java/io/a2a/server/tasks/TaskUpdaterTest.java b/server-common/src/test/java/io/a2a/server/tasks/TaskUpdaterTest.java similarity index 100% rename from sdk-server-common/src/test/java/io/a2a/server/tasks/TaskUpdaterTest.java rename to server-common/src/test/java/io/a2a/server/tasks/TaskUpdaterTest.java diff --git a/sdk-server-common/src/test/java/io/a2a/server/util/async/AsyncUtilsTest.java b/server-common/src/test/java/io/a2a/server/util/async/AsyncUtilsTest.java similarity index 100% rename from sdk-server-common/src/test/java/io/a2a/server/util/async/AsyncUtilsTest.java rename to server-common/src/test/java/io/a2a/server/util/async/AsyncUtilsTest.java diff --git a/sdk-server-common/src/test/resources/logback.xml b/server-common/src/test/resources/logback.xml similarity index 100% rename from sdk-server-common/src/test/resources/logback.xml rename to server-common/src/test/resources/logback.xml diff --git a/grpc/pom.xml b/spec-grpc/pom.xml similarity index 67% rename from grpc/pom.xml rename to spec-grpc/pom.xml index a8e7d634e..129be2d7c 100644 --- a/grpc/pom.xml +++ b/spec-grpc/pom.xml @@ -9,16 +9,16 @@ a2a-java-sdk-parent 0.2.6.Beta1-SNAPSHOT - a2a-java-sdk-grpc + a2a-java-sdk-spec-grpc jar - Java SDK A2A gRPC - Java SDK for the Agent2Agent Protocol (A2A) - gRPC + Java SDK A2A Spec: gRPC + Java SDK for the Agent2Agent Protocol (A2A) - Spec: gRPC - io.github.a2asdk + ${project.groupId} a2a-java-sdk-spec ${project.version} @@ -34,6 +34,14 @@ io.grpc grpc-stub + + jakarta.enterprise + jakarta.enterprise.cdi-api + + + jakarta.inject + jakarta.inject-api + diff --git a/grpc/src/main/java/io/a2a/grpc/A2A.java b/spec-grpc/src/main/java/io/a2a/grpc/A2A.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/A2A.java rename to spec-grpc/src/main/java/io/a2a/grpc/A2A.java diff --git a/grpc/src/main/java/io/a2a/grpc/A2AServiceGrpc.java b/spec-grpc/src/main/java/io/a2a/grpc/A2AServiceGrpc.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/A2AServiceGrpc.java rename to spec-grpc/src/main/java/io/a2a/grpc/A2AServiceGrpc.java diff --git a/grpc/src/main/java/io/a2a/grpc/APIKeySecurityScheme.java b/spec-grpc/src/main/java/io/a2a/grpc/APIKeySecurityScheme.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/APIKeySecurityScheme.java rename to spec-grpc/src/main/java/io/a2a/grpc/APIKeySecurityScheme.java diff --git a/grpc/src/main/java/io/a2a/grpc/APIKeySecuritySchemeOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/APIKeySecuritySchemeOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/APIKeySecuritySchemeOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/APIKeySecuritySchemeOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/AgentCapabilities.java b/spec-grpc/src/main/java/io/a2a/grpc/AgentCapabilities.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/AgentCapabilities.java rename to spec-grpc/src/main/java/io/a2a/grpc/AgentCapabilities.java diff --git a/grpc/src/main/java/io/a2a/grpc/AgentCapabilitiesOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/AgentCapabilitiesOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/AgentCapabilitiesOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/AgentCapabilitiesOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/AgentCard.java b/spec-grpc/src/main/java/io/a2a/grpc/AgentCard.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/AgentCard.java rename to spec-grpc/src/main/java/io/a2a/grpc/AgentCard.java diff --git a/grpc/src/main/java/io/a2a/grpc/AgentCardOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/AgentCardOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/AgentCardOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/AgentCardOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/AgentExtension.java b/spec-grpc/src/main/java/io/a2a/grpc/AgentExtension.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/AgentExtension.java rename to spec-grpc/src/main/java/io/a2a/grpc/AgentExtension.java diff --git a/grpc/src/main/java/io/a2a/grpc/AgentExtensionOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/AgentExtensionOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/AgentExtensionOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/AgentExtensionOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/AgentInterface.java b/spec-grpc/src/main/java/io/a2a/grpc/AgentInterface.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/AgentInterface.java rename to spec-grpc/src/main/java/io/a2a/grpc/AgentInterface.java diff --git a/grpc/src/main/java/io/a2a/grpc/AgentInterfaceOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/AgentInterfaceOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/AgentInterfaceOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/AgentInterfaceOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/AgentProvider.java b/spec-grpc/src/main/java/io/a2a/grpc/AgentProvider.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/AgentProvider.java rename to spec-grpc/src/main/java/io/a2a/grpc/AgentProvider.java diff --git a/grpc/src/main/java/io/a2a/grpc/AgentProviderOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/AgentProviderOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/AgentProviderOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/AgentProviderOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/AgentSkill.java b/spec-grpc/src/main/java/io/a2a/grpc/AgentSkill.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/AgentSkill.java rename to spec-grpc/src/main/java/io/a2a/grpc/AgentSkill.java diff --git a/grpc/src/main/java/io/a2a/grpc/AgentSkillOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/AgentSkillOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/AgentSkillOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/AgentSkillOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/Artifact.java b/spec-grpc/src/main/java/io/a2a/grpc/Artifact.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/Artifact.java rename to spec-grpc/src/main/java/io/a2a/grpc/Artifact.java diff --git a/grpc/src/main/java/io/a2a/grpc/ArtifactOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/ArtifactOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/ArtifactOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/ArtifactOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/AuthenticationInfo.java b/spec-grpc/src/main/java/io/a2a/grpc/AuthenticationInfo.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/AuthenticationInfo.java rename to spec-grpc/src/main/java/io/a2a/grpc/AuthenticationInfo.java diff --git a/grpc/src/main/java/io/a2a/grpc/AuthenticationInfoOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/AuthenticationInfoOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/AuthenticationInfoOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/AuthenticationInfoOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/AuthorizationCodeOAuthFlow.java b/spec-grpc/src/main/java/io/a2a/grpc/AuthorizationCodeOAuthFlow.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/AuthorizationCodeOAuthFlow.java rename to spec-grpc/src/main/java/io/a2a/grpc/AuthorizationCodeOAuthFlow.java diff --git a/grpc/src/main/java/io/a2a/grpc/AuthorizationCodeOAuthFlowOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/AuthorizationCodeOAuthFlowOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/AuthorizationCodeOAuthFlowOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/AuthorizationCodeOAuthFlowOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/CancelTaskRequest.java b/spec-grpc/src/main/java/io/a2a/grpc/CancelTaskRequest.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/CancelTaskRequest.java rename to spec-grpc/src/main/java/io/a2a/grpc/CancelTaskRequest.java diff --git a/grpc/src/main/java/io/a2a/grpc/CancelTaskRequestOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/CancelTaskRequestOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/CancelTaskRequestOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/CancelTaskRequestOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/ClientCredentialsOAuthFlow.java b/spec-grpc/src/main/java/io/a2a/grpc/ClientCredentialsOAuthFlow.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/ClientCredentialsOAuthFlow.java rename to spec-grpc/src/main/java/io/a2a/grpc/ClientCredentialsOAuthFlow.java diff --git a/grpc/src/main/java/io/a2a/grpc/ClientCredentialsOAuthFlowOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/ClientCredentialsOAuthFlowOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/ClientCredentialsOAuthFlowOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/ClientCredentialsOAuthFlowOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/CreateTaskPushNotificationConfigRequest.java b/spec-grpc/src/main/java/io/a2a/grpc/CreateTaskPushNotificationConfigRequest.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/CreateTaskPushNotificationConfigRequest.java rename to spec-grpc/src/main/java/io/a2a/grpc/CreateTaskPushNotificationConfigRequest.java diff --git a/grpc/src/main/java/io/a2a/grpc/CreateTaskPushNotificationConfigRequestOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/CreateTaskPushNotificationConfigRequestOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/CreateTaskPushNotificationConfigRequestOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/CreateTaskPushNotificationConfigRequestOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/DataPart.java b/spec-grpc/src/main/java/io/a2a/grpc/DataPart.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/DataPart.java rename to spec-grpc/src/main/java/io/a2a/grpc/DataPart.java diff --git a/grpc/src/main/java/io/a2a/grpc/DataPartOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/DataPartOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/DataPartOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/DataPartOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/DeleteTaskPushNotificationConfigRequest.java b/spec-grpc/src/main/java/io/a2a/grpc/DeleteTaskPushNotificationConfigRequest.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/DeleteTaskPushNotificationConfigRequest.java rename to spec-grpc/src/main/java/io/a2a/grpc/DeleteTaskPushNotificationConfigRequest.java diff --git a/grpc/src/main/java/io/a2a/grpc/DeleteTaskPushNotificationConfigRequestOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/DeleteTaskPushNotificationConfigRequestOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/DeleteTaskPushNotificationConfigRequestOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/DeleteTaskPushNotificationConfigRequestOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/FilePart.java b/spec-grpc/src/main/java/io/a2a/grpc/FilePart.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/FilePart.java rename to spec-grpc/src/main/java/io/a2a/grpc/FilePart.java diff --git a/grpc/src/main/java/io/a2a/grpc/FilePartOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/FilePartOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/FilePartOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/FilePartOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/GetAgentCardRequest.java b/spec-grpc/src/main/java/io/a2a/grpc/GetAgentCardRequest.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/GetAgentCardRequest.java rename to spec-grpc/src/main/java/io/a2a/grpc/GetAgentCardRequest.java diff --git a/grpc/src/main/java/io/a2a/grpc/GetAgentCardRequestOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/GetAgentCardRequestOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/GetAgentCardRequestOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/GetAgentCardRequestOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/GetTaskPushNotificationConfigRequest.java b/spec-grpc/src/main/java/io/a2a/grpc/GetTaskPushNotificationConfigRequest.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/GetTaskPushNotificationConfigRequest.java rename to spec-grpc/src/main/java/io/a2a/grpc/GetTaskPushNotificationConfigRequest.java diff --git a/grpc/src/main/java/io/a2a/grpc/GetTaskPushNotificationConfigRequestOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/GetTaskPushNotificationConfigRequestOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/GetTaskPushNotificationConfigRequestOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/GetTaskPushNotificationConfigRequestOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/GetTaskRequest.java b/spec-grpc/src/main/java/io/a2a/grpc/GetTaskRequest.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/GetTaskRequest.java rename to spec-grpc/src/main/java/io/a2a/grpc/GetTaskRequest.java diff --git a/grpc/src/main/java/io/a2a/grpc/GetTaskRequestOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/GetTaskRequestOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/GetTaskRequestOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/GetTaskRequestOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/HTTPAuthSecurityScheme.java b/spec-grpc/src/main/java/io/a2a/grpc/HTTPAuthSecurityScheme.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/HTTPAuthSecurityScheme.java rename to spec-grpc/src/main/java/io/a2a/grpc/HTTPAuthSecurityScheme.java diff --git a/grpc/src/main/java/io/a2a/grpc/HTTPAuthSecuritySchemeOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/HTTPAuthSecuritySchemeOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/HTTPAuthSecuritySchemeOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/HTTPAuthSecuritySchemeOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/ImplicitOAuthFlow.java b/spec-grpc/src/main/java/io/a2a/grpc/ImplicitOAuthFlow.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/ImplicitOAuthFlow.java rename to spec-grpc/src/main/java/io/a2a/grpc/ImplicitOAuthFlow.java diff --git a/grpc/src/main/java/io/a2a/grpc/ImplicitOAuthFlowOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/ImplicitOAuthFlowOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/ImplicitOAuthFlowOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/ImplicitOAuthFlowOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/ListTaskPushNotificationConfigRequest.java b/spec-grpc/src/main/java/io/a2a/grpc/ListTaskPushNotificationConfigRequest.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/ListTaskPushNotificationConfigRequest.java rename to spec-grpc/src/main/java/io/a2a/grpc/ListTaskPushNotificationConfigRequest.java diff --git a/grpc/src/main/java/io/a2a/grpc/ListTaskPushNotificationConfigRequestOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/ListTaskPushNotificationConfigRequestOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/ListTaskPushNotificationConfigRequestOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/ListTaskPushNotificationConfigRequestOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/ListTaskPushNotificationConfigResponse.java b/spec-grpc/src/main/java/io/a2a/grpc/ListTaskPushNotificationConfigResponse.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/ListTaskPushNotificationConfigResponse.java rename to spec-grpc/src/main/java/io/a2a/grpc/ListTaskPushNotificationConfigResponse.java diff --git a/grpc/src/main/java/io/a2a/grpc/ListTaskPushNotificationConfigResponseOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/ListTaskPushNotificationConfigResponseOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/ListTaskPushNotificationConfigResponseOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/ListTaskPushNotificationConfigResponseOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/Message.java b/spec-grpc/src/main/java/io/a2a/grpc/Message.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/Message.java rename to spec-grpc/src/main/java/io/a2a/grpc/Message.java diff --git a/grpc/src/main/java/io/a2a/grpc/MessageOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/MessageOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/MessageOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/MessageOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/OAuth2SecurityScheme.java b/spec-grpc/src/main/java/io/a2a/grpc/OAuth2SecurityScheme.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/OAuth2SecurityScheme.java rename to spec-grpc/src/main/java/io/a2a/grpc/OAuth2SecurityScheme.java diff --git a/grpc/src/main/java/io/a2a/grpc/OAuth2SecuritySchemeOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/OAuth2SecuritySchemeOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/OAuth2SecuritySchemeOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/OAuth2SecuritySchemeOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/OAuthFlows.java b/spec-grpc/src/main/java/io/a2a/grpc/OAuthFlows.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/OAuthFlows.java rename to spec-grpc/src/main/java/io/a2a/grpc/OAuthFlows.java diff --git a/grpc/src/main/java/io/a2a/grpc/OAuthFlowsOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/OAuthFlowsOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/OAuthFlowsOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/OAuthFlowsOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/OpenIdConnectSecurityScheme.java b/spec-grpc/src/main/java/io/a2a/grpc/OpenIdConnectSecurityScheme.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/OpenIdConnectSecurityScheme.java rename to spec-grpc/src/main/java/io/a2a/grpc/OpenIdConnectSecurityScheme.java diff --git a/grpc/src/main/java/io/a2a/grpc/OpenIdConnectSecuritySchemeOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/OpenIdConnectSecuritySchemeOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/OpenIdConnectSecuritySchemeOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/OpenIdConnectSecuritySchemeOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/Part.java b/spec-grpc/src/main/java/io/a2a/grpc/Part.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/Part.java rename to spec-grpc/src/main/java/io/a2a/grpc/Part.java diff --git a/grpc/src/main/java/io/a2a/grpc/PartOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/PartOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/PartOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/PartOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/PasswordOAuthFlow.java b/spec-grpc/src/main/java/io/a2a/grpc/PasswordOAuthFlow.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/PasswordOAuthFlow.java rename to spec-grpc/src/main/java/io/a2a/grpc/PasswordOAuthFlow.java diff --git a/grpc/src/main/java/io/a2a/grpc/PasswordOAuthFlowOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/PasswordOAuthFlowOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/PasswordOAuthFlowOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/PasswordOAuthFlowOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/PushNotificationConfig.java b/spec-grpc/src/main/java/io/a2a/grpc/PushNotificationConfig.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/PushNotificationConfig.java rename to spec-grpc/src/main/java/io/a2a/grpc/PushNotificationConfig.java diff --git a/grpc/src/main/java/io/a2a/grpc/PushNotificationConfigOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/PushNotificationConfigOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/PushNotificationConfigOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/PushNotificationConfigOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/Role.java b/spec-grpc/src/main/java/io/a2a/grpc/Role.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/Role.java rename to spec-grpc/src/main/java/io/a2a/grpc/Role.java diff --git a/grpc/src/main/java/io/a2a/grpc/Security.java b/spec-grpc/src/main/java/io/a2a/grpc/Security.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/Security.java rename to spec-grpc/src/main/java/io/a2a/grpc/Security.java diff --git a/grpc/src/main/java/io/a2a/grpc/SecurityOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/SecurityOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/SecurityOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/SecurityOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/SecurityScheme.java b/spec-grpc/src/main/java/io/a2a/grpc/SecurityScheme.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/SecurityScheme.java rename to spec-grpc/src/main/java/io/a2a/grpc/SecurityScheme.java diff --git a/grpc/src/main/java/io/a2a/grpc/SecuritySchemeOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/SecuritySchemeOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/SecuritySchemeOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/SecuritySchemeOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/SendMessageConfiguration.java b/spec-grpc/src/main/java/io/a2a/grpc/SendMessageConfiguration.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/SendMessageConfiguration.java rename to spec-grpc/src/main/java/io/a2a/grpc/SendMessageConfiguration.java diff --git a/grpc/src/main/java/io/a2a/grpc/SendMessageConfigurationOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/SendMessageConfigurationOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/SendMessageConfigurationOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/SendMessageConfigurationOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/SendMessageRequest.java b/spec-grpc/src/main/java/io/a2a/grpc/SendMessageRequest.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/SendMessageRequest.java rename to spec-grpc/src/main/java/io/a2a/grpc/SendMessageRequest.java diff --git a/grpc/src/main/java/io/a2a/grpc/SendMessageRequestOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/SendMessageRequestOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/SendMessageRequestOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/SendMessageRequestOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/SendMessageResponse.java b/spec-grpc/src/main/java/io/a2a/grpc/SendMessageResponse.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/SendMessageResponse.java rename to spec-grpc/src/main/java/io/a2a/grpc/SendMessageResponse.java diff --git a/grpc/src/main/java/io/a2a/grpc/SendMessageResponseOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/SendMessageResponseOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/SendMessageResponseOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/SendMessageResponseOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/StreamResponse.java b/spec-grpc/src/main/java/io/a2a/grpc/StreamResponse.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/StreamResponse.java rename to spec-grpc/src/main/java/io/a2a/grpc/StreamResponse.java diff --git a/grpc/src/main/java/io/a2a/grpc/StreamResponseOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/StreamResponseOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/StreamResponseOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/StreamResponseOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/StringList.java b/spec-grpc/src/main/java/io/a2a/grpc/StringList.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/StringList.java rename to spec-grpc/src/main/java/io/a2a/grpc/StringList.java diff --git a/grpc/src/main/java/io/a2a/grpc/StringListOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/StringListOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/StringListOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/StringListOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/Task.java b/spec-grpc/src/main/java/io/a2a/grpc/Task.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/Task.java rename to spec-grpc/src/main/java/io/a2a/grpc/Task.java diff --git a/grpc/src/main/java/io/a2a/grpc/TaskArtifactUpdateEvent.java b/spec-grpc/src/main/java/io/a2a/grpc/TaskArtifactUpdateEvent.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/TaskArtifactUpdateEvent.java rename to spec-grpc/src/main/java/io/a2a/grpc/TaskArtifactUpdateEvent.java diff --git a/grpc/src/main/java/io/a2a/grpc/TaskArtifactUpdateEventOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/TaskArtifactUpdateEventOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/TaskArtifactUpdateEventOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/TaskArtifactUpdateEventOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/TaskOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/TaskOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/TaskOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/TaskOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/TaskPushNotificationConfig.java b/spec-grpc/src/main/java/io/a2a/grpc/TaskPushNotificationConfig.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/TaskPushNotificationConfig.java rename to spec-grpc/src/main/java/io/a2a/grpc/TaskPushNotificationConfig.java diff --git a/grpc/src/main/java/io/a2a/grpc/TaskPushNotificationConfigOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/TaskPushNotificationConfigOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/TaskPushNotificationConfigOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/TaskPushNotificationConfigOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/TaskState.java b/spec-grpc/src/main/java/io/a2a/grpc/TaskState.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/TaskState.java rename to spec-grpc/src/main/java/io/a2a/grpc/TaskState.java diff --git a/grpc/src/main/java/io/a2a/grpc/TaskStatus.java b/spec-grpc/src/main/java/io/a2a/grpc/TaskStatus.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/TaskStatus.java rename to spec-grpc/src/main/java/io/a2a/grpc/TaskStatus.java diff --git a/grpc/src/main/java/io/a2a/grpc/TaskStatusOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/TaskStatusOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/TaskStatusOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/TaskStatusOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/TaskStatusUpdateEvent.java b/spec-grpc/src/main/java/io/a2a/grpc/TaskStatusUpdateEvent.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/TaskStatusUpdateEvent.java rename to spec-grpc/src/main/java/io/a2a/grpc/TaskStatusUpdateEvent.java diff --git a/grpc/src/main/java/io/a2a/grpc/TaskStatusUpdateEventOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/TaskStatusUpdateEventOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/TaskStatusUpdateEventOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/TaskStatusUpdateEventOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/TaskSubscriptionRequest.java b/spec-grpc/src/main/java/io/a2a/grpc/TaskSubscriptionRequest.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/TaskSubscriptionRequest.java rename to spec-grpc/src/main/java/io/a2a/grpc/TaskSubscriptionRequest.java diff --git a/grpc/src/main/java/io/a2a/grpc/TaskSubscriptionRequestOrBuilder.java b/spec-grpc/src/main/java/io/a2a/grpc/TaskSubscriptionRequestOrBuilder.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/TaskSubscriptionRequestOrBuilder.java rename to spec-grpc/src/main/java/io/a2a/grpc/TaskSubscriptionRequestOrBuilder.java diff --git a/grpc/src/main/java/io/a2a/grpc/utils/ProtoUtils.java b/spec-grpc/src/main/java/io/a2a/grpc/utils/ProtoUtils.java similarity index 100% rename from grpc/src/main/java/io/a2a/grpc/utils/ProtoUtils.java rename to spec-grpc/src/main/java/io/a2a/grpc/utils/ProtoUtils.java diff --git a/grpc/src/main/resources/META-INF/beans.xml b/spec-grpc/src/main/resources/META-INF/beans.xml similarity index 100% rename from grpc/src/main/resources/META-INF/beans.xml rename to spec-grpc/src/main/resources/META-INF/beans.xml diff --git a/tck/pom.xml b/tck/pom.xml index 42c25a6db..5272c1a1c 100644 --- a/tck/pom.xml +++ b/tck/pom.xml @@ -18,7 +18,7 @@ io.github.a2asdk - a2a-java-reference-server + a2a-java-sdk-reference-jsonrpc ${project.version} diff --git a/transport/grpc/pom.xml b/transport/grpc/pom.xml new file mode 100644 index 000000000..982ae3b8e --- /dev/null +++ b/transport/grpc/pom.xml @@ -0,0 +1,81 @@ + + + 4.0.0 + + + io.github.a2asdk + a2a-java-sdk-parent + 0.2.6.Beta1-SNAPSHOT + ../../pom.xml + + a2a-java-sdk-transport-grpc + + jar + + Java SDK A2A Transport: gRPC + Java SDK for the Agent2Agent Protocol (A2A) - gRPC + + + + io.github.a2asdk + a2a-java-sdk-server-common + ${project.version} + + + ${project.groupId} + a2a-java-sdk-server-common + ${project.version} + test-jar + test + + + ${project.groupId} + a2a-java-sdk-spec-grpc + ${project.version} + + + com.google.protobuf + protobuf-java + + + io.grpc + grpc-protobuf + + + io.grpc + grpc-stub + + + jakarta.enterprise + jakarta.enterprise.cdi-api + + + jakarta.inject + jakarta.inject-api + + + ch.qos.logback + logback-classic + test + + + org.junit.jupiter + junit-jupiter-api + test + + + org.mockito + mockito-core + test + + + io.grpc + grpc-testing + test + + + + + diff --git a/sdk-server-common/src/main/java/io/a2a/server/requesthandlers/GrpcHandler.java b/transport/grpc/src/main/java/io/a2a/grpc/handler/GrpcHandler.java similarity index 99% rename from sdk-server-common/src/main/java/io/a2a/server/requesthandlers/GrpcHandler.java rename to transport/grpc/src/main/java/io/a2a/grpc/handler/GrpcHandler.java index e514feae7..68311009f 100644 --- a/sdk-server-common/src/main/java/io/a2a/server/requesthandlers/GrpcHandler.java +++ b/transport/grpc/src/main/java/io/a2a/grpc/handler/GrpcHandler.java @@ -1,4 +1,4 @@ -package io.a2a.server.requesthandlers; +package io.a2a.grpc.handler; import static io.a2a.grpc.utils.ProtoUtils.FromProto; import static io.a2a.grpc.utils.ProtoUtils.ToProto; @@ -18,6 +18,8 @@ import io.a2a.server.ServerCallContext; import io.a2a.server.auth.UnauthenticatedUser; import io.a2a.server.auth.User; +import io.a2a.server.requesthandlers.CallContextFactory; +import io.a2a.server.requesthandlers.RequestHandler; import io.a2a.spec.AgentCard; import io.a2a.spec.ContentTypeNotSupportedError; import io.a2a.spec.DeleteTaskPushNotificationConfigParams; diff --git a/transport/grpc/src/main/resources/META-INF/beans.xml b/transport/grpc/src/main/resources/META-INF/beans.xml new file mode 100644 index 000000000..be7990041 --- /dev/null +++ b/transport/grpc/src/main/resources/META-INF/beans.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/sdk-server-common/src/test/java/io/a2a/server/requesthandlers/GrpcHandlerTest.java b/transport/grpc/src/test/java/io/a2a/grpc/handler/GrpcHandlerTest.java similarity index 68% rename from sdk-server-common/src/test/java/io/a2a/server/requesthandlers/GrpcHandlerTest.java rename to transport/grpc/src/test/java/io/a2a/grpc/handler/GrpcHandlerTest.java index 87a1a9bc8..75956f8b8 100644 --- a/sdk-server-common/src/test/java/io/a2a/server/requesthandlers/GrpcHandlerTest.java +++ b/transport/grpc/src/test/java/io/a2a/grpc/handler/GrpcHandlerTest.java @@ -1,4 +1,4 @@ -package io.a2a.server.requesthandlers; +package io.a2a.grpc.handler; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -36,6 +36,8 @@ import io.a2a.grpc.TaskSubscriptionRequest; import io.a2a.server.ServerCallContext; import io.a2a.server.events.EventConsumer; +import io.a2a.server.requesthandlers.AbstractA2ARequestHandlerTest; +import io.a2a.server.requesthandlers.DefaultRequestHandler; import io.a2a.server.tasks.TaskUpdater; import io.a2a.spec.AgentCard; import io.a2a.spec.Artifact; @@ -60,42 +62,42 @@ public class GrpcHandlerTest extends AbstractA2ARequestHandlerTest { private static final Message GRPC_MESSAGE = Message.newBuilder() - .setTaskId(MINIMAL_TASK.getId()) - .setContextId(MINIMAL_TASK.getContextId()) - .setMessageId(MESSAGE.getMessageId()) + .setTaskId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) + .setContextId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getContextId()) + .setMessageId(AbstractA2ARequestHandlerTest.MESSAGE.getMessageId()) .setRole(Role.ROLE_AGENT) - .addContent(Part.newBuilder().setText(((TextPart)MESSAGE.getParts().get(0)).getText()).build()) + .addContent(Part.newBuilder().setText(((TextPart) AbstractA2ARequestHandlerTest.MESSAGE.getParts().get(0)).getText()).build()) .setMetadata(Struct.newBuilder().build()) .build(); @Test public void testOnGetTaskSuccess() throws Exception { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); - taskStore.save(MINIMAL_TASK); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); + taskStore.save(AbstractA2ARequestHandlerTest.MINIMAL_TASK); GetTaskRequest request = GetTaskRequest.newBuilder() - .setName("tasks/" + MINIMAL_TASK.getId()) + .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.getTask(request, streamRecorder); streamRecorder.awaitCompletion(5, TimeUnit.SECONDS); - assertNull(streamRecorder.getError()); + Assertions.assertNull(streamRecorder.getError()); List result = streamRecorder.getValues(); - assertNotNull(result); - assertEquals(1, result.size()); + Assertions.assertNotNull(result); + Assertions.assertEquals(1, result.size()); Task task = result.get(0); - assertEquals(MINIMAL_TASK.getId(), task.getId()); - assertEquals(MINIMAL_TASK.getContextId(), task.getContextId()); + assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(), task.getId()); + assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getContextId(), task.getContextId()); assertEquals(TaskState.TASK_STATE_SUBMITTED, task.getStatus().getState()); } @Test public void testOnGetTaskNotFound() throws Exception { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); GetTaskRequest request = GetTaskRequest.newBuilder() - .setName("tasks/" + MINIMAL_TASK.getId()) + .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); @@ -107,8 +109,8 @@ public void testOnGetTaskNotFound() throws Exception { @Test public void testOnCancelTaskSuccess() throws Exception { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); - taskStore.save(MINIMAL_TASK); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); + taskStore.save(AbstractA2ARequestHandlerTest.MINIMAL_TASK); agentExecutorCancel = (context, eventQueue) -> { // We need to cancel the task or the EventConsumer never finds a 'final' event. @@ -120,33 +122,33 @@ public void testOnCancelTaskSuccess() throws Exception { }; CancelTaskRequest request = CancelTaskRequest.newBuilder() - .setName("tasks/" + MINIMAL_TASK.getId()) + .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.cancelTask(request, streamRecorder); streamRecorder.awaitCompletion(5, TimeUnit.SECONDS); - assertNull(streamRecorder.getError()); + Assertions.assertNull(streamRecorder.getError()); List result = streamRecorder.getValues(); - assertNotNull(result); - assertEquals(1, result.size()); + Assertions.assertNotNull(result); + Assertions.assertEquals(1, result.size()); Task task = result.get(0); - assertEquals(MINIMAL_TASK.getId(), task.getId()); - assertEquals(MINIMAL_TASK.getContextId(), task.getContextId()); + assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(), task.getId()); + assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getContextId(), task.getContextId()); assertEquals(TaskState.TASK_STATE_CANCELLED, task.getStatus().getState()); } @Test public void testOnCancelTaskNotSupported() throws Exception { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); - taskStore.save(MINIMAL_TASK); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); + taskStore.save(AbstractA2ARequestHandlerTest.MINIMAL_TASK); agentExecutorCancel = (context, eventQueue) -> { throw new UnsupportedOperationError(); }; CancelTaskRequest request = CancelTaskRequest.newBuilder() - .setName("tasks/" + MINIMAL_TASK.getId()) + .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.cancelTask(request, streamRecorder); @@ -157,9 +159,9 @@ public void testOnCancelTaskNotSupported() throws Exception { @Test public void testOnCancelTaskNotFound() throws Exception { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); CancelTaskRequest request = CancelTaskRequest.newBuilder() - .setName("tasks/" + MINIMAL_TASK.getId()) + .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.cancelTask(request, streamRecorder); @@ -170,39 +172,39 @@ public void testOnCancelTaskNotFound() throws Exception { @Test public void testOnMessageNewMessageSuccess() throws Exception { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); agentExecutorExecute = (context, eventQueue) -> { eventQueue.enqueueEvent(context.getMessage()); }; StreamRecorder streamRecorder = sendMessageRequest(handler); - assertNull(streamRecorder.getError()); + Assertions.assertNull(streamRecorder.getError()); List result = streamRecorder.getValues(); - assertNotNull(result); - assertEquals(1, result.size()); + Assertions.assertNotNull(result); + Assertions.assertEquals(1, result.size()); SendMessageResponse response = result.get(0); assertEquals(GRPC_MESSAGE, response.getMsg()); } @Test public void testOnMessageNewMessageWithExistingTaskSuccess() throws Exception { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); - taskStore.save(MINIMAL_TASK); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); + taskStore.save(AbstractA2ARequestHandlerTest.MINIMAL_TASK); agentExecutorExecute = (context, eventQueue) -> { eventQueue.enqueueEvent(context.getMessage()); }; StreamRecorder streamRecorder = sendMessageRequest(handler); - assertNull(streamRecorder.getError()); + Assertions.assertNull(streamRecorder.getError()); List result = streamRecorder.getValues(); - assertNotNull(result); - assertEquals(1, result.size()); + Assertions.assertNotNull(result); + Assertions.assertEquals(1, result.size()); SendMessageResponse response = result.get(0); assertEquals(GRPC_MESSAGE, response.getMsg()); } @Test public void testOnMessageError() throws Exception { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); agentExecutorExecute = (context, eventQueue) -> { eventQueue.enqueueEvent(new UnsupportedOperationError()); }; @@ -212,56 +214,56 @@ public void testOnMessageError() throws Exception { @Test public void testSetPushNotificationConfigSuccess() throws Exception { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); - String NAME = "tasks/" + MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + "config456"; + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + "config456"; StreamRecorder streamRecorder = createTaskPushNotificationConfigRequest(handler, NAME); - assertNull(streamRecorder.getError()); + Assertions.assertNull(streamRecorder.getError()); List result = streamRecorder.getValues(); - assertNotNull(result); - assertEquals(1, result.size()); + Assertions.assertNotNull(result); + Assertions.assertEquals(1, result.size()); TaskPushNotificationConfig response = result.get(0); assertEquals(NAME, response.getName()); PushNotificationConfig responseConfig = response.getPushNotificationConfig(); assertEquals("config456", responseConfig.getId()); assertEquals("http://example.com", responseConfig.getUrl()); assertEquals(AuthenticationInfo.getDefaultInstance(), responseConfig.getAuthentication()); - assertTrue(responseConfig.getToken().isEmpty()); + Assertions.assertTrue(responseConfig.getToken().isEmpty()); } @Test public void testGetPushNotificationConfigSuccess() throws Exception { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); agentExecutorExecute = (context, eventQueue) -> { eventQueue.enqueueEvent(context.getTask() != null ? context.getTask() : context.getMessage()); }; - String NAME = "tasks/" + MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + "config456"; + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + "config456"; // first set the task push notification config StreamRecorder streamRecorder = createTaskPushNotificationConfigRequest(handler, NAME); - assertNull(streamRecorder.getError()); + Assertions.assertNull(streamRecorder.getError()); // then get the task push notification config streamRecorder = getTaskPushNotificationConfigRequest(handler, NAME); - assertNull(streamRecorder.getError()); + Assertions.assertNull(streamRecorder.getError()); List result = streamRecorder.getValues(); - assertNotNull(result); - assertEquals(1, result.size()); + Assertions.assertNotNull(result); + Assertions.assertEquals(1, result.size()); TaskPushNotificationConfig response = result.get(0); assertEquals(NAME, response.getName()); PushNotificationConfig responseConfig = response.getPushNotificationConfig(); assertEquals("config456", responseConfig.getId()); assertEquals("http://example.com", responseConfig.getUrl()); assertEquals(AuthenticationInfo.getDefaultInstance(), responseConfig.getAuthentication()); - assertTrue(responseConfig.getToken().isEmpty()); + Assertions.assertTrue(responseConfig.getToken().isEmpty()); } @Test public void testPushNotificationsNotSupportedError() throws Exception { - AgentCard card = createAgentCard(true, false, true); + AgentCard card = AbstractA2ARequestHandlerTest.createAgentCard(true, false, true); GrpcHandler handler = new GrpcHandler(card, requestHandler); - String NAME = "tasks/" + MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + MINIMAL_TASK.getId(); + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(); StreamRecorder streamRecorder = createTaskPushNotificationConfigRequest(handler, NAME); assertGrpcError(streamRecorder, Status.Code.UNIMPLEMENTED); } @@ -271,9 +273,9 @@ public void testOnGetPushNotificationNoPushNotifierConfig() throws Exception { // Create request handler without a push notifier DefaultRequestHandler requestHandler = new DefaultRequestHandler(executor, taskStore, queueManager, null, null, internalExecutor); - AgentCard card = createAgentCard(false, true, false); + AgentCard card = AbstractA2ARequestHandlerTest.createAgentCard(false, true, false); GrpcHandler handler = new GrpcHandler(card, requestHandler); - String NAME = "tasks/" + MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + MINIMAL_TASK.getId(); + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(); StreamRecorder streamRecorder = getTaskPushNotificationConfigRequest(handler, NAME); assertGrpcError(streamRecorder, Status.Code.UNIMPLEMENTED); } @@ -283,39 +285,39 @@ public void testOnSetPushNotificationNoPushNotifierConfig() throws Exception { // Create request handler without a push notifier DefaultRequestHandler requestHandler = new DefaultRequestHandler(executor, taskStore, queueManager, null, null, internalExecutor); - AgentCard card = createAgentCard(false, true, false); + AgentCard card = AbstractA2ARequestHandlerTest.createAgentCard(false, true, false); GrpcHandler handler = new GrpcHandler(card, requestHandler); - String NAME = "tasks/" + MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + MINIMAL_TASK.getId(); + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(); StreamRecorder streamRecorder = createTaskPushNotificationConfigRequest(handler, NAME); assertGrpcError(streamRecorder, Status.Code.UNIMPLEMENTED); } @Test public void testOnMessageStreamNewMessageSuccess() throws Exception { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); agentExecutorExecute = (context, eventQueue) -> { eventQueue.enqueueEvent(context.getTask() != null ? context.getTask() : context.getMessage()); }; StreamRecorder streamRecorder = sendStreamingMessageRequest(handler); - assertNull(streamRecorder.getError()); + Assertions.assertNull(streamRecorder.getError()); List result = streamRecorder.getValues(); - assertNotNull(result); - assertEquals(1, result.size()); + Assertions.assertNotNull(result); + Assertions.assertEquals(1, result.size()); StreamResponse response = result.get(0); - assertTrue(response.hasMsg()); + Assertions.assertTrue(response.hasMsg()); Message message = response.getMsg(); - assertEquals(GRPC_MESSAGE, message); + Assertions.assertEquals(GRPC_MESSAGE, message); } @Test public void testOnMessageStreamNewMessageExistingTaskSuccess() throws Exception { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); agentExecutorExecute = (context, eventQueue) -> { eventQueue.enqueueEvent(context.getTask() != null ? context.getTask() : context.getMessage()); }; - io.a2a.spec.Task task = new io.a2a.spec.Task.Builder(MINIMAL_TASK) + io.a2a.spec.Task task = new io.a2a.spec.Task.Builder(AbstractA2ARequestHandlerTest.MINIMAL_TASK) .history(new ArrayList<>()) .build(); taskStore.save(task); @@ -342,15 +344,15 @@ public void onCompleted() { }; sendStreamingMessageRequest(handler, streamObserver); Assertions.assertTrue(latch.await(1, TimeUnit.SECONDS)); - assertTrue(errors.isEmpty()); - assertEquals(1, results.size()); + Assertions.assertTrue(errors.isEmpty()); + Assertions.assertEquals(1, results.size()); StreamResponse response = results.get(0); - assertTrue(response.hasTask()); + Assertions.assertTrue(response.hasTask()); Task taskResponse = response.getTask(); Task expected = Task.newBuilder() - .setId(MINIMAL_TASK.getId()) - .setContextId(MINIMAL_TASK.getContextId()) + .setId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) + .setContextId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getContextId()) .addAllHistory(List.of(GRPC_MESSAGE)) .setStatus(TaskStatus.newBuilder().setStateValue(TaskState.TASK_STATE_SUBMITTED_VALUE)) .build(); @@ -362,9 +364,9 @@ public void onCompleted() { @Test public void testOnMessageStreamNewMessageExistingTaskSuccessMocks() throws Exception { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); - io.a2a.spec.Task task = new io.a2a.spec.Task.Builder(MINIMAL_TASK) + io.a2a.spec.Task task = new io.a2a.spec.Task.Builder(AbstractA2ARequestHandlerTest.MINIMAL_TASK) .history(new ArrayList<>()) .build(); taskStore.save(task); @@ -392,18 +394,18 @@ public void testOnMessageStreamNewMessageExistingTaskSuccessMocks() throws Excep Mockito.doReturn(ZeroPublisher.fromIterable(events)).when(mock).consumeAll();})){ streamRecorder = sendStreamingMessageRequest(handler); } - assertNull(streamRecorder.getError()); + Assertions.assertNull(streamRecorder.getError()); List result = streamRecorder.getValues(); - assertEquals(2, result.size()); + Assertions.assertEquals(2, result.size()); StreamResponse first = result.get(0); - assertTrue(first.hasArtifactUpdate()); + Assertions.assertTrue(first.hasArtifactUpdate()); io.a2a.grpc.TaskArtifactUpdateEvent taskArtifactUpdateEvent = first.getArtifactUpdate(); assertEquals(task.getId(), taskArtifactUpdateEvent.getTaskId()); assertEquals(task.getContextId(), taskArtifactUpdateEvent.getContextId()); assertEquals("11", taskArtifactUpdateEvent.getArtifact().getArtifactId()); assertEquals("text", taskArtifactUpdateEvent.getArtifact().getParts(0).getText()); StreamResponse second = result.get(1); - assertTrue(second.hasStatusUpdate()); + Assertions.assertTrue(second.hasStatusUpdate()); io.a2a.grpc.TaskStatusUpdateEvent taskStatusUpdateEvent = second.getStatusUpdate(); assertEquals(task.getId(), taskStatusUpdateEvent.getTaskId()); assertEquals(task.getContextId(), taskStatusUpdateEvent.getContextId()); @@ -412,20 +414,20 @@ public void testOnMessageStreamNewMessageExistingTaskSuccessMocks() throws Excep @Test public void testOnMessageStreamNewMessageSendPushNotificationSuccess() throws Exception { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); List events = List.of( - MINIMAL_TASK, + AbstractA2ARequestHandlerTest.MINIMAL_TASK, new TaskArtifactUpdateEvent.Builder() - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) + .contextId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getContextId()) .artifact(new Artifact.Builder() .artifactId("11") .parts(new TextPart("text")) .build()) .build(), new TaskStatusUpdateEvent.Builder() - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) + .contextId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getContextId()) .status(new io.a2a.spec.TaskStatus(io.a2a.spec.TaskState.COMPLETED)) .build()); @@ -437,9 +439,9 @@ public void testOnMessageStreamNewMessageSendPushNotificationSuccess() throws Ex } }; - String NAME = "tasks/" + MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + MINIMAL_TASK.getId(); + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(); StreamRecorder pushStreamRecorder = createTaskPushNotificationConfigRequest(handler, NAME); - assertNull(pushStreamRecorder.getError()); + Assertions.assertNull(pushStreamRecorder.getError()); List results = new ArrayList<>(); List errors = new ArrayList<>(); @@ -462,39 +464,39 @@ public void onCompleted() { } }; sendStreamingMessageRequest(handler, streamObserver); - assertTrue(latch.await(5, TimeUnit.SECONDS)); - assertTrue(errors.isEmpty()); - assertEquals(3, results.size()); - assertEquals(3, httpClient.tasks.size()); + Assertions.assertTrue(latch.await(5, TimeUnit.SECONDS)); + Assertions.assertTrue(errors.isEmpty()); + Assertions.assertEquals(3, results.size()); + Assertions.assertEquals(3, httpClient.tasks.size()); io.a2a.spec.Task curr = httpClient.tasks.get(0); - assertEquals(MINIMAL_TASK.getId(), curr.getId()); - assertEquals(MINIMAL_TASK.getContextId(), curr.getContextId()); - assertEquals(MINIMAL_TASK.getStatus().state(), curr.getStatus().state()); - assertEquals(0, curr.getArtifacts() == null ? 0 : curr.getArtifacts().size()); + Assertions.assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(), curr.getId()); + Assertions.assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getContextId(), curr.getContextId()); + Assertions.assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getStatus().state(), curr.getStatus().state()); + Assertions.assertEquals(0, curr.getArtifacts() == null ? 0 : curr.getArtifacts().size()); curr = httpClient.tasks.get(1); - assertEquals(MINIMAL_TASK.getId(), curr.getId()); - assertEquals(MINIMAL_TASK.getContextId(), curr.getContextId()); - assertEquals(MINIMAL_TASK.getStatus().state(), curr.getStatus().state()); - assertEquals(1, curr.getArtifacts().size()); - assertEquals(1, curr.getArtifacts().get(0).parts().size()); - assertEquals("text", ((TextPart)curr.getArtifacts().get(0).parts().get(0)).getText()); + Assertions.assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(), curr.getId()); + Assertions.assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getContextId(), curr.getContextId()); + Assertions.assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getStatus().state(), curr.getStatus().state()); + Assertions.assertEquals(1, curr.getArtifacts().size()); + Assertions.assertEquals(1, curr.getArtifacts().get(0).parts().size()); + Assertions.assertEquals("text", ((TextPart)curr.getArtifacts().get(0).parts().get(0)).getText()); curr = httpClient.tasks.get(2); - assertEquals(MINIMAL_TASK.getId(), curr.getId()); - assertEquals(MINIMAL_TASK.getContextId(), curr.getContextId()); - assertEquals(io.a2a.spec.TaskState.COMPLETED, curr.getStatus().state()); - assertEquals(1, curr.getArtifacts().size()); - assertEquals(1, curr.getArtifacts().get(0).parts().size()); - assertEquals("text", ((TextPart)curr.getArtifacts().get(0).parts().get(0)).getText()); + Assertions.assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(), curr.getId()); + Assertions.assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getContextId(), curr.getContextId()); + Assertions.assertEquals(io.a2a.spec.TaskState.COMPLETED, curr.getStatus().state()); + Assertions.assertEquals(1, curr.getArtifacts().size()); + Assertions.assertEquals(1, curr.getArtifacts().get(0).parts().size()); + Assertions.assertEquals("text", ((TextPart)curr.getArtifacts().get(0).parts().get(0)).getText()); } @Test public void testOnResubscribeNoExistingTaskError() throws Exception { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); TaskSubscriptionRequest request = TaskSubscriptionRequest.newBuilder() - .setName("tasks/" + MINIMAL_TASK.getId()) + .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.taskSubscription(request, streamRecorder); @@ -504,9 +506,9 @@ public void testOnResubscribeNoExistingTaskError() throws Exception { @Test public void testOnResubscribeExistingTaskSuccess() throws Exception { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); - taskStore.save(MINIMAL_TASK); - queueManager.createOrTap(MINIMAL_TASK.getId()); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); + taskStore.save(AbstractA2ARequestHandlerTest.MINIMAL_TASK); + queueManager.createOrTap(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()); agentExecutorExecute = (context, eventQueue) -> { eventQueue.enqueueEvent(context.getMessage()); @@ -514,7 +516,7 @@ public void testOnResubscribeExistingTaskSuccess() throws Exception { StreamRecorder streamRecorder = StreamRecorder.create(); TaskSubscriptionRequest request = TaskSubscriptionRequest.newBuilder() - .setName("tasks/" + MINIMAL_TASK.getId()) + .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) .build(); handler.taskSubscription(request, streamRecorder); @@ -525,42 +527,42 @@ public void testOnResubscribeExistingTaskSuccess() throws Exception { StreamRecorder messageRecorder = StreamRecorder.create(); handler.sendStreamingMessage(sendMessageRequest, messageRecorder); messageRecorder.awaitCompletion(5, TimeUnit.SECONDS); - assertNull(messageRecorder.getError()); + Assertions.assertNull(messageRecorder.getError()); streamRecorder.awaitCompletion(5, TimeUnit.SECONDS); List result = streamRecorder.getValues(); - assertNotNull(result); - assertEquals(1, result.size()); + Assertions.assertNotNull(result); + Assertions.assertEquals(1, result.size()); StreamResponse response = result.get(0); - assertTrue(response.hasMsg()); + Assertions.assertTrue(response.hasMsg()); assertEquals(GRPC_MESSAGE, response.getMsg()); - assertNull(streamRecorder.getError()); + Assertions.assertNull(streamRecorder.getError()); } @Test public void testOnResubscribeExistingTaskSuccessMocks() throws Exception { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); - taskStore.save(MINIMAL_TASK); - queueManager.createOrTap(MINIMAL_TASK.getId()); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); + taskStore.save(AbstractA2ARequestHandlerTest.MINIMAL_TASK); + queueManager.createOrTap(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()); List events = List.of( new TaskArtifactUpdateEvent.Builder() - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) + .contextId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getContextId()) .artifact(new Artifact.Builder() .artifactId("11") .parts(new TextPart("text")) .build()) .build(), new TaskStatusUpdateEvent.Builder() - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) + .contextId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getContextId()) .status(new io.a2a.spec.TaskStatus(io.a2a.spec.TaskState.WORKING)) .build()); StreamRecorder streamRecorder = StreamRecorder.create(); TaskSubscriptionRequest request = TaskSubscriptionRequest.newBuilder() - .setName("tasks/" + MINIMAL_TASK.getId()) + .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) .build(); try (MockedConstruction mocked = Mockito.mockConstruction( EventConsumer.class, @@ -570,20 +572,20 @@ public void testOnResubscribeExistingTaskSuccessMocks() throws Exception { streamRecorder.awaitCompletion(5, TimeUnit.SECONDS); } List result = streamRecorder.getValues(); - assertEquals(events.size(), result.size()); + Assertions.assertEquals(events.size(), result.size()); StreamResponse first = result.get(0); - assertTrue(first.hasArtifactUpdate()); + Assertions.assertTrue(first.hasArtifactUpdate()); io.a2a.grpc.TaskArtifactUpdateEvent event = first.getArtifactUpdate(); assertEquals("11", event.getArtifact().getArtifactId()); assertEquals("text", (event.getArtifact().getParts(0)).getText()); StreamResponse second = result.get(1); - assertTrue(second.hasStatusUpdate()); + Assertions.assertTrue(second.hasStatusUpdate()); assertEquals(TaskState.TASK_STATE_WORKING, second.getStatusUpdate().getStatus().getState()); } @Test public void testStreamingNotSupportedError() throws Exception { - AgentCard card = createAgentCard(false, true, true); + AgentCard card = AbstractA2ARequestHandlerTest.createAgentCard(false, true, true); GrpcHandler handler = new GrpcHandler(card, requestHandler); StreamRecorder streamRecorder = sendStreamingMessageRequest(handler); assertGrpcError(streamRecorder, Status.Code.INVALID_ARGUMENT); @@ -592,10 +594,10 @@ public void testStreamingNotSupportedError() throws Exception { @Test public void testStreamingNotSupportedErrorOnResubscribeToTask() throws Exception { // This test does not exist in the Python implementation - AgentCard card = createAgentCard(false, true, true); + AgentCard card = AbstractA2ARequestHandlerTest.createAgentCard(false, true, true); GrpcHandler handler = new GrpcHandler(card, requestHandler); TaskSubscriptionRequest request = TaskSubscriptionRequest.newBuilder() - .setName("tasks/" + MINIMAL_TASK.getId()) + .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.taskSubscription(request, streamRecorder); @@ -607,47 +609,47 @@ public void testStreamingNotSupportedErrorOnResubscribeToTask() throws Exception public void testOnMessageStreamInternalError() throws Exception { DefaultRequestHandler mocked = Mockito.mock(DefaultRequestHandler.class); Mockito.doThrow(new InternalError("Internal Error")).when(mocked).onMessageSendStream(Mockito.any(MessageSendParams.class), Mockito.any(ServerCallContext.class)); - GrpcHandler handler = new GrpcHandler(CARD, mocked); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, mocked); StreamRecorder streamRecorder = sendStreamingMessageRequest(handler); assertGrpcError(streamRecorder, Status.Code.INTERNAL); } @Test public void testListPushNotificationConfig() throws Exception { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); - taskStore.save(MINIMAL_TASK); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); + taskStore.save(AbstractA2ARequestHandlerTest.MINIMAL_TASK); agentExecutorExecute = (context, eventQueue) -> { eventQueue.enqueueEvent(context.getTask() != null ? context.getTask() : context.getMessage()); }; - String NAME = "tasks/" + MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + MINIMAL_TASK.getId(); + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(); StreamRecorder pushRecorder = createTaskPushNotificationConfigRequest(handler, NAME); - assertNull(pushRecorder.getError()); + Assertions.assertNull(pushRecorder.getError()); ListTaskPushNotificationConfigRequest request = ListTaskPushNotificationConfigRequest.newBuilder() - .setParent("tasks/" + MINIMAL_TASK.getId()) + .setParent("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.listTaskPushNotificationConfig(request, streamRecorder); - assertNull(streamRecorder.getError()); + Assertions.assertNull(streamRecorder.getError()); List result = streamRecorder.getValues(); - assertEquals(1, result.size()); + Assertions.assertEquals(1, result.size()); List configList = result.get(0).getConfigsList(); - assertEquals(1, configList.size()); - assertEquals(pushRecorder.getValues().get(0), configList.get(0)); + Assertions.assertEquals(1, configList.size()); + Assertions.assertEquals(pushRecorder.getValues().get(0), configList.get(0)); } @Test public void testListPushNotificationConfigNotSupported() throws Exception { - AgentCard card = createAgentCard(true, false, true); + AgentCard card = AbstractA2ARequestHandlerTest.createAgentCard(true, false, true); GrpcHandler handler = new GrpcHandler(card, requestHandler); - taskStore.save(MINIMAL_TASK); + taskStore.save(AbstractA2ARequestHandlerTest.MINIMAL_TASK); agentExecutorExecute = (context, eventQueue) -> { eventQueue.enqueueEvent(context.getTask() != null ? context.getTask() : context.getMessage()); }; ListTaskPushNotificationConfigRequest request = ListTaskPushNotificationConfigRequest.newBuilder() - .setParent("tasks/" + MINIMAL_TASK.getId()) + .setParent("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.listTaskPushNotificationConfig(request, streamRecorder); @@ -658,14 +660,14 @@ public void testListPushNotificationConfigNotSupported() throws Exception { public void testListPushNotificationConfigNoPushConfigStore() { DefaultRequestHandler requestHandler = new DefaultRequestHandler(executor, taskStore, queueManager, null, null, internalExecutor); - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); - taskStore.save(MINIMAL_TASK); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); + taskStore.save(AbstractA2ARequestHandlerTest.MINIMAL_TASK); agentExecutorExecute = (context, eventQueue) -> { eventQueue.enqueueEvent(context.getTask() != null ? context.getTask() : context.getMessage()); }; ListTaskPushNotificationConfigRequest request = ListTaskPushNotificationConfigRequest.newBuilder() - .setParent("tasks/" + MINIMAL_TASK.getId()) + .setParent("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.listTaskPushNotificationConfig(request, streamRecorder); @@ -674,13 +676,13 @@ public void testListPushNotificationConfigNoPushConfigStore() { @Test public void testListPushNotificationConfigTaskNotFound() { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); agentExecutorExecute = (context, eventQueue) -> { eventQueue.enqueueEvent(context.getTask() != null ? context.getTask() : context.getMessage()); }; ListTaskPushNotificationConfigRequest request = ListTaskPushNotificationConfigRequest.newBuilder() - .setParent("tasks/" + MINIMAL_TASK.getId()) + .setParent("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.listTaskPushNotificationConfig(request, streamRecorder); @@ -689,36 +691,36 @@ public void testListPushNotificationConfigTaskNotFound() { @Test public void testDeletePushNotificationConfig() throws Exception { - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); - taskStore.save(MINIMAL_TASK); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); + taskStore.save(AbstractA2ARequestHandlerTest.MINIMAL_TASK); agentExecutorExecute = (context, eventQueue) -> { eventQueue.enqueueEvent(context.getTask() != null ? context.getTask() : context.getMessage()); }; - String NAME = "tasks/" + MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + MINIMAL_TASK.getId(); + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(); StreamRecorder pushRecorder = createTaskPushNotificationConfigRequest(handler, NAME); - assertNull(pushRecorder.getError()); + Assertions.assertNull(pushRecorder.getError()); DeleteTaskPushNotificationConfigRequest request = DeleteTaskPushNotificationConfigRequest.newBuilder() .setName(NAME) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.deleteTaskPushNotificationConfig(request, streamRecorder); - assertNull(streamRecorder.getError()); - assertEquals(1, streamRecorder.getValues().size()); + Assertions.assertNull(streamRecorder.getError()); + Assertions.assertEquals(1, streamRecorder.getValues().size()); assertEquals(Empty.getDefaultInstance(), streamRecorder.getValues().get(0)); } @Test public void testDeletePushNotificationConfigNotSupported() throws Exception { - AgentCard card = createAgentCard(true, false, true); + AgentCard card = AbstractA2ARequestHandlerTest.createAgentCard(true, false, true); GrpcHandler handler = new GrpcHandler(card, requestHandler); - taskStore.save(MINIMAL_TASK); + taskStore.save(AbstractA2ARequestHandlerTest.MINIMAL_TASK); agentExecutorExecute = (context, eventQueue) -> { eventQueue.enqueueEvent(context.getTask() != null ? context.getTask() : context.getMessage()); }; - String NAME = "tasks/" + MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + MINIMAL_TASK.getId(); + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(); DeleteTaskPushNotificationConfigRequest request = DeleteTaskPushNotificationConfigRequest.newBuilder() .setName(NAME) .build(); @@ -731,8 +733,8 @@ public void testDeletePushNotificationConfigNotSupported() throws Exception { public void testDeletePushNotificationConfigNoPushConfigStore() { DefaultRequestHandler requestHandler = new DefaultRequestHandler(executor, taskStore, queueManager, null, null, internalExecutor); - GrpcHandler handler = new GrpcHandler(CARD, requestHandler); - String NAME = "tasks/" + MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + MINIMAL_TASK.getId(); + GrpcHandler handler = new GrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler); + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(); DeleteTaskPushNotificationConfigRequest request = DeleteTaskPushNotificationConfigRequest.newBuilder() .setName(NAME) .build(); @@ -752,7 +754,7 @@ private StreamRecorder sendMessageRequest(GrpcHandler handl } private StreamRecorder createTaskPushNotificationConfigRequest(GrpcHandler handler, String name) throws Exception { - taskStore.save(MINIMAL_TASK); + taskStore.save(AbstractA2ARequestHandlerTest.MINIMAL_TASK); PushNotificationConfig config = PushNotificationConfig.newBuilder() .setUrl("http://example.com") .build(); @@ -798,9 +800,9 @@ private void sendStreamingMessageRequest(GrpcHandler handler, StreamObserver void assertGrpcError(StreamRecorder streamRecorder, Status.Code expectedStatusCode) { - assertNotNull(streamRecorder.getError()); - assertInstanceOf(StatusRuntimeException.class, streamRecorder.getError()); - assertEquals(expectedStatusCode, ((StatusRuntimeException) streamRecorder.getError()).getStatus().getCode()); - assertTrue(streamRecorder.getValues().isEmpty()); + Assertions.assertNotNull(streamRecorder.getError()); + Assertions.assertInstanceOf(StatusRuntimeException.class, streamRecorder.getError()); + Assertions.assertEquals(expectedStatusCode, ((StatusRuntimeException) streamRecorder.getError()).getStatus().getCode()); + Assertions.assertTrue(streamRecorder.getValues().isEmpty()); } } diff --git a/transport/jsonrpc/pom.xml b/transport/jsonrpc/pom.xml new file mode 100644 index 000000000..b66e3b1f5 --- /dev/null +++ b/transport/jsonrpc/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + + io.github.a2asdk + a2a-java-sdk-parent + 0.2.6.Beta1-SNAPSHOT + ../../pom.xml + + a2a-java-sdk-transport-jsonrpc + + jar + + Java SDK A2A Transport: JSONRPC + Java SDK for the Agent2Agent Protocol (A2A) - JSONRPC + + + + io.github.a2asdk + a2a-java-sdk-server-common + ${project.version} + + + ${project.groupId} + a2a-java-sdk-server-common + ${project.version} + test-jar + test + + + ch.qos.logback + logback-classic + test + + + org.junit.jupiter + junit-jupiter-api + test + + + org.mockito + mockito-core + test + + + + + diff --git a/sdk-server-common/src/main/java/io/a2a/server/requesthandlers/JSONRPCHandler.java b/transport/jsonrpc/src/main/java/io/a2a/jsonrpc/handler/JSONRPCHandler.java similarity index 99% rename from sdk-server-common/src/main/java/io/a2a/server/requesthandlers/JSONRPCHandler.java rename to transport/jsonrpc/src/main/java/io/a2a/jsonrpc/handler/JSONRPCHandler.java index fb120f981..b2928dfd5 100644 --- a/sdk-server-common/src/main/java/io/a2a/server/requesthandlers/JSONRPCHandler.java +++ b/transport/jsonrpc/src/main/java/io/a2a/jsonrpc/handler/JSONRPCHandler.java @@ -1,8 +1,7 @@ -package io.a2a.server.requesthandlers; +package io.a2a.jsonrpc.handler; import static io.a2a.server.util.async.AsyncUtils.createTubeConfig; import jakarta.enterprise.context.ApplicationScoped; -import jakarta.enterprise.inject.Instance; import jakarta.inject.Inject; import java.util.List; @@ -10,6 +9,7 @@ import io.a2a.server.PublicAgentCard; import io.a2a.server.ServerCallContext; +import io.a2a.server.requesthandlers.RequestHandler; import io.a2a.spec.AgentCard; import io.a2a.spec.CancelTaskRequest; import io.a2a.spec.CancelTaskResponse; diff --git a/transport/jsonrpc/src/main/resources/META-INF/beans.xml b/transport/jsonrpc/src/main/resources/META-INF/beans.xml new file mode 100644 index 000000000..9b2940fc2 --- /dev/null +++ b/transport/jsonrpc/src/main/resources/META-INF/beans.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/sdk-server-common/src/test/java/io/a2a/server/requesthandlers/JSONRPCHandlerTest.java b/transport/jsonrpc/src/test/java/io/a2a/jsonrpc/handler/JSONRPCHandlerTest.java similarity index 86% rename from sdk-server-common/src/test/java/io/a2a/server/requesthandlers/JSONRPCHandlerTest.java rename to transport/jsonrpc/src/test/java/io/a2a/jsonrpc/handler/JSONRPCHandlerTest.java index 1851a5a90..070df7aa1 100644 --- a/sdk-server-common/src/test/java/io/a2a/server/requesthandlers/JSONRPCHandlerTest.java +++ b/transport/jsonrpc/src/test/java/io/a2a/jsonrpc/handler/JSONRPCHandlerTest.java @@ -1,12 +1,4 @@ -package io.a2a.server.requesthandlers; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertInstanceOf; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertSame; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; +package io.a2a.jsonrpc.handler; import java.util.ArrayList; import java.util.Collections; @@ -21,6 +13,8 @@ import io.a2a.server.ServerCallContext; import io.a2a.server.auth.UnauthenticatedUser; import io.a2a.server.events.EventConsumer; +import io.a2a.server.requesthandlers.AbstractA2ARequestHandlerTest; +import io.a2a.server.requesthandlers.DefaultRequestHandler; import io.a2a.server.tasks.ResultAggregator; import io.a2a.server.tasks.TaskUpdater; import io.a2a.spec.AgentCard; @@ -65,6 +59,7 @@ import io.a2a.spec.TextPart; import io.a2a.spec.UnsupportedOperationError; import mutiny.zero.ZeroPublisher; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.mockito.MockedConstruction; @@ -80,9 +75,9 @@ public void testOnGetTaskSuccess() throws Exception { taskStore.save(MINIMAL_TASK); GetTaskRequest request = new GetTaskRequest("1", new TaskQueryParams(MINIMAL_TASK.getId())); GetTaskResponse response = handler.onGetTask(request, callContext); - assertEquals(request.getId(), response.getId()); - assertSame(MINIMAL_TASK, response.getResult()); - assertNull(response.getError()); + Assertions.assertEquals(request.getId(), response.getId()); + Assertions.assertSame(MINIMAL_TASK, response.getResult()); + Assertions.assertNull(response.getError()); } @Test @@ -90,9 +85,9 @@ public void testOnGetTaskNotFound() throws Exception { JSONRPCHandler handler = new JSONRPCHandler(CARD, requestHandler); GetTaskRequest request = new GetTaskRequest("1", new TaskQueryParams(MINIMAL_TASK.getId())); GetTaskResponse response = handler.onGetTask(request, callContext); - assertEquals(request.getId(), response.getId()); - assertInstanceOf(TaskNotFoundError.class, response.getError()); - assertNull(response.getResult()); + Assertions.assertEquals(request.getId(), response.getId()); + Assertions.assertInstanceOf(TaskNotFoundError.class, response.getError()); + Assertions.assertNull(response.getResult()); } @Test @@ -112,12 +107,12 @@ public void testOnCancelTaskSuccess() throws Exception { CancelTaskRequest request = new CancelTaskRequest("111", new TaskIdParams(MINIMAL_TASK.getId())); CancelTaskResponse response = handler.onCancelTask(request, callContext); - assertNull(response.getError()); - assertEquals(request.getId(), response.getId()); + Assertions.assertNull(response.getError()); + Assertions.assertEquals(request.getId(), response.getId()); Task task = response.getResult(); - assertEquals(MINIMAL_TASK.getId(), task.getId()); - assertEquals(MINIMAL_TASK.getContextId(), task.getContextId()); - assertEquals(TaskState.CANCELED, task.getStatus().state()); + Assertions.assertEquals(MINIMAL_TASK.getId(), task.getId()); + Assertions.assertEquals(MINIMAL_TASK.getContextId(), task.getContextId()); + Assertions.assertEquals(TaskState.CANCELED, task.getStatus().state()); } @Test @@ -131,9 +126,9 @@ public void testOnCancelTaskNotSupported() { CancelTaskRequest request = new CancelTaskRequest("1", new TaskIdParams(MINIMAL_TASK.getId())); CancelTaskResponse response = handler.onCancelTask(request, callContext); - assertEquals(request.getId(), response.getId()); - assertNull(response.getResult()); - assertInstanceOf(UnsupportedOperationError.class, response.getError()); + Assertions.assertEquals(request.getId(), response.getId()); + Assertions.assertNull(response.getResult()); + Assertions.assertInstanceOf(UnsupportedOperationError.class, response.getError()); } @Test @@ -141,9 +136,9 @@ public void testOnCancelTaskNotFound() { JSONRPCHandler handler = new JSONRPCHandler(CARD, requestHandler); CancelTaskRequest request = new CancelTaskRequest("1", new TaskIdParams(MINIMAL_TASK.getId())); CancelTaskResponse response = handler.onCancelTask(request, callContext); - assertEquals(request.getId(), response.getId()); - assertNull(response.getResult()); - assertInstanceOf(TaskNotFoundError.class, response.getError()); + Assertions.assertEquals(request.getId(), response.getId()); + Assertions.assertNull(response.getResult()); + Assertions.assertInstanceOf(TaskNotFoundError.class, response.getError()); } @Test @@ -158,14 +153,14 @@ public void testOnMessageNewMessageSuccess() { .build(); SendMessageRequest request = new SendMessageRequest("1", new MessageSendParams(message, null, null)); SendMessageResponse response = handler.onMessageSend(request, callContext); - assertNull(response.getError()); + Assertions.assertNull(response.getError()); // The Python implementation returns a Task here, but then again they are using hardcoded mocks and // bypassing the whole EventQueue. // If we were to send a Task in agentExecutorExecute EventConsumer.consumeAll() would not exit due to // the Task not having a 'final' state // // See testOnMessageNewMessageSuccessMocks() for a test more similar to the Python implementation - assertSame(message, response.getResult()); + Assertions.assertSame(message, response.getResult()); } @Test @@ -184,8 +179,8 @@ public void testOnMessageNewMessageSuccessMocks() { (mock, context) -> {Mockito.doReturn(ZeroPublisher.fromItems(MINIMAL_TASK)).when(mock).consumeAll();})){ response = handler.onMessageSend(request, callContext); } - assertNull(response.getError()); - assertSame(MINIMAL_TASK, response.getResult()); + Assertions.assertNull(response.getError()); + Assertions.assertSame(MINIMAL_TASK, response.getResult()); } @Test @@ -201,14 +196,14 @@ public void testOnMessageNewMessageWithExistingTaskSuccess() { .build(); SendMessageRequest request = new SendMessageRequest("1", new MessageSendParams(message, null, null)); SendMessageResponse response = handler.onMessageSend(request, callContext); - assertNull(response.getError()); + Assertions.assertNull(response.getError()); // The Python implementation returns a Task here, but then again they are using hardcoded mocks and // bypassing the whole EventQueue. // If we were to send a Task in agentExecutorExecute EventConsumer.consumeAll() would not exit due to // the Task not having a 'final' state // // See testOnMessageNewMessageWithExistingTaskSuccessMocks() for a test more similar to the Python implementation - assertSame(message, response.getResult()); + Assertions.assertSame(message, response.getResult()); } @Test @@ -228,8 +223,8 @@ public void testOnMessageNewMessageWithExistingTaskSuccessMocks() { Mockito.doReturn(ZeroPublisher.fromItems(MINIMAL_TASK)).when(mock).consumeAll();})){ response = handler.onMessageSend(request, callContext); } - assertNull(response.getError()); - assertSame(MINIMAL_TASK, response.getResult()); + Assertions.assertNull(response.getError()); + Assertions.assertSame(MINIMAL_TASK, response.getResult()); } @@ -248,8 +243,8 @@ public void testOnMessageError() { SendMessageRequest request = new SendMessageRequest( "1", new MessageSendParams(message, null, null)); SendMessageResponse response = handler.onMessageSend(request, callContext); - assertInstanceOf(UnsupportedOperationError.class, response.getError()); - assertNull(response.getResult()); + Assertions.assertInstanceOf(UnsupportedOperationError.class, response.getError()); + Assertions.assertNull(response.getResult()); } @Test @@ -269,8 +264,8 @@ public void testOnMessageErrorMocks() { response = handler.onMessageSend(request, callContext); } - assertInstanceOf(UnsupportedOperationError.class, response.getError()); - assertNull(response.getResult()); + Assertions.assertInstanceOf(UnsupportedOperationError.class, response.getError()); + Assertions.assertNull(response.getResult()); } @Test @@ -324,8 +319,8 @@ public void onComplete() { // so there would be no more Events. // // See testOnMessageStreamNewMessageSuccessMocks() for a test more similar to the Python implementation - assertEquals(1, results.size()); - assertSame(message, results.get(0)); + Assertions.assertEquals(1, results.size()); + Assertions.assertSame(message, results.get(0)); } @Test @@ -392,7 +387,7 @@ public void onComplete() { } }); - assertEquals(events, results); + Assertions.assertEquals(events, results); } @Test @@ -451,7 +446,7 @@ public void onComplete() { }); }); - assertTrue(latch.await(1, TimeUnit.SECONDS)); + Assertions.assertTrue(latch.await(1, TimeUnit.SECONDS)); subscriptionRef.get().cancel(); // The Python implementation has several events emitted since it uses mocks. // @@ -459,14 +454,14 @@ public void onComplete() { Task expected = new Task.Builder(task) .history(message) .build(); - assertEquals(1, results.size()); + Assertions.assertEquals(1, results.size()); StreamingEventKind receivedType = results.get(0); - assertInstanceOf(Task.class, receivedType); + Assertions.assertInstanceOf(Task.class, receivedType); Task received = (Task) receivedType; - assertEquals(expected.getId(), received.getId()); - assertEquals(expected.getContextId(), received.getContextId()); - assertEquals(expected.getStatus(), received.getStatus()); - assertEquals(expected.getHistory(), received.getHistory()); + Assertions.assertEquals(expected.getId(), received.getId()); + Assertions.assertEquals(expected.getContextId(), received.getContextId()); + Assertions.assertEquals(expected.getStatus(), received.getStatus()); + Assertions.assertEquals(expected.getHistory(), received.getHistory()); } @Test @@ -540,7 +535,7 @@ public void onComplete() { } }); - assertEquals(events, results); + Assertions.assertEquals(events, results); } @@ -554,7 +549,7 @@ public void testSetPushNotificationConfigSuccess() { MINIMAL_TASK.getId(), new PushNotificationConfig.Builder().url("http://example.com").build()); SetTaskPushNotificationConfigRequest request = new SetTaskPushNotificationConfigRequest("1", taskPushConfig); SetTaskPushNotificationConfigResponse response = handler.setPushNotificationConfig(request, callContext); - assertSame(taskPushConfig, response.getResult()); + Assertions.assertSame(taskPushConfig, response.getResult()); } @Test @@ -579,7 +574,7 @@ public void testGetPushNotificationConfigSuccess() { TaskPushNotificationConfig expectedConfig = new TaskPushNotificationConfig(MINIMAL_TASK.getId(), new PushNotificationConfig.Builder().id(MINIMAL_TASK.getId()).url("http://example.com").build()); - assertEquals(expectedConfig, getResponse.getResult()); + Assertions.assertEquals(expectedConfig, getResponse.getResult()); } @Test @@ -617,7 +612,7 @@ public void testOnMessageStreamNewMessageSendPushNotificationSuccess() throws Ex new PushNotificationConfig.Builder().url("http://example.com").build()); SetTaskPushNotificationConfigRequest stpnRequest = new SetTaskPushNotificationConfigRequest("1", config); SetTaskPushNotificationConfigResponse stpnResponse = handler.setPushNotificationConfig(stpnRequest, callContext); - assertNull(stpnResponse.getError()); + Assertions.assertNull(stpnResponse.getError()); Message msg = new Message.Builder(MESSAGE) .taskId(MINIMAL_TASK.getId()) @@ -659,32 +654,32 @@ public void onComplete() { }); }); - assertTrue(latch.await(5, TimeUnit.SECONDS)); + Assertions.assertTrue(latch.await(5, TimeUnit.SECONDS)); subscriptionRef.get().cancel(); - assertEquals(3, results.size()); - assertEquals(3, httpClient.tasks.size()); + Assertions.assertEquals(3, results.size()); + Assertions.assertEquals(3, httpClient.tasks.size()); Task curr = httpClient.tasks.get(0); - assertEquals(MINIMAL_TASK.getId(), curr.getId()); - assertEquals(MINIMAL_TASK.getContextId(), curr.getContextId()); - assertEquals(MINIMAL_TASK.getStatus().state(), curr.getStatus().state()); - assertEquals(0, curr.getArtifacts() == null ? 0 : curr.getArtifacts().size()); + Assertions.assertEquals(MINIMAL_TASK.getId(), curr.getId()); + Assertions.assertEquals(MINIMAL_TASK.getContextId(), curr.getContextId()); + Assertions.assertEquals(MINIMAL_TASK.getStatus().state(), curr.getStatus().state()); + Assertions.assertEquals(0, curr.getArtifacts() == null ? 0 : curr.getArtifacts().size()); curr = httpClient.tasks.get(1); - assertEquals(MINIMAL_TASK.getId(), curr.getId()); - assertEquals(MINIMAL_TASK.getContextId(), curr.getContextId()); - assertEquals(MINIMAL_TASK.getStatus().state(), curr.getStatus().state()); - assertEquals(1, curr.getArtifacts().size()); - assertEquals(1, curr.getArtifacts().get(0).parts().size()); - assertEquals("text", ((TextPart)curr.getArtifacts().get(0).parts().get(0)).getText()); + Assertions.assertEquals(MINIMAL_TASK.getId(), curr.getId()); + Assertions.assertEquals(MINIMAL_TASK.getContextId(), curr.getContextId()); + Assertions.assertEquals(MINIMAL_TASK.getStatus().state(), curr.getStatus().state()); + Assertions.assertEquals(1, curr.getArtifacts().size()); + Assertions.assertEquals(1, curr.getArtifacts().get(0).parts().size()); + Assertions.assertEquals("text", ((TextPart)curr.getArtifacts().get(0).parts().get(0)).getText()); curr = httpClient.tasks.get(2); - assertEquals(MINIMAL_TASK.getId(), curr.getId()); - assertEquals(MINIMAL_TASK.getContextId(), curr.getContextId()); - assertEquals(TaskState.COMPLETED, curr.getStatus().state()); - assertEquals(1, curr.getArtifacts().size()); - assertEquals(1, curr.getArtifacts().get(0).parts().size()); - assertEquals("text", ((TextPart)curr.getArtifacts().get(0).parts().get(0)).getText()); + Assertions.assertEquals(MINIMAL_TASK.getId(), curr.getId()); + Assertions.assertEquals(MINIMAL_TASK.getContextId(), curr.getContextId()); + Assertions.assertEquals(TaskState.COMPLETED, curr.getStatus().state()); + Assertions.assertEquals(1, curr.getArtifacts().size()); + Assertions.assertEquals(1, curr.getArtifacts().get(0).parts().size()); + Assertions.assertEquals("text", ((TextPart)curr.getArtifacts().get(0).parts().get(0)).getText()); } @Test @@ -713,7 +708,7 @@ public void testOnResubscribeExistingTaskSuccess() { handler.onMessageSend( new SendMessageRequest("1", new MessageSendParams(message, null, null)), callContext); - assertNull(smr.getError()); + Assertions.assertNull(smr.getError()); List results = new ArrayList<>(); @@ -747,7 +742,7 @@ public void onComplete() { // The Python implementation has several events emitted since it uses mocks. // // See testOnMessageStreamNewMessageExistingTaskSuccessMocks() for a test more similar to the Python implementation - assertEquals(1, results.size()); + Assertions.assertEquals(1, results.size()); } @@ -815,7 +810,7 @@ public void onComplete() { // The Python implementation has several events emitted since it uses mocks. // // See testOnMessageStreamNewMessageExistingTaskSuccessMocks() for a test more similar to the Python implementation - assertEquals(events, results); + Assertions.assertEquals(events, results); } @Test @@ -855,9 +850,9 @@ public void onComplete() { } }); - assertEquals(1, results.size()); - assertNull(results.get(0).getResult()); - assertInstanceOf(TaskNotFoundError.class, results.get(0).getError()); + Assertions.assertEquals(1, results.size()); + Assertions.assertNull(results.get(0).getResult()); + Assertions.assertInstanceOf(TaskNotFoundError.class, results.get(0).getError()); } @Test @@ -902,11 +897,11 @@ public void onComplete() { } }); - assertEquals(1, results.size()); + Assertions.assertEquals(1, results.size()); if (results.get(0).getError() != null && results.get(0).getError() instanceof InvalidRequestError ire) { - assertEquals("Streaming is not supported by the agent", ire.getMessage()); + Assertions.assertEquals("Streaming is not supported by the agent", ire.getMessage()); } else { - fail("Expected a response containing an error"); + Assertions.fail("Expected a response containing an error"); } } @@ -948,11 +943,11 @@ public void onComplete() { } }); - assertEquals(1, results.size()); + Assertions.assertEquals(1, results.size()); if (results.get(0).getError() != null && results.get(0).getError() instanceof InvalidRequestError ire) { - assertEquals("Streaming is not supported by the agent", ire.getMessage()); + Assertions.assertEquals("Streaming is not supported by the agent", ire.getMessage()); } else { - fail("Expected a response containing an error"); + Assertions.fail("Expected a response containing an error"); } } @@ -974,7 +969,7 @@ public void testPushNotificationsNotSupportedError() { .params(config) .build(); SetTaskPushNotificationConfigResponse response = handler.setPushNotificationConfig(request, callContext); - assertInstanceOf(PushNotificationNotSupportedError.class, response.getError()); + Assertions.assertInstanceOf(PushNotificationNotSupportedError.class, response.getError()); } @Test @@ -991,9 +986,9 @@ public void testOnGetPushNotificationNoPushNotifierConfig() { new GetTaskPushNotificationConfigRequest("id", new GetTaskPushNotificationConfigParams(MINIMAL_TASK.getId())); GetTaskPushNotificationConfigResponse response = handler.getPushNotificationConfig(request, callContext); - assertNotNull(response.getError()); - assertInstanceOf(UnsupportedOperationError.class, response.getError()); - assertEquals("This operation is not supported", response.getError().getMessage()); + Assertions.assertNotNull(response.getError()); + Assertions.assertInstanceOf(UnsupportedOperationError.class, response.getError()); + Assertions.assertEquals("This operation is not supported", response.getError().getMessage()); } @Test @@ -1018,8 +1013,8 @@ public void testOnSetPushNotificationNoPushNotifierConfig() { .build(); SetTaskPushNotificationConfigResponse response = handler.setPushNotificationConfig(request, callContext); - assertInstanceOf(UnsupportedOperationError.class, response.getError()); - assertEquals("This operation is not supported", response.getError().getMessage()); + Assertions.assertInstanceOf(UnsupportedOperationError.class, response.getError()); + Assertions.assertEquals("This operation is not supported", response.getError().getMessage()); } @Test @@ -1033,7 +1028,7 @@ public void testOnMessageSendInternalError() { SendMessageRequest request = new SendMessageRequest("1", new MessageSendParams(MESSAGE, null, null)); SendMessageResponse response = handler.onMessageSend(request, callContext); - assertInstanceOf(InternalError.class, response.getError()); + Assertions.assertInstanceOf(InternalError.class, response.getError()); } @Test @@ -1077,8 +1072,8 @@ public void onComplete() { } }); - assertEquals(1, results.size()); - assertInstanceOf(InternalError.class, results.get(0).getError()); + Assertions.assertEquals(1, results.size()); + Assertions.assertInstanceOf(InternalError.class, results.get(0).getError()); } @Test @@ -1114,7 +1109,7 @@ public void testOnMessageSendErrorHandling() { response = handler.onMessageSend(request, callContext); } - assertInstanceOf(UnsupportedOperationError.class, response.getError()); + Assertions.assertInstanceOf(UnsupportedOperationError.class, response.getError()); } @@ -1129,7 +1124,7 @@ public void testOnMessageSendTaskIdMismatch() { SendMessageRequest request = new SendMessageRequest("1", new MessageSendParams(MESSAGE, null, null)); SendMessageResponse response = handler.onMessageSend(request, callContext); - assertInstanceOf(InternalError.class, response.getError()); + Assertions.assertInstanceOf(InternalError.class, response.getError()); } @@ -1174,9 +1169,9 @@ public void onComplete() { } }); - assertNull(error.get()); - assertEquals(1, results.size()); - assertInstanceOf(InternalError.class, results.get(0).getError()); + Assertions.assertNull(error.get()); + Assertions.assertEquals(1, results.size()); + Assertions.assertInstanceOf(InternalError.class, results.get(0).getError()); } @Test @@ -1200,9 +1195,9 @@ public void testListPushNotificationConfig() { new ListTaskPushNotificationConfigRequest("111", new ListTaskPushNotificationConfigParams(MINIMAL_TASK.getId())); ListTaskPushNotificationConfigResponse listResponse = handler.listPushNotificationConfig(listRequest, callContext); - assertEquals("111", listResponse.getId()); - assertEquals(1, listResponse.getResult().size()); - assertEquals(taskPushConfig, listResponse.getResult().get(0)); + Assertions.assertEquals("111", listResponse.getId()); + Assertions.assertEquals(1, listResponse.getResult().size()); + Assertions.assertEquals(taskPushConfig, listResponse.getResult().get(0)); } @Test @@ -1228,9 +1223,9 @@ public void testListPushNotificationConfigNotSupported() { ListTaskPushNotificationConfigResponse listResponse = handler.listPushNotificationConfig(listRequest, callContext); - assertEquals("111", listResponse.getId()); - assertNull(listResponse.getResult()); - assertInstanceOf(PushNotificationNotSupportedError.class, listResponse.getError()); + Assertions.assertEquals("111", listResponse.getId()); + Assertions.assertNull(listResponse.getResult()); + Assertions.assertInstanceOf(PushNotificationNotSupportedError.class, listResponse.getError()); } @Test @@ -1248,9 +1243,9 @@ public void testListPushNotificationConfigNoPushConfigStore() { ListTaskPushNotificationConfigResponse listResponse = handler.listPushNotificationConfig(listRequest, callContext); - assertEquals("111", listResponse.getId()); - assertNull(listResponse.getResult()); - assertInstanceOf(UnsupportedOperationError.class, listResponse.getError()); + Assertions.assertEquals("111", listResponse.getId()); + Assertions.assertNull(listResponse.getResult()); + Assertions.assertInstanceOf(UnsupportedOperationError.class, listResponse.getError()); } @Test @@ -1265,9 +1260,9 @@ public void testListPushNotificationConfigTaskNotFound() { ListTaskPushNotificationConfigResponse listResponse = handler.listPushNotificationConfig(listRequest, callContext); - assertEquals("111", listResponse.getId()); - assertNull(listResponse.getResult()); - assertInstanceOf(TaskNotFoundError.class, listResponse.getError()); + Assertions.assertEquals("111", listResponse.getId()); + Assertions.assertNull(listResponse.getResult()); + Assertions.assertInstanceOf(TaskNotFoundError.class, listResponse.getError()); } @Test @@ -1292,9 +1287,9 @@ public void testDeletePushNotificationConfig() { DeleteTaskPushNotificationConfigResponse deleteResponse = handler.deletePushNotificationConfig(deleteRequest, callContext); - assertEquals("111", deleteResponse.getId()); - assertNull(deleteResponse.getError()); - assertNull(deleteResponse.getResult()); + Assertions.assertEquals("111", deleteResponse.getId()); + Assertions.assertNull(deleteResponse.getError()); + Assertions.assertNull(deleteResponse.getResult()); } @Test @@ -1320,9 +1315,9 @@ public void testDeletePushNotificationConfigNotSupported() { DeleteTaskPushNotificationConfigResponse deleteResponse = handler.deletePushNotificationConfig(deleteRequest, callContext); - assertEquals("111", deleteResponse.getId()); - assertNull(deleteResponse.getResult()); - assertInstanceOf(PushNotificationNotSupportedError.class, deleteResponse.getError()); + Assertions.assertEquals("111", deleteResponse.getId()); + Assertions.assertNull(deleteResponse.getResult()); + Assertions.assertInstanceOf(PushNotificationNotSupportedError.class, deleteResponse.getError()); } @Test @@ -1349,9 +1344,9 @@ public void testDeletePushNotificationConfigNoPushConfigStore() { DeleteTaskPushNotificationConfigResponse deleteResponse = handler.deletePushNotificationConfig(deleteRequest, callContext); - assertEquals("111", deleteResponse.getId()); - assertNull(deleteResponse.getResult()); - assertInstanceOf(UnsupportedOperationError.class, deleteResponse.getError()); + Assertions.assertEquals("111", deleteResponse.getId()); + Assertions.assertNull(deleteResponse.getResult()); + Assertions.assertInstanceOf(UnsupportedOperationError.class, deleteResponse.getError()); } }