diff --git a/client/base/src/main/java/io/a2a/client/ClientTaskManager.java b/client/base/src/main/java/io/a2a/client/ClientTaskManager.java index 7272e1e0b..ca29c2f6a 100644 --- a/client/base/src/main/java/io/a2a/client/ClientTaskManager.java +++ b/client/base/src/main/java/io/a2a/client/ClientTaskManager.java @@ -52,10 +52,10 @@ public Task saveTaskEvent(Task task) throws A2AClientInvalidArgsError { public Task saveTaskEvent(TaskStatusUpdateEvent taskStatusUpdateEvent) throws A2AClientError { if (taskId == null) { - taskId = taskStatusUpdateEvent.getTaskId(); + taskId = taskStatusUpdateEvent.taskId(); } if (contextId == null) { - contextId = taskStatusUpdateEvent.getContextId(); + contextId = taskStatusUpdateEvent.contextId(); } Task task = currentTask; if (task == null) { @@ -67,31 +67,31 @@ public Task saveTaskEvent(TaskStatusUpdateEvent taskStatusUpdateEvent) throws A2 } Task.Builder taskBuilder = Task.builder(task); - if (taskStatusUpdateEvent.getStatus().message() != null) { - if (task.getHistory() == null) { - taskBuilder.history(taskStatusUpdateEvent.getStatus().message()); + if (taskStatusUpdateEvent.status().message() != null) { + if (task.history() == null) { + taskBuilder.history(taskStatusUpdateEvent.status().message()); } else { - List history = new ArrayList<>(task.getHistory()); - history.add(taskStatusUpdateEvent.getStatus().message()); + List history = new ArrayList<>(task.history()); + history.add(taskStatusUpdateEvent.status().message()); taskBuilder.history(history); } } - if (taskStatusUpdateEvent.getMetadata() != null) { - Map newMetadata = task.getMetadata() != null ? new HashMap<>(task.getMetadata()) : new HashMap<>(); - newMetadata.putAll(taskStatusUpdateEvent.getMetadata()); + if (taskStatusUpdateEvent.metadata() != null) { + Map newMetadata = task.metadata() != null ? new HashMap<>(task.metadata()) : new HashMap<>(); + newMetadata.putAll(taskStatusUpdateEvent.metadata()); taskBuilder.metadata(newMetadata); } - taskBuilder.status(taskStatusUpdateEvent.getStatus()); + taskBuilder.status(taskStatusUpdateEvent.status()); currentTask = taskBuilder.build(); return currentTask; } public Task saveTaskEvent(TaskArtifactUpdateEvent taskArtifactUpdateEvent) { if (taskId == null) { - taskId = taskArtifactUpdateEvent.getTaskId(); + taskId = taskArtifactUpdateEvent.taskId(); } if (contextId == null) { - contextId = taskArtifactUpdateEvent.getContextId(); + contextId = taskArtifactUpdateEvent.contextId(); } Task task = currentTask; if (task == null) { @@ -115,13 +115,13 @@ public Task saveTaskEvent(TaskArtifactUpdateEvent taskArtifactUpdateEvent) { */ public Task updateWithMessage(Message message, Task task) { Task.Builder taskBuilder = Task.builder(task); - List history = task.getHistory(); + List history = task.history(); if (history == null) { history = new ArrayList<>(); } - if (task.getStatus().message() != null) { - history.add(task.getStatus().message()); - taskBuilder.status(new TaskStatus(task.getStatus().state(), null, task.getStatus().timestamp())); + if (task.status().message() != null) { + history.add(task.status().message()); + taskBuilder.status(new TaskStatus(task.status().state(), null, task.status().timestamp())); } history.add(message); taskBuilder.history(history); @@ -132,8 +132,8 @@ public Task updateWithMessage(Message message, Task task) { private void saveTask(Task task) { currentTask = task; if (taskId == null) { - taskId = currentTask.getId(); - contextId = currentTask.getContextId(); + taskId = currentTask.id(); + contextId = currentTask.contextId(); } } } \ No newline at end of file diff --git a/client/base/src/main/java/io/a2a/client/MessageEvent.java b/client/base/src/main/java/io/a2a/client/MessageEvent.java index 94c8a1058..9a0370995 100644 --- a/client/base/src/main/java/io/a2a/client/MessageEvent.java +++ b/client/base/src/main/java/io/a2a/client/MessageEvent.java @@ -25,15 +25,15 @@ public Message getMessage() { @Override public String toString() { String messageAsString = "{" - + "role=" + message.getRole() - + ", parts=" + message.getParts() - + ", messageId=" + message.getMessageId() - + ", contextId=" + message.getContextId() - + ", taskId=" + message.getTaskId() - + ", metadata=" + message.getMetadata() - + ", kind=" + message.getKind() - + ", referenceTaskIds=" + message.getReferenceTaskIds() - + ", extensions=" + message.getExtensions() + '}'; + + "role=" + message.role() + + ", parts=" + message.parts() + + ", messageId=" + message.messageId() + + ", contextId=" + message.contextId() + + ", taskId=" + message.taskId() + + ", metadata=" + message.metadata() + + ", kind=" + message.kind() + + ", referenceTaskIds=" + message.referenceTaskIds() + + ", extensions=" + message.extensions() + '}'; return "MessageEvent{" + "message=" + messageAsString + '}'; } } diff --git a/client/base/src/test/java/io/a2a/A2ATest.java b/client/base/src/test/java/io/a2a/A2ATest.java index f3c2f3a77..217bb18c9 100644 --- a/client/base/src/test/java/io/a2a/A2ATest.java +++ b/client/base/src/test/java/io/a2a/A2ATest.java @@ -20,12 +20,12 @@ public void testToUserMessage() { String text = "Hello, world!"; Message message = A2A.toUserMessage(text); - assertEquals(Message.Role.USER, message.getRole()); - assertEquals(1, message.getParts().size()); - assertEquals(text, ((TextPart) message.getParts().get(0)).getText()); - assertNotNull(message.getMessageId()); - assertNull(message.getContextId()); - assertNull(message.getTaskId()); + assertEquals(Message.Role.USER, message.role()); + assertEquals(1, message.parts().size()); + assertEquals(text, ((TextPart) message.parts().get(0)).text()); + assertNotNull(message.messageId()); + assertNull(message.contextId()); + assertNull(message.taskId()); } @Test @@ -34,8 +34,8 @@ public void testToUserMessageWithId() { String messageId = "test-message-id"; Message message = A2A.toUserMessage(text, messageId); - assertEquals(Message.Role.USER, message.getRole()); - assertEquals(messageId, message.getMessageId()); + assertEquals(Message.Role.USER, message.role()); + assertEquals(messageId, message.messageId()); } @Test @@ -43,10 +43,10 @@ public void testToAgentMessage() { String text = "Hello, I'm an agent!"; Message message = A2A.toAgentMessage(text); - assertEquals(Message.Role.AGENT, message.getRole()); - assertEquals(1, message.getParts().size()); - assertEquals(text, ((TextPart) message.getParts().get(0)).getText()); - assertNotNull(message.getMessageId()); + assertEquals(Message.Role.AGENT, message.role()); + assertEquals(1, message.parts().size()); + assertEquals(text, ((TextPart) message.parts().get(0)).text()); + assertNotNull(message.messageId()); } @Test @@ -55,8 +55,8 @@ public void testToAgentMessageWithId() { String messageId = "agent-message-id"; Message message = A2A.toAgentMessage(text, messageId); - assertEquals(Message.Role.AGENT, message.getRole()); - assertEquals(messageId, message.getMessageId()); + assertEquals(Message.Role.AGENT, message.role()); + assertEquals(messageId, message.messageId()); } @Test @@ -67,14 +67,14 @@ public void testCreateUserTextMessage() { Message message = A2A.createUserTextMessage(text, contextId, taskId); - assertEquals(Message.Role.USER, message.getRole()); - assertEquals(contextId, message.getContextId()); - assertEquals(taskId, message.getTaskId()); - assertEquals(1, message.getParts().size()); - assertEquals(text, ((TextPart) message.getParts().get(0)).getText()); - assertNotNull(message.getMessageId()); - assertNull(message.getMetadata()); - assertNull(message.getReferenceTaskIds()); + assertEquals(Message.Role.USER, message.role()); + assertEquals(contextId, message.contextId()); + assertEquals(taskId, message.taskId()); + assertEquals(1, message.parts().size()); + assertEquals(text, ((TextPart) message.parts().get(0)).text()); + assertNotNull(message.messageId()); + assertNull(message.metadata()); + assertNull(message.referenceTaskIds()); } @Test @@ -83,11 +83,11 @@ public void testCreateUserTextMessageWithNullParams() { Message message = A2A.createUserTextMessage(text, null, null); - assertEquals(Message.Role.USER, message.getRole()); - assertNull(message.getContextId()); - assertNull(message.getTaskId()); - assertEquals(1, message.getParts().size()); - assertEquals(text, ((TextPart) message.getParts().get(0)).getText()); + assertEquals(Message.Role.USER, message.role()); + assertNull(message.contextId()); + assertNull(message.taskId()); + assertEquals(1, message.parts().size()); + assertEquals(text, ((TextPart) message.parts().get(0)).text()); } @Test @@ -98,12 +98,12 @@ public void testCreateAgentTextMessage() { Message message = A2A.createAgentTextMessage(text, contextId, taskId); - assertEquals(Message.Role.AGENT, message.getRole()); - assertEquals(contextId, message.getContextId()); - assertEquals(taskId, message.getTaskId()); - assertEquals(1, message.getParts().size()); - assertEquals(text, ((TextPart) message.getParts().get(0)).getText()); - assertNotNull(message.getMessageId()); + assertEquals(Message.Role.AGENT, message.role()); + assertEquals(contextId, message.contextId()); + assertEquals(taskId, message.taskId()); + assertEquals(1, message.parts().size()); + assertEquals(text, ((TextPart) message.parts().get(0)).text()); + assertNotNull(message.messageId()); } @Test @@ -117,12 +117,12 @@ public void testCreateAgentPartsMessage() { Message message = A2A.createAgentPartsMessage(parts, contextId, taskId); - assertEquals(Message.Role.AGENT, message.getRole()); - assertEquals(contextId, message.getContextId()); - assertEquals(taskId, message.getTaskId()); - assertEquals(2, message.getParts().size()); - assertEquals("Part 1", ((TextPart) message.getParts().get(0)).getText()); - assertEquals("Part 2", ((TextPart) message.getParts().get(1)).getText()); + assertEquals(Message.Role.AGENT, message.role()); + assertEquals(contextId, message.contextId()); + assertEquals(taskId, message.taskId()); + assertEquals(2, message.parts().size()); + assertEquals("Part 1", ((TextPart) message.parts().get(0)).text()); + assertEquals("Part 2", ((TextPart) message.parts().get(1)).text()); } @Test diff --git a/client/transport/jsonrpc/src/test/java/io/a2a/client/transport/jsonrpc/JSONRPCTransportStreamingTest.java b/client/transport/jsonrpc/src/test/java/io/a2a/client/transport/jsonrpc/JSONRPCTransportStreamingTest.java index b2a6e23ec..a0c21c13e 100644 --- a/client/transport/jsonrpc/src/test/java/io/a2a/client/transport/jsonrpc/JSONRPCTransportStreamingTest.java +++ b/client/transport/jsonrpc/src/test/java/io/a2a/client/transport/jsonrpc/JSONRPCTransportStreamingTest.java @@ -74,8 +74,8 @@ public void testSendStreamingMessageParams() { assertNotNull(params); assertEquals(message, params.message()); assertEquals(configuration, params.configuration()); - assertEquals(Message.Role.USER, params.message().getRole()); - assertEquals("test message", ((TextPart) params.message().getParts().get(0)).getText()); + assertEquals(Message.Role.USER, params.message().role()); + assertEquals("test message", ((TextPart) params.message().parts().get(0)).text()); } @Test @@ -159,16 +159,16 @@ public void testA2AClientResubscribeToTask() throws Exception { assertNotNull(eventKind); assertInstanceOf(Task.class, eventKind); Task task = (Task) eventKind; - assertEquals("2", task.getId()); - assertEquals("context-1234", task.getContextId()); - assertEquals(TaskState.COMPLETED, task.getStatus().state()); - List artifacts = task.getArtifacts(); + assertEquals("2", task.id()); + assertEquals("context-1234", task.contextId()); + assertEquals(TaskState.COMPLETED, task.status().state()); + List artifacts = task.artifacts(); assertEquals(1, artifacts.size()); Artifact artifact = artifacts.get(0); assertEquals("artifact-1", artifact.artifactId()); assertEquals("joke", artifact.name()); Part part = artifact.parts().get(0); assertEquals(Part.Kind.TEXT, part.getKind()); - assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).getText()); + assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).text()); } } \ No newline at end of file diff --git a/client/transport/jsonrpc/src/test/java/io/a2a/client/transport/jsonrpc/JSONRPCTransportTest.java b/client/transport/jsonrpc/src/test/java/io/a2a/client/transport/jsonrpc/JSONRPCTransportTest.java index f7947eb4f..dc9001871 100644 --- a/client/transport/jsonrpc/src/test/java/io/a2a/client/transport/jsonrpc/JSONRPCTransportTest.java +++ b/client/transport/jsonrpc/src/test/java/io/a2a/client/transport/jsonrpc/JSONRPCTransportTest.java @@ -122,18 +122,18 @@ public void testA2AClientSendMessage() throws Exception { EventKind result = client.sendMessage(params, null); assertInstanceOf(Task.class, result); Task task = (Task) result; - assertEquals("de38c76d-d54c-436c-8b9f-4c2703648d64", task.getId()); - assertNotNull(task.getContextId()); - assertEquals(TaskState.COMPLETED,task.getStatus().state()); - assertEquals(1, task.getArtifacts().size()); - Artifact artifact = task.getArtifacts().get(0); + assertEquals("de38c76d-d54c-436c-8b9f-4c2703648d64", task.id()); + assertNotNull(task.contextId()); + assertEquals(TaskState.COMPLETED,task.status().state()); + assertEquals(1, task.artifacts().size()); + Artifact artifact = task.artifacts().get(0); assertEquals("artifact-1", artifact.artifactId()); assertEquals("joke", artifact.name()); assertEquals(1, artifact.parts().size()); Part part = artifact.parts().get(0); assertEquals(Part.Kind.TEXT, part.getKind()); - assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).getText()); - assertTrue(task.getMetadata().isEmpty()); + assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).text()); + assertTrue(task.metadata().isEmpty()); } @Test @@ -170,11 +170,11 @@ public void testA2AClientSendMessageWithMessageResponse() throws Exception { EventKind result = client.sendMessage(params, null); assertInstanceOf(Message.class, result); Message agentMessage = (Message) result; - assertEquals(Message.Role.AGENT, agentMessage.getRole()); - Part part = agentMessage.getParts().get(0); + assertEquals(Message.Role.AGENT, agentMessage.role()); + Part part = agentMessage.parts().get(0); assertEquals(Part.Kind.TEXT, part.getKind()); - assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).getText()); - assertEquals("msg-456", agentMessage.getMessageId()); + assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).text()); + assertEquals("msg-456", agentMessage.messageId()); } @@ -235,39 +235,39 @@ public void testA2AClientGetTask() throws Exception { JSONRPCTransport client = new JSONRPCTransport("http://localhost:4001"); Task task = client.getTask(new TaskQueryParams("de38c76d-d54c-436c-8b9f-4c2703648d64", 10), null); - assertEquals("de38c76d-d54c-436c-8b9f-4c2703648d64", task.getId()); - assertEquals("c295ea44-7543-4f78-b524-7a38915ad6e4", task.getContextId()); - assertEquals(TaskState.COMPLETED, task.getStatus().state()); - assertEquals(1, task.getArtifacts().size()); - Artifact artifact = task.getArtifacts().get(0); + assertEquals("de38c76d-d54c-436c-8b9f-4c2703648d64", task.id()); + assertEquals("c295ea44-7543-4f78-b524-7a38915ad6e4", task.contextId()); + assertEquals(TaskState.COMPLETED, task.status().state()); + assertEquals(1, task.artifacts().size()); + Artifact artifact = task.artifacts().get(0); assertEquals(1, artifact.parts().size()); assertEquals("artifact-1", artifact.artifactId()); Part part = artifact.parts().get(0); assertEquals(Part.Kind.TEXT, part.getKind()); - assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).getText()); - assertTrue(task.getMetadata().isEmpty()); - List history = task.getHistory(); + assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).text()); + assertTrue(task.metadata().isEmpty()); + List history = task.history(); assertNotNull(history); assertEquals(1, history.size()); Message message = history.get(0); - assertEquals(Message.Role.USER, message.getRole()); - List> parts = message.getParts(); + assertEquals(Message.Role.USER, message.role()); + List> parts = message.parts(); assertNotNull(parts); assertEquals(3, parts.size()); part = parts.get(0); assertEquals(Part.Kind.TEXT, part.getKind()); - assertEquals("tell me a joke", ((TextPart)part).getText()); + assertEquals("tell me a joke", ((TextPart)part).text()); part = parts.get(1); assertEquals(Part.Kind.FILE, part.getKind()); - FileContent filePart = ((FilePart) part).getFile(); + FileContent filePart = ((FilePart) part).file(); assertEquals("file:///path/to/file.txt", ((FileWithUri) filePart).uri()); assertEquals("text/plain", filePart.mimeType()); part = parts.get(2); assertEquals(Part.Kind.FILE, part.getKind()); - filePart = ((FilePart) part).getFile(); + filePart = ((FilePart) part).file(); assertEquals("aGVsbG8=", ((FileWithBytes) filePart).bytes()); assertEquals("hello.txt", filePart.name()); - assertTrue(task.getMetadata().isEmpty()); + assertTrue(task.metadata().isEmpty()); } @Test @@ -287,10 +287,10 @@ public void testA2AClientCancelTask() throws Exception { JSONRPCTransport client = new JSONRPCTransport("http://localhost:4001"); Task task = client.cancelTask(new TaskIdParams("de38c76d-d54c-436c-8b9f-4c2703648d64"), null); - assertEquals("de38c76d-d54c-436c-8b9f-4c2703648d64", task.getId()); - assertEquals("c295ea44-7543-4f78-b524-7a38915ad6e4", task.getContextId()); - assertEquals(TaskState.CANCELED, task.getStatus().state()); - assertTrue(task.getMetadata().isEmpty()); + assertEquals("de38c76d-d54c-436c-8b9f-4c2703648d64", task.id()); + assertEquals("c295ea44-7543-4f78-b524-7a38915ad6e4", task.contextId()); + assertEquals(TaskState.CANCELED, task.status().state()); + assertTrue(task.metadata().isEmpty()); } @Test @@ -380,8 +380,7 @@ public void testA2AClientGetAgentCard() throws Exception { Map securitySchemes = agentCard.securitySchemes(); assertNotNull(securitySchemes); OpenIdConnectSecurityScheme google = (OpenIdConnectSecurityScheme) securitySchemes.get("google"); - assertEquals("openIdConnect", google.getType()); - assertEquals("https://accounts.google.com/.well-known/openid-configuration", google.getOpenIdConnectUrl()); + assertEquals("https://accounts.google.com/.well-known/openid-configuration", google.openIdConnectUrl()); List>> security = agentCard.security(); assertEquals(1, security.size()); Map> securityMap = security.get(0); @@ -469,8 +468,7 @@ public void testA2AClientGetAuthenticatedExtendedAgentCard() throws Exception { Map securitySchemes = agentCard.securitySchemes(); assertNotNull(securitySchemes); OpenIdConnectSecurityScheme google = (OpenIdConnectSecurityScheme) securitySchemes.get("google"); - assertEquals("openIdConnect", google.getType()); - assertEquals("https://accounts.google.com/.well-known/openid-configuration", google.getOpenIdConnectUrl()); + assertEquals("https://accounts.google.com/.well-known/openid-configuration", google.openIdConnectUrl()); List>> security = agentCard.security(); assertEquals(1, security.size()); Map> securityMap = security.get(0); @@ -551,20 +549,20 @@ public void testA2AClientSendMessageWithFilePart() throws Exception { EventKind result = client.sendMessage(params, null); assertInstanceOf(Task.class, result); Task task = (Task) result; - assertEquals("de38c76d-d54c-436c-8b9f-4c2703648d64", task.getId()); - assertNotNull(task.getContextId()); - assertEquals(TaskState.COMPLETED, task.getStatus().state()); - assertEquals(1, task.getArtifacts().size()); - Artifact artifact = task.getArtifacts().get(0); + assertEquals("de38c76d-d54c-436c-8b9f-4c2703648d64", task.id()); + assertNotNull(task.contextId()); + assertEquals(TaskState.COMPLETED, task.status().state()); + assertEquals(1, task.artifacts().size()); + Artifact artifact = task.artifacts().get(0); assertEquals("artifact-1", artifact.artifactId()); assertEquals("image-analysis", artifact.name()); assertEquals(1, artifact.parts().size()); Part part = artifact.parts().get(0); assertEquals(Part.Kind.TEXT, part.getKind()); - assertEquals("This is an image of a cat sitting on a windowsill.", ((TextPart) part).getText()); - assertFalse(task.getMetadata().isEmpty()); - assertEquals(1, task.getMetadata().size()); - assertEquals("metadata-test", task.getMetadata().get("test")); + assertEquals("This is an image of a cat sitting on a windowsill.", ((TextPart) part).text()); + assertFalse(task.metadata().isEmpty()); + assertEquals(1, task.metadata().size()); + assertEquals("metadata-test", task.metadata().get("test")); } @Test @@ -611,18 +609,18 @@ public void testA2AClientSendMessageWithDataPart() throws Exception { EventKind result = client.sendMessage(params, null); assertInstanceOf(Task.class, result); Task task = (Task) result; - assertEquals("de38c76d-d54c-436c-8b9f-4c2703648d64", task.getId()); - assertNotNull(task.getContextId()); - assertEquals(TaskState.COMPLETED, task.getStatus().state()); - assertEquals(1, task.getArtifacts().size()); - Artifact artifact = task.getArtifacts().get(0); + assertEquals("de38c76d-d54c-436c-8b9f-4c2703648d64", task.id()); + assertNotNull(task.contextId()); + assertEquals(TaskState.COMPLETED, task.status().state()); + assertEquals(1, task.artifacts().size()); + Artifact artifact = task.artifacts().get(0); assertEquals("artifact-1", artifact.artifactId()); assertEquals("data-analysis", artifact.name()); assertEquals(1, artifact.parts().size()); Part part = artifact.parts().get(0); assertEquals(Part.Kind.TEXT, part.getKind()); - assertEquals("Processed weather data: Temperature is 25.5°C, humidity is 60.2% in San Francisco.", ((TextPart) part).getText()); - assertTrue(task.getMetadata().isEmpty()); + assertEquals("Processed weather data: Temperature is 25.5°C, humidity is 60.2% in San Francisco.", ((TextPart) part).text()); + assertTrue(task.metadata().isEmpty()); } @Test @@ -669,17 +667,17 @@ public void testA2AClientSendMessageWithMixedParts() throws Exception { EventKind result = client.sendMessage(params, null); assertInstanceOf(Task.class, result); Task task = (Task) result; - assertEquals("de38c76d-d54c-436c-8b9f-4c2703648d64", task.getId()); - assertNotNull(task.getContextId()); - assertEquals(TaskState.COMPLETED, task.getStatus().state()); - assertEquals(1, task.getArtifacts().size()); - Artifact artifact = task.getArtifacts().get(0); + assertEquals("de38c76d-d54c-436c-8b9f-4c2703648d64", task.id()); + assertNotNull(task.contextId()); + assertEquals(TaskState.COMPLETED, task.status().state()); + assertEquals(1, task.artifacts().size()); + Artifact artifact = task.artifacts().get(0); assertEquals("artifact-1", artifact.artifactId()); assertEquals("mixed-analysis", artifact.name()); assertEquals(1, artifact.parts().size()); Part part = artifact.parts().get(0); assertEquals(Part.Kind.TEXT, part.getKind()); - assertEquals("Analyzed chart image and data: Bar chart showing quarterly data with values [10, 20, 30, 40].", ((TextPart) part).getText()); - assertTrue(task.getMetadata().isEmpty()); + assertEquals("Analyzed chart image and data: Bar chart showing quarterly data with values [10, 20, 30, 40].", ((TextPart) part).text()); + assertTrue(task.metadata().isEmpty()); } } \ No newline at end of file diff --git a/client/transport/jsonrpc/src/test/java/io/a2a/client/transport/jsonrpc/sse/SSEEventListenerTest.java b/client/transport/jsonrpc/src/test/java/io/a2a/client/transport/jsonrpc/sse/SSEEventListenerTest.java index 9c25ac95a..35aa6a27c 100644 --- a/client/transport/jsonrpc/src/test/java/io/a2a/client/transport/jsonrpc/sse/SSEEventListenerTest.java +++ b/client/transport/jsonrpc/src/test/java/io/a2a/client/transport/jsonrpc/sse/SSEEventListenerTest.java @@ -49,9 +49,9 @@ public void testOnEventWithTaskResult() throws Exception { assertNotNull(receivedEvent.get()); assertTrue(receivedEvent.get() instanceof Task); Task task = (Task) receivedEvent.get(); - assertEquals("task-123", task.getId()); - assertEquals("context-456", task.getContextId()); - assertEquals(TaskState.WORKING, task.getStatus().state()); + assertEquals("task-123", task.id()); + assertEquals("context-456", task.contextId()); + assertEquals(TaskState.WORKING, task.status().state()); } @Test @@ -74,12 +74,12 @@ public void testOnEventWithMessageResult() throws Exception { assertNotNull(receivedEvent.get()); assertTrue(receivedEvent.get() instanceof Message); Message message = (Message) receivedEvent.get(); - assertEquals(Message.Role.AGENT, message.getRole()); - assertEquals("msg-123", message.getMessageId()); - assertEquals("context-456", message.getContextId()); - assertEquals(1, message.getParts().size()); - assertTrue(message.getParts().get(0) instanceof TextPart); - assertEquals("Hello, world!", ((TextPart) message.getParts().get(0)).getText()); + assertEquals(Message.Role.AGENT, message.role()); + assertEquals("msg-123", message.messageId()); + assertEquals("context-456", message.contextId()); + assertEquals(1, message.parts().size()); + assertTrue(message.parts().get(0) instanceof TextPart); + assertEquals("Hello, world!", ((TextPart) message.parts().get(0)).text()); } @Test @@ -102,10 +102,10 @@ public void testOnEventWithTaskStatusUpdateEventEvent() throws Exception { assertNotNull(receivedEvent.get()); assertTrue(receivedEvent.get() instanceof TaskStatusUpdateEvent); TaskStatusUpdateEvent taskStatusUpdateEvent = (TaskStatusUpdateEvent) receivedEvent.get(); - assertEquals("1", taskStatusUpdateEvent.getTaskId()); - assertEquals("2", taskStatusUpdateEvent.getContextId()); + assertEquals("1", taskStatusUpdateEvent.taskId()); + assertEquals("2", taskStatusUpdateEvent.contextId()); assertFalse(taskStatusUpdateEvent.isFinal()); - assertEquals(TaskState.SUBMITTED, taskStatusUpdateEvent.getStatus().state()); + assertEquals(TaskState.SUBMITTED, taskStatusUpdateEvent.status().state()); } @Test @@ -129,15 +129,15 @@ public void testOnEventWithTaskArtifactUpdateEventEvent() throws Exception { assertTrue(receivedEvent.get() instanceof TaskArtifactUpdateEvent); TaskArtifactUpdateEvent taskArtifactUpdateEvent = (TaskArtifactUpdateEvent) receivedEvent.get(); - assertEquals("1", taskArtifactUpdateEvent.getTaskId()); - assertEquals("2", taskArtifactUpdateEvent.getContextId()); - assertFalse(taskArtifactUpdateEvent.isAppend()); - assertTrue(taskArtifactUpdateEvent.isLastChunk()); - Artifact artifact = taskArtifactUpdateEvent.getArtifact(); + assertEquals("1", taskArtifactUpdateEvent.taskId()); + assertEquals("2", taskArtifactUpdateEvent.contextId()); + assertFalse(taskArtifactUpdateEvent.append()); + assertTrue(taskArtifactUpdateEvent.lastChunk()); + Artifact artifact = taskArtifactUpdateEvent.artifact(); assertEquals("artifact-1", artifact.artifactId()); assertEquals(1, artifact.parts().size()); assertEquals(Part.Kind.TEXT, artifact.parts().get(0).getKind()); - assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) artifact.parts().get(0)).getText()); + assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) artifact.parts().get(0)).text()); } @Test @@ -223,10 +223,10 @@ public void testOnEventWithFinalTaskStatusUpdateEventEventCancels() throws Excep assertNotNull(receivedEvent.get()); assertTrue(receivedEvent.get() instanceof TaskStatusUpdateEvent); TaskStatusUpdateEvent taskStatusUpdateEvent = (TaskStatusUpdateEvent) receivedEvent.get(); - assertEquals("1", taskStatusUpdateEvent.getTaskId()); - assertEquals("2", taskStatusUpdateEvent.getContextId()); + assertEquals("1", taskStatusUpdateEvent.taskId()); + assertEquals("2", taskStatusUpdateEvent.contextId()); assertTrue(taskStatusUpdateEvent.isFinal()); - assertEquals(TaskState.COMPLETED, taskStatusUpdateEvent.getStatus().state()); + assertEquals(TaskState.COMPLETED, taskStatusUpdateEvent.status().state()); assertTrue(future.cancelHandlerCalled); } diff --git a/client/transport/rest/src/test/java/io/a2a/client/transport/rest/RestTransportTest.java b/client/transport/rest/src/test/java/io/a2a/client/transport/rest/RestTransportTest.java index 6ed9a79e4..1976367f6 100644 --- a/client/transport/rest/src/test/java/io/a2a/client/transport/rest/RestTransportTest.java +++ b/client/transport/rest/src/test/java/io/a2a/client/transport/rest/RestTransportTest.java @@ -130,26 +130,26 @@ public void testSendMessage() throws Exception { RestTransport instance = new RestTransport(CARD); EventKind result = instance.sendMessage(messageSendParams, context); - assertEquals("task", result.getKind()); + assertEquals("task", result.kind()); Task task = (Task) result; - assertEquals("9b511af4-b27c-47fa-aecf-2a93c08a44f8", task.getId()); - assertEquals("context-1234", task.getContextId()); - assertEquals(TaskState.SUBMITTED, task.getStatus().state()); - assertNull(task.getStatus().message()); - assertNull(task.getMetadata()); - assertEquals(true, task.getArtifacts().isEmpty()); - assertEquals(1, task.getHistory().size()); - Message history = task.getHistory().get(0); - assertEquals("message", history.getKind()); - assertEquals(Message.Role.USER, history.getRole()); - assertEquals("context-1234", history.getContextId()); - assertEquals("message-1234", history.getMessageId()); - assertEquals("9b511af4-b27c-47fa-aecf-2a93c08a44f8", history.getTaskId()); - assertEquals(1, history.getParts().size()); - assertEquals(Kind.TEXT, history.getParts().get(0).getKind()); - assertEquals("tell me a joke", ((TextPart) history.getParts().get(0)).getText()); - assertNull(task.getMetadata()); - assertNull(history.getReferenceTaskIds()); + assertEquals("9b511af4-b27c-47fa-aecf-2a93c08a44f8", task.id()); + assertEquals("context-1234", task.contextId()); + assertEquals(TaskState.SUBMITTED, task.status().state()); + assertNull(task.status().message()); + assertNull(task.metadata()); + assertEquals(true, task.artifacts().isEmpty()); + assertEquals(1, task.history().size()); + Message history = task.history().get(0); + assertEquals("message", history.kind()); + assertEquals(Message.Role.USER, history.role()); + assertEquals("context-1234", history.contextId()); + assertEquals("message-1234", history.messageId()); + assertEquals("9b511af4-b27c-47fa-aecf-2a93c08a44f8", history.taskId()); + assertEquals(1, history.parts().size()); + assertEquals(Kind.TEXT, history.parts().get(0).getKind()); + assertEquals("tell me a joke", ((TextPart) history.parts().get(0)).text()); + assertNull(task.metadata()); + assertNull(history.referenceTaskIds()); } /** @@ -171,11 +171,11 @@ public void testCancelTask() throws Exception { ClientCallContext context = null; RestTransport instance = new RestTransport(CARD); Task task = instance.cancelTask(new TaskIdParams("de38c76d-d54c-436c-8b9f-4c2703648d64"), context); - assertEquals("de38c76d-d54c-436c-8b9f-4c2703648d64", task.getId()); - assertEquals(TaskState.CANCELED, task.getStatus().state()); - assertNull(task.getStatus().message()); - assertNotNull(task.getMetadata()); - assertTrue(task.getMetadata().isEmpty()); + assertEquals("de38c76d-d54c-436c-8b9f-4c2703648d64", task.id()); + assertEquals(TaskState.CANCELED, task.status().state()); + assertNull(task.status().message()); + assertNotNull(task.metadata()); + assertTrue(task.metadata().isEmpty()); } /** @@ -197,37 +197,37 @@ public void testGetTask() throws Exception { TaskQueryParams request = new TaskQueryParams("de38c76d-d54c-436c-8b9f-4c2703648d64", 10); RestTransport instance = new RestTransport(CARD); Task task = instance.getTask(request, context); - assertEquals("de38c76d-d54c-436c-8b9f-4c2703648d64", task.getId()); - assertEquals(TaskState.COMPLETED, task.getStatus().state()); - assertNull(task.getStatus().message()); - assertNotNull(task.getMetadata()); - assertTrue(task.getMetadata().isEmpty()); - assertEquals(false, task.getArtifacts().isEmpty()); - assertEquals(1, task.getArtifacts().size()); - Artifact artifact = task.getArtifacts().get(0); + assertEquals("de38c76d-d54c-436c-8b9f-4c2703648d64", task.id()); + assertEquals(TaskState.COMPLETED, task.status().state()); + assertNull(task.status().message()); + assertNotNull(task.metadata()); + assertTrue(task.metadata().isEmpty()); + assertEquals(false, task.artifacts().isEmpty()); + assertEquals(1, task.artifacts().size()); + Artifact artifact = task.artifacts().get(0); assertEquals("artifact-1", artifact.artifactId()); assertNull(artifact.name()); assertEquals(false, artifact.parts().isEmpty()); assertEquals(Kind.TEXT, artifact.parts().get(0).getKind()); - assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) artifact.parts().get(0)).getText()); - assertEquals(1, task.getHistory().size()); - Message history = task.getHistory().get(0); - assertEquals("message", history.getKind()); - assertEquals(Message.Role.USER, history.getRole()); - assertEquals("message-123", history.getMessageId()); - assertEquals(3, history.getParts().size()); - assertEquals(Kind.TEXT, history.getParts().get(0).getKind()); - assertEquals("tell me a joke", ((TextPart) history.getParts().get(0)).getText()); - assertEquals(Kind.FILE, history.getParts().get(1).getKind()); - FilePart part = (FilePart) history.getParts().get(1); - assertEquals("text/plain", part.getFile().mimeType()); - assertEquals("file:///path/to/file.txt", ((FileWithUri) part.getFile()).uri()); - part = (FilePart) history.getParts().get(2); + assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) artifact.parts().get(0)).text()); + assertEquals(1, task.history().size()); + Message history = task.history().get(0); + assertEquals("message", history.kind()); + assertEquals(Message.Role.USER, history.role()); + assertEquals("message-123", history.messageId()); + assertEquals(3, history.parts().size()); + assertEquals(Kind.TEXT, history.parts().get(0).getKind()); + assertEquals("tell me a joke", ((TextPart) history.parts().get(0)).text()); + assertEquals(Kind.FILE, history.parts().get(1).getKind()); + FilePart part = (FilePart) history.parts().get(1); + assertEquals("text/plain", part.file().mimeType()); + assertEquals("file:///path/to/file.txt", ((FileWithUri) part.file()).uri()); + part = (FilePart) history.parts().get(2); assertEquals(Kind.FILE, part.getKind()); - assertEquals("text/plain", part.getFile().mimeType()); - assertEquals("aGVsbG8=", ((FileWithBytes) part.getFile()).bytes()); - assertNull(history.getMetadata()); - assertNull(history.getReferenceTaskIds()); + assertEquals("text/plain", part.file().mimeType()); + assertEquals("aGVsbG8=", ((FileWithBytes) part.file()).bytes()); + assertNull(history.metadata()); + assertNull(history.referenceTaskIds()); } /** @@ -276,9 +276,9 @@ public void testSendMessageStreaming() throws Exception { boolean eventReceived = latch.await(10, TimeUnit.SECONDS); assertTrue(eventReceived); assertNotNull(receivedEvent.get()); - assertEquals("task", receivedEvent.get().getKind()); + assertEquals("task", receivedEvent.get().kind()); Task task = (Task) receivedEvent.get(); - assertEquals("2", task.getId()); + assertEquals("2", task.id()); } /** @@ -437,16 +437,16 @@ public void testResubscribe() throws Exception { assertNotNull(eventKind); assertInstanceOf(Task.class, eventKind); Task task = (Task) eventKind; - assertEquals("2", task.getId()); - assertEquals("context-1234", task.getContextId()); - assertEquals(TaskState.COMPLETED, task.getStatus().state()); - List artifacts = task.getArtifacts(); + assertEquals("2", task.id()); + assertEquals("context-1234", task.contextId()); + assertEquals(TaskState.COMPLETED, task.status().state()); + List artifacts = task.artifacts(); assertEquals(1, artifacts.size()); Artifact artifact = artifacts.get(0); assertEquals("artifact-1", artifact.artifactId()); assertEquals("joke", artifact.name()); Part part = artifact.parts().get(0); assertEquals(Part.Kind.TEXT, part.getKind()); - assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).getText()); + assertEquals("Why did the chicken cross the road? To get to the other side!", ((TextPart) part).text()); } } diff --git a/client/transport/spi/src/main/java/io/a2a/client/transport/spi/interceptors/auth/AuthInterceptor.java b/client/transport/spi/src/main/java/io/a2a/client/transport/spi/interceptors/auth/AuthInterceptor.java index 8fda4ca49..3573d6784 100644 --- a/client/transport/spi/src/main/java/io/a2a/client/transport/spi/interceptors/auth/AuthInterceptor.java +++ b/client/transport/spi/src/main/java/io/a2a/client/transport/spi/interceptors/auth/AuthInterceptor.java @@ -47,7 +47,7 @@ public PayloadAndHeaders intercept(String methodName, @Nullable Object payload, continue; } if (securityScheme instanceof HTTPAuthSecurityScheme httpAuthSecurityScheme) { - if (httpAuthSecurityScheme.getScheme().toLowerCase(Locale.ROOT).equals(BEARER_SCHEME)) { + if (httpAuthSecurityScheme.scheme().toLowerCase(Locale.ROOT).equals(BEARER_SCHEME)) { updatedHeaders.put(AUTHORIZATION, getBearerValue(credential)); return new PayloadAndHeaders(payload, updatedHeaders); } @@ -56,7 +56,7 @@ public PayloadAndHeaders intercept(String methodName, @Nullable Object payload, updatedHeaders.put(AUTHORIZATION, getBearerValue(credential)); return new PayloadAndHeaders(payload, updatedHeaders); } else if (securityScheme instanceof APIKeySecurityScheme apiKeySecurityScheme) { - updatedHeaders.put(apiKeySecurityScheme.getName(), credential); + updatedHeaders.put(apiKeySecurityScheme.name(), credential); return new PayloadAndHeaders(payload, updatedHeaders); } } diff --git a/examples/cloud-deployment/server/src/main/java/io/a2a/examples/cloud/CloudAgentExecutorProducer.java b/examples/cloud-deployment/server/src/main/java/io/a2a/examples/cloud/CloudAgentExecutorProducer.java index 16632dedb..7ba9f1d76 100644 --- a/examples/cloud-deployment/server/src/main/java/io/a2a/examples/cloud/CloudAgentExecutorProducer.java +++ b/examples/cloud-deployment/server/src/main/java/io/a2a/examples/cloud/CloudAgentExecutorProducer.java @@ -119,10 +119,10 @@ public void cancel(RequestContext context, EventQueue eventQueue) throws JSONRPC */ private String extractTextFromMessage(Message message) { StringBuilder textBuilder = new StringBuilder(); - if (message.getParts() != null) { - for (Part part : message.getParts()) { + if (message.parts() != null) { + for (Part part : message.parts()) { if (part instanceof TextPart textPart) { - textBuilder.append(textPart.getText()); + textBuilder.append(textPart.text()); } } } diff --git a/examples/cloud-deployment/server/src/test/java/io/a2a/examples/cloud/A2ACloudExampleClient.java b/examples/cloud-deployment/server/src/test/java/io/a2a/examples/cloud/A2ACloudExampleClient.java index c4ce1ae36..73d080c45 100644 --- a/examples/cloud-deployment/server/src/test/java/io/a2a/examples/cloud/A2ACloudExampleClient.java +++ b/examples/cloud-deployment/server/src/test/java/io/a2a/examples/cloud/A2ACloudExampleClient.java @@ -156,9 +156,9 @@ private void sendStartMessage(String clientTaskId) { try { nonStreamingClient.sendMessage(startMessage, List.of((ClientEvent event, AgentCard card) -> { if (event instanceof TaskEvent te) { - serverTaskId = te.getTask().getId(); + serverTaskId = te.getTask().id(); System.out.println("✓ Task created: " + serverTaskId); - System.out.println(" State: " + te.getTask().getStatus().state()); + System.out.println(" State: " + te.getTask().status().state()); taskCreationLatch.countDown(); } }), error -> { @@ -239,8 +239,8 @@ private void handleSubscriptionEvent(ClientEvent event, AgentCard card) { } } else if (event instanceof TaskEvent te) { // Check for task completion - if (te.getTask().getStatus().state().isFinal()) { - System.out.println(" Task reached final state: " + te.getTask().getStatus().state()); + if (te.getTask().status().state().isFinal()) { + System.out.println(" Task reached final state: " + te.getTask().status().state()); completionLatch.countDown(); } } @@ -332,7 +332,7 @@ private void sendCompleteMessage() { try { completeClient.sendMessage(completeMessage, List.of((ClientEvent event, AgentCard card) -> { if (event instanceof TaskEvent te) { - System.out.println("✓ Complete message sent, task state: " + te.getTask().getStatus().state()); + System.out.println("✓ Complete message sent, task state: " + te.getTask().status().state()); } }), error -> { System.err.println("✗ Failed to send complete message: " + error.getMessage()); @@ -382,10 +382,10 @@ private void printResults() { private static String extractTextFromArtifact(TaskArtifactUpdateEvent event) { StringBuilder text = new StringBuilder(); - if (event.getArtifact() != null) { - for (Part part : event.getArtifact().parts()) { + if (event.artifact() != null) { + for (Part part : event.artifact().parts()) { if (part instanceof TextPart textPart) { - text.append(textPart.getText()); + text.append(textPart.text()); } } } diff --git a/examples/helloworld/client/src/main/java/io/a2a/examples/helloworld/HelloWorldClient.java b/examples/helloworld/client/src/main/java/io/a2a/examples/helloworld/HelloWorldClient.java index d08386cbd..413efb03c 100644 --- a/examples/helloworld/client/src/main/java/io/a2a/examples/helloworld/HelloWorldClient.java +++ b/examples/helloworld/client/src/main/java/io/a2a/examples/helloworld/HelloWorldClient.java @@ -61,10 +61,10 @@ public static void main(String[] args) { if (event instanceof MessageEvent messageEvent) { Message responseMessage = messageEvent.getMessage(); StringBuilder textBuilder = new StringBuilder(); - if (responseMessage.getParts() != null) { - for (Part part : responseMessage.getParts()) { + if (responseMessage.parts() != null) { + for (Part part : responseMessage.parts()) { if (part instanceof TextPart textPart) { - textBuilder.append(textPart.getText()); + textBuilder.append(textPart.text()); } } } diff --git a/extras/push-notification-config-store-database-jpa/src/test/java/io/a2a/extras/pushnotificationconfigstore/database/jpa/JpaDatabasePushNotificationConfigStoreIntegrationTest.java b/extras/push-notification-config-store-database-jpa/src/test/java/io/a2a/extras/pushnotificationconfigstore/database/jpa/JpaDatabasePushNotificationConfigStoreIntegrationTest.java index 44642ed88..4092f4c1d 100644 --- a/extras/push-notification-config-store-database-jpa/src/test/java/io/a2a/extras/pushnotificationconfigstore/database/jpa/JpaDatabasePushNotificationConfigStoreIntegrationTest.java +++ b/extras/push-notification-config-store-database-jpa/src/test/java/io/a2a/extras/pushnotificationconfigstore/database/jpa/JpaDatabasePushNotificationConfigStoreIntegrationTest.java @@ -90,7 +90,7 @@ public void testDirectNotificationTrigger() { // Verify it was captured Queue captured = mockPushNotificationSender.getCapturedTasks(); assertEquals(1, captured.size()); - assertEquals("direct-test-task", captured.peek().getId()); + assertEquals("direct-test-task", captured.peek().id()); } @Test @@ -165,13 +165,13 @@ public void testJpaDatabasePushNotificationConfigStoreIntegration() throws Excep // Verify the notification contains the correct task with artifacts Task notifiedTaskWithArtifact = capturedTasks.stream() - .filter(t -> taskId.equals(t.getId()) && t.getArtifacts() != null && t.getArtifacts().size() > 0) + .filter(t -> taskId.equals(t.id()) && t.artifacts() != null && t.artifacts().size() > 0) .findFirst() .orElse(null); assertNotNull(notifiedTaskWithArtifact, "Notification should contain the updated task with artifacts"); - assertEquals(taskId, notifiedTaskWithArtifact.getId()); - assertEquals(1, notifiedTaskWithArtifact.getArtifacts().size(), "Task should have one artifact from the update"); + assertEquals(taskId, notifiedTaskWithArtifact.id()); + assertEquals(1, notifiedTaskWithArtifact.artifacts().size(), "Task should have one artifact from the update"); // Step 7: Clean up - delete the push notification configuration client.deleteTaskPushNotificationConfigurations( diff --git a/extras/push-notification-config-store-database-jpa/src/test/java/io/a2a/extras/pushnotificationconfigstore/database/jpa/JpaDatabasePushNotificationConfigStoreTestAgentExecutor.java b/extras/push-notification-config-store-database-jpa/src/test/java/io/a2a/extras/pushnotificationconfigstore/database/jpa/JpaDatabasePushNotificationConfigStoreTestAgentExecutor.java index 09211b4fc..d178b0189 100644 --- a/extras/push-notification-config-store-database-jpa/src/test/java/io/a2a/extras/pushnotificationconfigstore/database/jpa/JpaDatabasePushNotificationConfigStoreTestAgentExecutor.java +++ b/extras/push-notification-config-store-database-jpa/src/test/java/io/a2a/extras/pushnotificationconfigstore/database/jpa/JpaDatabasePushNotificationConfigStoreTestAgentExecutor.java @@ -63,12 +63,12 @@ public void cancel(RequestContext context, EventQueue eventQueue) throws JSONRPC } private String getLastTextPart(Message message) throws JSONRPCError { - if (message.getParts() == null || message.getParts().isEmpty()) { + if (message.parts() == null || message.parts().isEmpty()) { return ""; } - Part part = message.getParts().get(message.getParts().size() - 1); + Part part = message.parts().get(message.parts().size() - 1); if (part.getKind() == Part.Kind.TEXT) { - return ((TextPart) part).getText(); + return ((TextPart) part).text(); } throw new InvalidRequestError("Last part is not text"); } diff --git a/extras/push-notification-config-store-database-jpa/src/test/java/io/a2a/extras/pushnotificationconfigstore/database/jpa/JpaPushNotificationConfigStoreTest.java b/extras/push-notification-config-store-database-jpa/src/test/java/io/a2a/extras/pushnotificationconfigstore/database/jpa/JpaPushNotificationConfigStoreTest.java index 9566453a2..2648cba87 100644 --- a/extras/push-notification-config-store-database-jpa/src/test/java/io/a2a/extras/pushnotificationconfigstore/database/jpa/JpaPushNotificationConfigStoreTest.java +++ b/extras/push-notification-config-store-database-jpa/src/test/java/io/a2a/extras/pushnotificationconfigstore/database/jpa/JpaPushNotificationConfigStoreTest.java @@ -254,8 +254,8 @@ public void testSendNotificationSuccess() throws Exception { // Verify the request body contains the task data String sentBody = bodyCaptor.getValue(); - assertTrue(sentBody.contains(task.getId())); - assertTrue(sentBody.contains(task.getStatus().state().asString())); + assertTrue(sentBody.contains(task.id())); + assertTrue(sentBody.contains(task.status().state().asString())); } @Test @@ -290,8 +290,8 @@ public void testSendNotificationWithToken() throws Exception { // Verify the request body contains the task data String sentBody = bodyCaptor.getValue(); - assertTrue(sentBody.contains(task.getId())); - assertTrue(sentBody.contains(task.getStatus().state().asString())); + assertTrue(sentBody.contains(task.id())); + assertTrue(sentBody.contains(task.status().state().asString())); } @Test diff --git a/extras/queue-manager-replicated/core/src/test/java/io/a2a/extras/queuemanager/replicated/core/EventSerializationTest.java b/extras/queue-manager-replicated/core/src/test/java/io/a2a/extras/queuemanager/replicated/core/EventSerializationTest.java index c53cb610d..8768269b7 100644 --- a/extras/queue-manager-replicated/core/src/test/java/io/a2a/extras/queuemanager/replicated/core/EventSerializationTest.java +++ b/extras/queue-manager-replicated/core/src/test/java/io/a2a/extras/queuemanager/replicated/core/EventSerializationTest.java @@ -61,10 +61,10 @@ public void testTaskSerialization() throws JsonProcessingException { assertInstanceOf(Task.class, deserializedEvent, "Should deserialize to Task"); Task deserializedTask = (Task) deserializedEvent; - assertEquals(originalTask.getId(), deserializedTask.getId()); - assertEquals(originalTask.getKind(), deserializedTask.getKind()); - assertEquals(originalTask.getContextId(), deserializedTask.getContextId()); - assertEquals(originalTask.getStatus().state(), deserializedTask.getStatus().state()); + assertEquals(originalTask.id(), deserializedTask.id()); + assertEquals(originalTask.kind(), deserializedTask.kind()); + assertEquals(originalTask.contextId(), deserializedTask.contextId()); + assertEquals(originalTask.status().state(), deserializedTask.status().state()); // Test as StreamingEventKind StreamingEventKind deserializedAsStreaming = JsonUtil.fromJson(json, StreamingEventKind.class); @@ -92,10 +92,10 @@ public void testMessageSerialization() throws JsonProcessingException { assertInstanceOf(Message.class, deserializedEvent, "Should deserialize to Message"); Message deserializedMessage = (Message) deserializedEvent; - assertEquals(originalMessage.getTaskId(), deserializedMessage.getTaskId()); - assertEquals(originalMessage.getKind(), deserializedMessage.getKind()); - assertEquals(originalMessage.getRole(), deserializedMessage.getRole()); - assertEquals(originalMessage.getParts().size(), deserializedMessage.getParts().size()); + assertEquals(originalMessage.taskId(), deserializedMessage.taskId()); + assertEquals(originalMessage.kind(), deserializedMessage.kind()); + assertEquals(originalMessage.role(), deserializedMessage.role()); + assertEquals(originalMessage.parts().size(), deserializedMessage.parts().size()); // Test as StreamingEventKind StreamingEventKind deserializedAsStreaming = JsonUtil.fromJson(json, StreamingEventKind.class); @@ -124,10 +124,10 @@ public void testTaskStatusUpdateEventSerialization() throws JsonProcessingExcept assertInstanceOf(TaskStatusUpdateEvent.class, deserializedEvent, "Should deserialize to TaskStatusUpdateEvent"); TaskStatusUpdateEvent deserializedStatusEvent = (TaskStatusUpdateEvent) deserializedEvent; - assertEquals(originalEvent.getTaskId(), deserializedStatusEvent.getTaskId()); - assertEquals(originalEvent.getKind(), deserializedStatusEvent.getKind()); - assertEquals(originalEvent.getContextId(), deserializedStatusEvent.getContextId()); - assertEquals(originalEvent.getStatus().state(), deserializedStatusEvent.getStatus().state()); + assertEquals(originalEvent.taskId(), deserializedStatusEvent.taskId()); + assertEquals(originalEvent.kind(), deserializedStatusEvent.kind()); + assertEquals(originalEvent.contextId(), deserializedStatusEvent.contextId()); + assertEquals(originalEvent.status().state(), deserializedStatusEvent.status().state()); assertEquals(originalEvent.isFinal(), deserializedStatusEvent.isFinal()); // Test as StreamingEventKind @@ -157,11 +157,11 @@ public void testTaskArtifactUpdateEventSerialization() throws JsonProcessingExce assertInstanceOf(TaskArtifactUpdateEvent.class, deserializedEvent, "Should deserialize to TaskArtifactUpdateEvent"); TaskArtifactUpdateEvent deserializedArtifactEvent = (TaskArtifactUpdateEvent) deserializedEvent; - assertEquals(originalEvent.getTaskId(), deserializedArtifactEvent.getTaskId()); - assertEquals(originalEvent.getKind(), deserializedArtifactEvent.getKind()); - assertEquals(originalEvent.getContextId(), deserializedArtifactEvent.getContextId()); - assertEquals(originalEvent.getArtifact().artifactId(), deserializedArtifactEvent.getArtifact().artifactId()); - assertEquals(originalEvent.getArtifact().name(), deserializedArtifactEvent.getArtifact().name()); + assertEquals(originalEvent.taskId(), deserializedArtifactEvent.taskId()); + assertEquals(originalEvent.kind(), deserializedArtifactEvent.kind()); + assertEquals(originalEvent.contextId(), deserializedArtifactEvent.contextId()); + assertEquals(originalEvent.artifact().artifactId(), deserializedArtifactEvent.artifact().artifactId()); + assertEquals(originalEvent.artifact().name(), deserializedArtifactEvent.artifact().name()); // Test as StreamingEventKind StreamingEventKind deserializedAsStreaming = JsonUtil.fromJson(json, StreamingEventKind.class); @@ -229,9 +229,9 @@ public void testReplicatedEventWithStreamingEventSerialization() throws JsonProc assertInstanceOf(TaskStatusUpdateEvent.class, retrievedEventAsEvent, "Should deserialize to TaskStatusUpdateEvent"); TaskStatusUpdateEvent retrievedStatusEvent = (TaskStatusUpdateEvent) retrievedEventAsEvent; - assertEquals(statusEvent.getTaskId(), retrievedStatusEvent.getTaskId()); - assertEquals(statusEvent.getContextId(), retrievedStatusEvent.getContextId()); - assertEquals(statusEvent.getStatus().state(), retrievedStatusEvent.getStatus().state()); + assertEquals(statusEvent.taskId(), retrievedStatusEvent.taskId()); + assertEquals(statusEvent.contextId(), retrievedStatusEvent.contextId()); + assertEquals(statusEvent.status().state(), retrievedStatusEvent.status().state()); assertEquals(statusEvent.isFinal(), retrievedStatusEvent.isFinal()); // Test helper methods diff --git a/extras/queue-manager-replicated/tests-multi-instance/quarkus-common/src/main/java/io/a2a/extras/queuemanager/replicated/tests/multiinstance/common/MultiInstanceReplicationAgentExecutor.java b/extras/queue-manager-replicated/tests-multi-instance/quarkus-common/src/main/java/io/a2a/extras/queuemanager/replicated/tests/multiinstance/common/MultiInstanceReplicationAgentExecutor.java index a4b9ae4f2..51aa7ac0c 100644 --- a/extras/queue-manager-replicated/tests-multi-instance/quarkus-common/src/main/java/io/a2a/extras/queuemanager/replicated/tests/multiinstance/common/MultiInstanceReplicationAgentExecutor.java +++ b/extras/queue-manager-replicated/tests-multi-instance/quarkus-common/src/main/java/io/a2a/extras/queuemanager/replicated/tests/multiinstance/common/MultiInstanceReplicationAgentExecutor.java @@ -23,10 +23,10 @@ public void execute(RequestContext context, EventQueue eventQueue) throws JSONRP TaskUpdater updater = new TaskUpdater(context, eventQueue); // Check if message contains "close" signal - boolean shouldClose = context.getMessage().getParts().stream() + boolean shouldClose = context.getMessage().parts().stream() .anyMatch(part -> part instanceof TextPart tp && - tp.getText() != null && - tp.getText().toLowerCase().contains("close")); + tp.text() != null && + tp.text().toLowerCase().contains("close")); if (shouldClose) { // Close the task @@ -36,7 +36,7 @@ public void execute(RequestContext context, EventQueue eventQueue) throws JSONRP updater.submit(); } else { // Subsequent messages - add as artifact - updater.addArtifact(context.getMessage().getParts()); + updater.addArtifact(context.getMessage().parts()); } } diff --git a/extras/queue-manager-replicated/tests-multi-instance/tests/src/test/java/io/a2a/extras/queuemanager/replicated/tests/multiinstance/MultiInstanceReplicationTest.java b/extras/queue-manager-replicated/tests-multi-instance/tests/src/test/java/io/a2a/extras/queuemanager/replicated/tests/multiinstance/MultiInstanceReplicationTest.java index 2f3a3dbaa..93093388d 100644 --- a/extras/queue-manager-replicated/tests-multi-instance/tests/src/test/java/io/a2a/extras/queuemanager/replicated/tests/multiinstance/MultiInstanceReplicationTest.java +++ b/extras/queue-manager-replicated/tests-multi-instance/tests/src/test/java/io/a2a/extras/queuemanager/replicated/tests/multiinstance/MultiInstanceReplicationTest.java @@ -276,7 +276,7 @@ public void testMultiInstanceEventReplication() throws Exception { assertNotNull(createdTask, "Task should be created"); // Task should be in a non-final state (SUBMITTED or WORKING are both valid) - TaskState state = createdTask.getStatus().state(); + TaskState state = createdTask.status().state(); assertTrue(state == TaskState.SUBMITTED || state == TaskState.WORKING, "Task should be in SUBMITTED or WORKING state, but was: " + state); nonStreamingClient.close(); diff --git a/extras/queue-manager-replicated/tests-single-instance/src/test/java/io/a2a/extras/queuemanager/replicated/tests/KafkaReplicationIntegrationTest.java b/extras/queue-manager-replicated/tests-single-instance/src/test/java/io/a2a/extras/queuemanager/replicated/tests/KafkaReplicationIntegrationTest.java index 58fa7f886..029aa9a62 100644 --- a/extras/queue-manager-replicated/tests-single-instance/src/test/java/io/a2a/extras/queuemanager/replicated/tests/KafkaReplicationIntegrationTest.java +++ b/extras/queue-manager-replicated/tests-single-instance/src/test/java/io/a2a/extras/queuemanager/replicated/tests/KafkaReplicationIntegrationTest.java @@ -155,8 +155,8 @@ public void testA2AMessageReplicatedToKafka() throws Exception { Task task = createdTask.get(); assertNotNull(task, "Task should be created"); - assertEquals(taskId, task.getId()); - assertEquals(TaskState.SUBMITTED, task.getStatus().state()); + assertEquals(taskId, task.id()); + assertEquals(TaskState.SUBMITTED, task.status().state()); // Wait for the event to be replicated to Kafka ReplicatedEventQueueItem replicatedEvent = testConsumer.waitForEvent(taskId, 30); @@ -173,11 +173,11 @@ public void testA2AMessageReplicatedToKafka() throws Exception { TaskStatusUpdateEvent statusUpdateEvent = (TaskStatusUpdateEvent) receivedEvent; // Verify the event data is consistent with the task returned from the client - assertEquals(taskId, statusUpdateEvent.getTaskId(), "Event task ID should match original task ID"); - assertEquals(contextId, statusUpdateEvent.getContextId(), "Event context ID should match original context ID"); - assertEquals(TaskState.SUBMITTED, statusUpdateEvent.getStatus().state(), "Event should show SUBMITTED state"); + assertEquals(taskId, statusUpdateEvent.taskId(), "Event task ID should match original task ID"); + assertEquals(contextId, statusUpdateEvent.contextId(), "Event context ID should match original context ID"); + assertEquals(TaskState.SUBMITTED, statusUpdateEvent.status().state(), "Event should show SUBMITTED state"); assertFalse(statusUpdateEvent.isFinal(), "Event should show final:false"); - assertEquals("status-update", statusUpdateEvent.getKind(), "Event should indicate status-update type"); + assertEquals("status-update", statusUpdateEvent.kind(), "Event should indicate status-update type"); } @Test @@ -212,7 +212,7 @@ public void testKafkaEventReceivedByA2AServer() throws Exception { assertTrue(createLatch.await(15, TimeUnit.SECONDS), "Task creation timed out"); Task initialTask = createdTask.get(); assertNotNull(initialTask, "Task should be created"); - assertEquals(TaskState.SUBMITTED, initialTask.getStatus().state(), "Initial task should be in SUBMITTED state"); + assertEquals(TaskState.SUBMITTED, initialTask.status().state(), "Initial task should be in SUBMITTED state"); // Add a small delay to ensure the task is fully processed before resubscription Thread.sleep(1000); @@ -227,7 +227,7 @@ public void testKafkaEventReceivedByA2AServer() throws Exception { BiConsumer consumer = (event, agentCard) -> { if (event instanceof TaskUpdateEvent taskUpdateEvent) { if (taskUpdateEvent.getUpdateEvent() instanceof TaskStatusUpdateEvent statusEvent) { - if (statusEvent.getStatus().state() == TaskState.COMPLETED) { + if (statusEvent.status().state() == TaskState.COMPLETED) { receivedCompletedEvent.set(statusEvent); resubscribeLatch.countDown(); } @@ -277,10 +277,10 @@ public void testKafkaEventReceivedByA2AServer() throws Exception { // Verify the received event TaskStatusUpdateEvent completedEvent = receivedCompletedEvent.get(); assertNotNull(completedEvent, "Should have received a TaskStatusUpdateEvent"); - assertEquals(TaskState.COMPLETED, completedEvent.getStatus().state(), "Event should show COMPLETED state"); + assertEquals(TaskState.COMPLETED, completedEvent.status().state(), "Event should show COMPLETED state"); assertTrue(completedEvent.isFinal(), "Event should be marked as final"); - assertEquals(taskId, completedEvent.getTaskId(), "Event should have correct task ID"); - assertEquals(contextId, completedEvent.getContextId(), "Event should have correct context ID"); + assertEquals(taskId, completedEvent.taskId(), "Event should have correct task ID"); + assertEquals(contextId, completedEvent.contextId(), "Event should have correct context ID"); // Note: We do NOT verify TaskStore state here because replicated events intentionally // skip TaskStore updates to avoid duplicates. The TaskStore is updated on the originating @@ -311,11 +311,11 @@ public void testQueueClosedEventTerminatesRemoteSubscribers() throws Exception { pollingClient.sendMessage(workingMessage, List.of((ClientEvent event, AgentCard card) -> { if (event instanceof TaskEvent taskEvent) { - taskIdRef.set(taskEvent.getTask().getId()); + taskIdRef.set(taskEvent.getTask().id()); workingLatch.countDown(); } else if (event instanceof TaskUpdateEvent tue && tue.getUpdateEvent() instanceof TaskStatusUpdateEvent status) { - if (status.getStatus().state() == TaskState.WORKING) { - taskIdRef.set(status.getTaskId()); + if (status.status().state() == TaskState.WORKING) { + taskIdRef.set(status.taskId()); workingLatch.countDown(); } } diff --git a/extras/queue-manager-replicated/tests-single-instance/src/test/java/io/a2a/extras/queuemanager/replicated/tests/ReplicationTestAgentExecutor.java b/extras/queue-manager-replicated/tests-single-instance/src/test/java/io/a2a/extras/queuemanager/replicated/tests/ReplicationTestAgentExecutor.java index 4db27cb14..e00282cbe 100644 --- a/extras/queue-manager-replicated/tests-single-instance/src/test/java/io/a2a/extras/queuemanager/replicated/tests/ReplicationTestAgentExecutor.java +++ b/extras/queue-manager-replicated/tests-single-instance/src/test/java/io/a2a/extras/queuemanager/replicated/tests/ReplicationTestAgentExecutor.java @@ -64,12 +64,12 @@ public void cancel(RequestContext context, EventQueue eventQueue) throws JSONRPC } private String getLastTextPart(Message message) throws JSONRPCError { - if (message.getParts().isEmpty()) { + if (message.parts().isEmpty()) { throw new InvalidRequestError("No parts in message"); } - Part part = message.getParts().get(message.getParts().size() - 1); + Part part = message.parts().get(message.parts().size() - 1); if (part.getKind() == Part.Kind.TEXT) { - return ((TextPart) part).getText(); + return ((TextPart) part).text(); } throw new InvalidRequestError("Last part is not text"); } diff --git a/extras/task-store-database-jpa/src/main/java/io/a2a/extras/taskstore/database/jpa/JpaDatabaseTaskStore.java b/extras/task-store-database-jpa/src/main/java/io/a2a/extras/taskstore/database/jpa/JpaDatabaseTaskStore.java index bbad23953..df65f290e 100644 --- a/extras/task-store-database-jpa/src/main/java/io/a2a/extras/taskstore/database/jpa/JpaDatabaseTaskStore.java +++ b/extras/task-store-database-jpa/src/main/java/io/a2a/extras/taskstore/database/jpa/JpaDatabaseTaskStore.java @@ -65,22 +65,22 @@ void initConfig() { @Transactional @Override public void save(Task task) { - LOGGER.debug("Saving task with ID: {}", task.getId()); + LOGGER.debug("Saving task with ID: {}", task.id()); try { JpaTask jpaTask = JpaTask.createFromTask(task); em.merge(jpaTask); - LOGGER.debug("Persisted/updated task with ID: {}", task.getId()); + LOGGER.debug("Persisted/updated task with ID: {}", task.id()); - if (task.getStatus() != null && task.getStatus().state() != null && task.getStatus().state().isFinal()) { + if (task.status() != null && task.status().state() != null && task.status().state().isFinal()) { // Fire CDI event if task reached final state // IMPORTANT: The event will be delivered AFTER transaction commits (AFTER_SUCCESS observers) // This ensures the task's final state is durably stored before the QueueClosedEvent poison pill is sent - LOGGER.debug("Task {} is in final state, firing TaskFinalizedEvent", task.getId()); - taskFinalizedEvent.fire(new TaskFinalizedEvent(task.getId())); + LOGGER.debug("Task {} is in final state, firing TaskFinalizedEvent", task.id()); + taskFinalizedEvent.fire(new TaskFinalizedEvent(task.id())); } } catch (JsonProcessingException e) { - LOGGER.error("Failed to serialize task with ID: {}", task.getId(), e); - throw new RuntimeException("Failed to serialize task with ID: " + task.getId(), e); + LOGGER.error("Failed to serialize task with ID: {}", task.id(), e); + throw new RuntimeException("Failed to serialize task with ID: " + task.id(), e); } } @@ -147,7 +147,7 @@ public boolean isTaskActive(String taskId) { Task task = jpaTask.getTask(); // Task is active if not in final state - if (task.getStatus() == null || task.getStatus().state() == null || !task.getStatus().state().isFinal()) { + if (task.status() == null || task.status().state() == null || !task.status().state().isFinal()) { LOGGER.debug("Task is not in final state, considering active: {}", taskId); return true; } @@ -207,9 +207,9 @@ public boolean isTaskFinalized(String taskId) { Task task = jpaTask.getTask(); // Task is finalized if in final state (ignore grace period) - boolean isFinalized = task.getStatus() != null - && task.getStatus().state() != null - && task.getStatus().state().isFinal(); + boolean isFinalized = task.status() != null + && task.status().state() != null + && task.status().state().isFinal(); LOGGER.debug("Task {} finalization check: {}", taskId, isFinalized); return isFinalized; @@ -343,8 +343,8 @@ public ListTasksResult list(ListTasksParams params) { if (hasMore && !tasks.isEmpty()) { Task lastTask = tasks.get(tasks.size() - 1); // All tasks have timestamps (TaskStatus canonical constructor ensures this) - long timestampMillis = lastTask.getStatus().timestamp().toInstant().toEpochMilli(); - nextPageToken = timestampMillis + ":" + lastTask.getId(); + long timestampMillis = lastTask.status().timestamp().toInstant().toEpochMilli(); + nextPageToken = timestampMillis + ":" + lastTask.id(); } // Apply post-processing transformations (history limiting, artifact removal) @@ -361,16 +361,16 @@ public ListTasksResult list(ListTasksParams params) { private Task transformTask(Task task, int historyLength, boolean includeArtifacts) { // Limit history if needed (keep most recent N messages) - List history = task.getHistory(); + List history = task.history(); if (historyLength > 0 && history != null && history.size() > historyLength) { history = history.subList(history.size() - historyLength, history.size()); } // Remove artifacts if not requested - List artifacts = includeArtifacts ? task.getArtifacts() : List.of(); + List artifacts = includeArtifacts ? task.artifacts() : List.of(); // If no transformation needed, return original task - if (history == task.getHistory() && artifacts == task.getArtifacts()) { + if (history == task.history() && artifacts == task.artifacts()) { return task; } diff --git a/extras/task-store-database-jpa/src/main/java/io/a2a/extras/taskstore/database/jpa/JpaTask.java b/extras/task-store-database-jpa/src/main/java/io/a2a/extras/taskstore/database/jpa/JpaTask.java index 7253515ad..3aabad9d7 100644 --- a/extras/task-store-database-jpa/src/main/java/io/a2a/extras/taskstore/database/jpa/JpaTask.java +++ b/extras/task-store-database-jpa/src/main/java/io/a2a/extras/taskstore/database/jpa/JpaTask.java @@ -117,7 +117,7 @@ public Task getTask() throws JsonProcessingException { public void setTask(Task task) throws JsonProcessingException { taskJson = JsonUtil.toJson(task); if (id == null) { - id = task.getId(); + id = task.id(); } this.task = task; updateDenormalizedFields(task); @@ -126,7 +126,7 @@ public void setTask(Task task) throws JsonProcessingException { static JpaTask createFromTask(Task task) throws JsonProcessingException { String json = JsonUtil.toJson(task); - JpaTask jpaTask = new JpaTask(task.getId(), json); + JpaTask jpaTask = new JpaTask(task.id(), json); jpaTask.task = task; jpaTask.updateDenormalizedFields(task); jpaTask.updateFinalizedTimestamp(task); @@ -140,14 +140,14 @@ static JpaTask createFromTask(Task task) throws JsonProcessingException { * @param task the task to extract fields from */ private void updateDenormalizedFields(Task task) { - this.contextId = task.getContextId(); - if (task.getStatus() != null) { - io.a2a.spec.TaskState taskState = task.getStatus().state(); + this.contextId = task.contextId(); + if (task.status() != null) { + io.a2a.spec.TaskState taskState = task.status().state(); this.state = (taskState != null) ? taskState.asString() : null; // Extract status timestamp for efficient querying and sorting // Truncate to milliseconds for keyset pagination consistency (pageToken uses millis) - this.statusTimestamp = (task.getStatus().timestamp() != null) - ? task.getStatus().timestamp().toInstant().truncatedTo(java.time.temporal.ChronoUnit.MILLIS) + this.statusTimestamp = (task.status().timestamp() != null) + ? task.status().timestamp().toInstant().truncatedTo(java.time.temporal.ChronoUnit.MILLIS) : null; } else { this.state = null; @@ -162,8 +162,8 @@ private void updateDenormalizedFields(Task task) { * @param task the task to check for finalization */ private void updateFinalizedTimestamp(Task task) { - if (task.getStatus() != null && task.getStatus().state() != null) { - setFinalizedAt(Instant.now(), task.getStatus().state().isFinal()); + if (task.status() != null && task.status().state() != null) { + setFinalizedAt(Instant.now(), task.status().state().isFinal()); } } } diff --git a/extras/task-store-database-jpa/src/test/java/io/a2a/extras/taskstore/database/jpa/JpaDatabaseTaskStoreIntegrationTest.java b/extras/task-store-database-jpa/src/test/java/io/a2a/extras/taskstore/database/jpa/JpaDatabaseTaskStoreIntegrationTest.java index a5d1aea91..1fa3c3e99 100644 --- a/extras/task-store-database-jpa/src/test/java/io/a2a/extras/taskstore/database/jpa/JpaDatabaseTaskStoreIntegrationTest.java +++ b/extras/task-store-database-jpa/src/test/java/io/a2a/extras/taskstore/database/jpa/JpaDatabaseTaskStoreIntegrationTest.java @@ -99,8 +99,8 @@ public void testJpaDatabaseTaskStore() throws Exception { assertTrue(latch.await(10, TimeUnit.SECONDS), "Timeout waiting for task creation"); Task createdTask = taskRef.get(); assertNotNull(createdTask); - assertEquals(0, createdTask.getArtifacts().size()); - assertEquals(TaskState.SUBMITTED, createdTask.getStatus().state()); + assertEquals(0, createdTask.artifacts().size()); + assertEquals(TaskState.SUBMITTED, createdTask.status().state()); // Send a message updating the Task userMessage = Message.builder() @@ -128,24 +128,24 @@ public void testJpaDatabaseTaskStore() throws Exception { assertTrue(latch2.await(10, TimeUnit.SECONDS), "Timeout waiting for task creation"); Task updatedTask = taskRef2.get(); assertNotNull(updatedTask); - assertEquals(1, updatedTask.getArtifacts().size()); - assertEquals(TaskState.SUBMITTED, updatedTask.getStatus().state()); + assertEquals(1, updatedTask.artifacts().size()); + assertEquals(TaskState.SUBMITTED, updatedTask.status().state()); Task retrievedTask = client.getTask(new TaskQueryParams(taskId), null); assertNotNull(retrievedTask); - assertEquals(1, retrievedTask.getArtifacts().size()); - assertEquals(TaskState.SUBMITTED, retrievedTask.getStatus().state()); + assertEquals(1, retrievedTask.artifacts().size()); + assertEquals(TaskState.SUBMITTED, retrievedTask.status().state()); // Cancel the task Task cancelledTask = client.cancelTask(new TaskIdParams(taskId), null); assertNotNull(cancelledTask); - assertEquals(1, cancelledTask.getArtifacts().size()); - assertEquals(TaskState.CANCELED, cancelledTask.getStatus().state()); + assertEquals(1, cancelledTask.artifacts().size()); + assertEquals(TaskState.CANCELED, cancelledTask.status().state()); Task retrievedCancelledTask = client.getTask(new TaskQueryParams(taskId), null); assertNotNull(retrievedCancelledTask); - assertEquals(1, retrievedCancelledTask.getArtifacts().size()); - assertEquals(TaskState.CANCELED, retrievedCancelledTask.getStatus().state()); + assertEquals(1, retrievedCancelledTask.artifacts().size()); + assertEquals(TaskState.CANCELED, retrievedCancelledTask.status().state()); // None of the framework code deletes tasks, so just do this manually taskStore.delete(taskId); diff --git a/extras/task-store-database-jpa/src/test/java/io/a2a/extras/taskstore/database/jpa/JpaDatabaseTaskStoreTest.java b/extras/task-store-database-jpa/src/test/java/io/a2a/extras/taskstore/database/jpa/JpaDatabaseTaskStoreTest.java index 42c9304f0..cfb4eadc8 100644 --- a/extras/task-store-database-jpa/src/test/java/io/a2a/extras/taskstore/database/jpa/JpaDatabaseTaskStoreTest.java +++ b/extras/task-store-database-jpa/src/test/java/io/a2a/extras/taskstore/database/jpa/JpaDatabaseTaskStoreTest.java @@ -60,9 +60,9 @@ public void testSaveAndRetrieveTask() { Task retrieved = taskStore.get("test-task-1"); assertNotNull(retrieved); - assertEquals("test-task-1", retrieved.getId()); - assertEquals("test-context-1", retrieved.getContextId()); - assertEquals(TaskState.SUBMITTED, retrieved.getStatus().state()); + assertEquals("test-task-1", retrieved.id()); + assertEquals("test-context-1", retrieved.contextId()); + assertEquals(TaskState.SUBMITTED, retrieved.status().state()); } @Test @@ -90,12 +90,12 @@ public void testSaveAndRetrieveTaskWithHistory() { Task retrieved = taskStore.get("test-task-2"); assertNotNull(retrieved); - assertEquals("test-task-2", retrieved.getId()); - assertEquals("test-context-2", retrieved.getContextId()); - assertEquals(TaskState.WORKING, retrieved.getStatus().state()); - assertEquals(1, retrieved.getHistory().size()); - assertEquals("msg-1", retrieved.getHistory().get(0).getMessageId()); - assertEquals("Hello, agent!", ((TextPart) retrieved.getHistory().get(0).getParts().get(0)).getText()); + assertEquals("test-task-2", retrieved.id()); + assertEquals("test-context-2", retrieved.contextId()); + assertEquals(TaskState.WORKING, retrieved.status().state()); + assertEquals(1, retrieved.history().size()); + assertEquals("msg-1", retrieved.history().get(0).messageId()); + assertEquals("Hello, agent!", ((TextPart) retrieved.history().get(0).parts().get(0)).text()); } @Test @@ -123,8 +123,8 @@ public void testUpdateExistingTask() { Task retrieved = taskStore.get("test-task-3"); assertNotNull(retrieved); - assertEquals("test-task-3", retrieved.getId()); - assertEquals(TaskState.COMPLETED, retrieved.getStatus().state()); + assertEquals("test-task-3", retrieved.id()); + assertEquals(TaskState.COMPLETED, retrieved.status().state()); } @Test @@ -184,11 +184,11 @@ public void testTaskWithComplexMetadata() { Task retrieved = taskStore.get("test-task-5"); assertNotNull(retrieved); - assertEquals("test-task-5", retrieved.getId()); - assertNotNull(retrieved.getMetadata()); - assertEquals("value1", retrieved.getMetadata().get("key1")); - assertEquals(42, ((Number)retrieved.getMetadata().get("key2")).intValue()); - assertEquals(true, retrieved.getMetadata().get("key3")); + assertEquals("test-task-5", retrieved.id()); + assertNotNull(retrieved.metadata()); + assertEquals("value1", retrieved.metadata().get("key1")); + assertEquals(42, ((Number)retrieved.metadata().get("key2")).intValue()); + assertEquals(true, retrieved.metadata().get("key3")); } @Test @@ -336,7 +336,7 @@ public void testListTasksFilterByContextId() { assertEquals(2, result.totalSize()); assertEquals(2, result.pageSize()); assertEquals(2, result.tasks().size()); - assertTrue(result.tasks().stream().allMatch(t -> "context-A".equals(t.getContextId()))); + assertTrue(result.tasks().stream().allMatch(t -> "context-A".equals(t.contextId()))); } @Test @@ -376,7 +376,7 @@ public void testListTasksFilterByStatus() { assertEquals(1, result.totalSize()); assertEquals(1, result.pageSize()); assertEquals(1, result.tasks().size()); - assertEquals(TaskState.WORKING, result.tasks().get(0).getStatus().state()); + assertEquals(TaskState.WORKING, result.tasks().get(0).status().state()); } @Test @@ -415,9 +415,9 @@ public void testListTasksCombinedFilters() { assertEquals(1, result.totalSize()); assertEquals(1, result.pageSize()); - assertEquals("task-combined-2", result.tasks().get(0).getId()); - assertEquals("context-X", result.tasks().get(0).getContextId()); - assertEquals(TaskState.WORKING, result.tasks().get(0).getStatus().state()); + assertEquals("task-combined-2", result.tasks().get(0).id()); + assertEquals("context-X", result.tasks().get(0).contextId()); + assertEquals(TaskState.WORKING, result.tasks().get(0).status().state()); } @Test @@ -542,8 +542,8 @@ public void testListTasksPaginationWithDifferentTimestamps() { assertNotNull(result1.nextPageToken(), "Should have next page token"); // Verify first page order - assertEquals("task-diff-d", result1.tasks().get(0).getId(), "First task should be most recent"); - assertEquals("task-diff-e", result1.tasks().get(1).getId(), "Second task should be 1 min ago"); + assertEquals("task-diff-d", result1.tasks().get(0).id(), "First task should be most recent"); + assertEquals("task-diff-e", result1.tasks().get(1).id(), "Second task should be 1 min ago"); // Verify pageToken format: "timestamp_millis:taskId" assertTrue(result1.nextPageToken().contains(":"), "PageToken should have format timestamp:id"); @@ -565,8 +565,8 @@ public void testListTasksPaginationWithDifferentTimestamps() { assertNotNull(result2.nextPageToken(), "Should have next page token"); // Verify second page order (tasks with same timestamp, sorted by ID) - assertEquals("task-diff-b", result2.tasks().get(0).getId(), "Third task should be 5 min ago, ID 'b'"); - assertEquals("task-diff-c", result2.tasks().get(1).getId(), "Fourth task should be 5 min ago, ID 'c'"); + assertEquals("task-diff-b", result2.tasks().get(0).id(), "Third task should be 5 min ago, ID 'b'"); + assertEquals("task-diff-c", result2.tasks().get(1).id(), "Fourth task should be 5 min ago, ID 'c'"); // Page 3: Get last task ListTasksParams params3 = ListTasksParams.builder() @@ -582,13 +582,13 @@ public void testListTasksPaginationWithDifferentTimestamps() { assertNull(result3.nextPageToken(), "Last page should have no next page token"); // Verify last task - assertEquals("task-diff-a", result3.tasks().get(0).getId(), "Last task should be oldest"); + assertEquals("task-diff-a", result3.tasks().get(0).id(), "Last task should be oldest"); // Verify no duplicates across all pages List allTaskIds = new ArrayList<>(); - allTaskIds.addAll(result1.tasks().stream().map(Task::getId).toList()); - allTaskIds.addAll(result2.tasks().stream().map(Task::getId).toList()); - allTaskIds.addAll(result3.tasks().stream().map(Task::getId).toList()); + allTaskIds.addAll(result1.tasks().stream().map(Task::id).toList()); + allTaskIds.addAll(result2.tasks().stream().map(Task::id).toList()); + allTaskIds.addAll(result3.tasks().stream().map(Task::id).toList()); assertEquals(5, allTaskIds.size(), "Should have exactly 5 tasks across all pages"); assertEquals(5, allTaskIds.stream().distinct().count(), "Should have no duplicate tasks"); @@ -628,11 +628,11 @@ public void testListTasksHistoryLimiting() { assertEquals(1, result.tasks().size()); Task retrieved = result.tasks().get(0); - assertEquals(3, retrieved.getHistory().size()); + assertEquals(3, retrieved.history().size()); // Should have messages 8, 9, 10 (last 3) - assertEquals("msg-history-limit-8", retrieved.getHistory().get(0).getMessageId()); - assertEquals("msg-history-limit-9", retrieved.getHistory().get(1).getMessageId()); - assertEquals("msg-history-limit-10", retrieved.getHistory().get(2).getMessageId()); + assertEquals("msg-history-limit-8", retrieved.history().get(0).messageId()); + assertEquals("msg-history-limit-9", retrieved.history().get(1).messageId()); + assertEquals("msg-history-limit-10", retrieved.history().get(2).messageId()); } @Test @@ -664,7 +664,7 @@ public void testListTasksArtifactInclusion() { ListTasksResult resultWithout = taskStore.list(paramsWithoutArtifacts); assertEquals(1, resultWithout.tasks().size()); - assertTrue(resultWithout.tasks().get(0).getArtifacts().isEmpty(), + assertTrue(resultWithout.tasks().get(0).artifacts().isEmpty(), "By default, artifacts should be excluded"); // List with artifacts - filter by unique context @@ -676,9 +676,9 @@ public void testListTasksArtifactInclusion() { ListTasksResult resultWith = taskStore.list(paramsWithArtifacts); assertEquals(1, resultWith.tasks().size()); - assertEquals(1, resultWith.tasks().get(0).getArtifacts().size(), + assertEquals(1, resultWith.tasks().get(0).artifacts().size(), "When includeArtifacts=true, artifacts should be included"); - assertEquals("artifact-unique-1", resultWith.tasks().get(0).getArtifacts().get(0).artifactId()); + assertEquals("artifact-unique-1", resultWith.tasks().get(0).artifacts().get(0).artifactId()); } @Test @@ -789,8 +789,8 @@ public void testListTasksOrderingById() { ListTasksResult result = taskStore.list(params); assertEquals(3, result.tasks().size()); - assertEquals("task-order-a", result.tasks().get(0).getId()); - assertEquals("task-order-b", result.tasks().get(1).getId()); - assertEquals("task-order-c", result.tasks().get(2).getId()); + assertEquals("task-order-a", result.tasks().get(0).id()); + assertEquals("task-order-b", result.tasks().get(1).id()); + assertEquals("task-order-c", result.tasks().get(2).id()); } } diff --git a/extras/task-store-database-jpa/src/test/java/io/a2a/extras/taskstore/database/jpa/JpaDatabaseTaskStoreTestAgentExecutor.java b/extras/task-store-database-jpa/src/test/java/io/a2a/extras/taskstore/database/jpa/JpaDatabaseTaskStoreTestAgentExecutor.java index 8e4a1c8eb..374eee549 100644 --- a/extras/task-store-database-jpa/src/test/java/io/a2a/extras/taskstore/database/jpa/JpaDatabaseTaskStoreTestAgentExecutor.java +++ b/extras/task-store-database-jpa/src/test/java/io/a2a/extras/taskstore/database/jpa/JpaDatabaseTaskStoreTestAgentExecutor.java @@ -55,9 +55,9 @@ public void cancel(RequestContext context, EventQueue eventQueue) throws JSONRPC } private String getLastTextPart(Message message) throws JSONRPCError { - Part part = message.getParts().get(message.getParts().size() - 1); + Part part = message.parts().get(message.parts().size() - 1); if (part.getKind() == Part.Kind.TEXT) { - return ((TextPart) part).getText(); + return ((TextPart) part).text(); } throw new InvalidRequestError("No parts"); } diff --git a/server-common/src/main/java/io/a2a/server/agentexecution/RequestContext.java b/server-common/src/main/java/io/a2a/server/agentexecution/RequestContext.java index 308d1d44c..89d166801 100644 --- a/server-common/src/main/java/io/a2a/server/agentexecution/RequestContext.java +++ b/server-common/src/main/java/io/a2a/server/agentexecution/RequestContext.java @@ -42,12 +42,12 @@ public RequestContext( // If the taskId and contextId were specified, they must match the params if (params != null) { - if (taskId != null && !taskId.equals(params.message().getTaskId())) { + if (taskId != null && !taskId.equals(params.message().taskId())) { throw new InvalidParamsError("bad task id"); } else { checkOrGenerateTaskId(); } - if (contextId != null && !contextId.equals(params.message().getContextId())) { + if (contextId != null && !contextId.equals(params.message().contextId())) { throw new InvalidParamsError("bad context id"); } else { checkOrGenerateContextId(); @@ -105,11 +105,16 @@ private void checkOrGenerateTaskId() { if (params == null) { return; } - if (taskId == null && params.message().getTaskId() == null) { - params.message().setTaskId(UUID.randomUUID().toString()); - } - if (params.message().getTaskId() != null) { - this.taskId = params.message().getTaskId(); + if (taskId == null && params.message().taskId() == null) { + // Message is immutable, create new one with generated taskId + String generatedTaskId = UUID.randomUUID().toString(); + Message updatedMessage = Message.builder(params.message()) + .taskId(generatedTaskId) + .build(); + params = new MessageSendParams(updatedMessage, params.configuration(), params.metadata()); + this.taskId = generatedTaskId; + } else if (params.message().taskId() != null) { + this.taskId = params.message().taskId(); } } @@ -117,16 +122,21 @@ private void checkOrGenerateContextId() { if (params == null) { return; } - if (contextId == null && params.message().getContextId() == null) { - params.message().setContextId(UUID.randomUUID().toString()); - } - if (params.message().getContextId() != null) { - this.contextId = params.message().getContextId(); + if (contextId == null && params.message().contextId() == null) { + // Message is immutable, create new one with generated contextId + String generatedContextId = UUID.randomUUID().toString(); + Message updatedMessage = Message.builder(params.message()) + .contextId(generatedContextId) + .build(); + params = new MessageSendParams(updatedMessage, params.configuration(), params.metadata()); + this.contextId = generatedContextId; + } else if (params.message().contextId() != null) { + this.contextId = params.message().contextId(); } } private String getMessageText(Message message, String delimiter) { - List textParts = getTextParts(message.getParts()); + List textParts = getTextParts(message.parts()); return String.join(delimiter, textParts); } @@ -134,7 +144,7 @@ private List getTextParts(List> parts) { return parts.stream() .filter(part -> part.getKind() == Part.Kind.TEXT) .map(part -> (TextPart) part) - .map(TextPart::getText) + .map(TextPart::text) .collect(Collectors.toList()); } diff --git a/server-common/src/main/java/io/a2a/server/agentexecution/SimpleRequestContextBuilder.java b/server-common/src/main/java/io/a2a/server/agentexecution/SimpleRequestContextBuilder.java index 933258a45..573d0e879 100644 --- a/server-common/src/main/java/io/a2a/server/agentexecution/SimpleRequestContextBuilder.java +++ b/server-common/src/main/java/io/a2a/server/agentexecution/SimpleRequestContextBuilder.java @@ -19,9 +19,9 @@ public SimpleRequestContextBuilder(TaskStore taskStore, boolean shouldPopulateRe public RequestContext build() { List relatedTasks = null; if (taskStore != null && shouldPopulateReferredTasks && getParams() != null - && getParams().message().getReferenceTaskIds() != null) { + && getParams().message().referenceTaskIds() != null) { relatedTasks = new ArrayList<>(); - for (String taskId : getParams().message().getReferenceTaskIds()) { + for (String taskId : getParams().message().referenceTaskIds()) { Task task = taskStore.get(taskId); if (task != null) { relatedTasks.add(task); diff --git a/server-common/src/main/java/io/a2a/server/events/EventConsumer.java b/server-common/src/main/java/io/a2a/server/events/EventConsumer.java index b6ff7abce..d4fd7b682 100644 --- a/server-common/src/main/java/io/a2a/server/events/EventConsumer.java +++ b/server-common/src/main/java/io/a2a/server/events/EventConsumer.java @@ -78,7 +78,7 @@ public Flow.Publisher consumeAll() { } else if (event instanceof Message) { isFinalEvent = true; } else if (event instanceof Task task) { - isFinalEvent = task.getStatus().state().isFinal(); + isFinalEvent = task.status().state().isFinal(); } else if (event instanceof QueueClosedEvent) { // Poison pill event - signals queue closure from remote node // Do NOT send to subscribers - just close the queue diff --git a/server-common/src/main/java/io/a2a/server/requesthandlers/DefaultRequestHandler.java b/server-common/src/main/java/io/a2a/server/requesthandlers/DefaultRequestHandler.java index 334c1f368..00f4c3ad9 100644 --- a/server-common/src/main/java/io/a2a/server/requesthandlers/DefaultRequestHandler.java +++ b/server-common/src/main/java/io/a2a/server/requesthandlers/DefaultRequestHandler.java @@ -175,13 +175,13 @@ public Task onGetTask(TaskQueryParams params, ServerCallContext context) throws * @return the task with limited history, or the original task if no limiting needed */ private static Task limitTaskHistory(Task task, @Nullable Integer historyLength) { - if (task.getHistory() == null || historyLength == null || historyLength >= task.getHistory().size()) { + if (task.history() == null || historyLength == null || historyLength >= task.history().size()) { return task; } // Keep only the most recent historyLength messages - List limitedHistory = task.getHistory().subList( - task.getHistory().size() - historyLength, - task.getHistory().size()); + List limitedHistory = task.history().subList( + task.history().size() - historyLength, + task.history().size()); return Task.builder(task) .history(limitedHistory) .build(); @@ -217,33 +217,33 @@ public Task onCancelTask(TaskIdParams params, ServerCallContext context) throws } // Check if task is in a non-cancelable state (completed, canceled, failed, rejected) - if (task.getStatus().state().isFinal()) { + if (task.status().state().isFinal()) { throw new TaskNotCancelableError( - "Task cannot be canceled - current state: " + task.getStatus().state().asString()); + "Task cannot be canceled - current state: " + task.status().state().asString()); } TaskManager taskManager = new TaskManager( - task.getId(), - task.getContextId(), + task.id(), + task.contextId(), taskStore, null); ResultAggregator resultAggregator = new ResultAggregator(taskManager, null, executor); - EventQueue queue = queueManager.tap(task.getId()); + EventQueue queue = queueManager.tap(task.id()); if (queue == null) { - queue = queueManager.getEventQueueBuilder(task.getId()).build(); + queue = queueManager.getEventQueueBuilder(task.id()).build(); } agentExecutor.cancel( requestContextBuilder.get() - .setTaskId(task.getId()) - .setContextId(task.getContextId()) + .setTaskId(task.id()) + .setContextId(task.contextId()) .setTask(task) .setServerCallContext(context) .build(), queue); - Optional.ofNullable(runningAgents.get(task.getId())) + Optional.ofNullable(runningAgents.get(task.id())) .ifPresent(cf -> cf.cancel(true)); EventConsumer consumer = new EventConsumer(queue); @@ -253,9 +253,9 @@ public Task onCancelTask(TaskIdParams params, ServerCallContext context) throws } // Verify task was actually canceled (not completed concurrently) - if (tempTask.getStatus().state() != TaskState.CANCELED) { + if (tempTask.status().state() != TaskState.CANCELED) { throw new TaskNotCancelableError( - "Task cannot be canceled - current state: " + tempTask.getStatus().state().asString()); + "Task cannot be canceled - current state: " + tempTask.status().state().asString()); } return tempTask; @@ -263,7 +263,7 @@ public Task onCancelTask(TaskIdParams params, ServerCallContext context) throws @Override public EventKind onMessageSend(MessageSendParams params, ServerCallContext context) throws JSONRPCError { - LOGGER.debug("onMessageSend - task: {}; context {}", params.message().getTaskId(), params.message().getContextId()); + LOGGER.debug("onMessageSend - task: {}; context {}", params.message().taskId(), params.message().contextId()); MessageSendSetup mss = initMessageSend(params, context); String taskId = mss.requestContext.getTaskId(); @@ -313,8 +313,8 @@ public EventKind onMessageSend(MessageSendParams params, ServerCallContext conte // Store push notification config for newly created tasks (mirrors streaming logic) // Only for NEW tasks - existing tasks are handled by initMessageSend() if (mss.task() == null && kind instanceof Task createdTask && shouldAddPushInfo(params)) { - LOGGER.debug("Storing push notification config for new task {}", createdTask.getId()); - pushConfigStore.setInfo(createdTask.getId(), params.configuration().pushNotificationConfig()); + LOGGER.debug("Storing push notification config for new task {}", createdTask.id()); + pushConfigStore.setInfo(createdTask.id(), params.configuration().pushNotificationConfig()); } if (blocking && interruptedOrNonBlocking) { @@ -371,12 +371,12 @@ public EventKind onMessageSend(MessageSendParams params, ServerCallContext conte kind = updatedTask; if (LOGGER.isDebugEnabled()) { LOGGER.debug("Fetched final task for {} with state {} and {} artifacts", - nonNullTaskId, updatedTask.getStatus().state(), - updatedTask.getArtifacts().size()); + nonNullTaskId, updatedTask.status().state(), + updatedTask.artifacts().size()); } } } - if (kind instanceof Task taskResult && !taskId.equals(taskResult.getId())) { + if (kind instanceof Task taskResult && !taskId.equals(taskResult.id())) { throw new InternalError("Task ID mismatch in agent response"); } @@ -400,7 +400,7 @@ public EventKind onMessageSend(MessageSendParams params, ServerCallContext conte public Flow.Publisher onMessageSendStream( MessageSendParams params, ServerCallContext context) throws JSONRPCError { LOGGER.debug("onMessageSendStream START - task: {}; context: {}; runningAgents: {}; backgroundTasks: {}", - params.message().getTaskId(), params.message().getContextId(), runningAgents.size(), backgroundTasks.size()); + params.message().taskId(), params.message().contextId(), runningAgents.size(), backgroundTasks.size()); MessageSendSetup mss = initMessageSend(params, context); @Nullable String initialTaskId = mss.requestContext.getTaskId(); @@ -431,15 +431,15 @@ public Flow.Publisher onMessageSendStream( processor(createTubeConfig(), results, ((errorConsumer, item) -> { Event event = item.getEvent(); if (event instanceof Task createdTask) { - if (!Objects.equals(taskId.get(), createdTask.getId())) { + if (!Objects.equals(taskId.get(), createdTask.id())) { errorConsumer.accept(new InternalError("Task ID mismatch in agent response")); } // TODO the Python implementation no longer has the following block but removing it causes // failures here try { - queueManager.add(createdTask.getId(), queue); - taskId.set(createdTask.getId()); + queueManager.add(createdTask.id(), queue); + taskId.set(createdTask.id()); } catch (TaskQueueExistsException e) { // TODO Log } @@ -448,7 +448,7 @@ public Flow.Publisher onMessageSendStream( params.configuration().pushNotificationConfig() != null) { pushConfigStore.setInfo( - createdTask.getId(), + createdTask.id(), params.configuration().pushNotificationConfig()); } @@ -614,20 +614,20 @@ public Flow.Publisher onResubscribeToTask( throw new TaskNotFoundError(); } - TaskManager taskManager = new TaskManager(task.getId(), task.getContextId(), taskStore, null); + TaskManager taskManager = new TaskManager(task.id(), task.contextId(), taskStore, null); ResultAggregator resultAggregator = new ResultAggregator(taskManager, null, executor); - EventQueue queue = queueManager.tap(task.getId()); + EventQueue queue = queueManager.tap(task.id()); LOGGER.debug("onResubscribeToTask - tapped queue: {}", queue != null ? System.identityHashCode(queue) : "null"); if (queue == null) { // If task is in final state, queue legitimately doesn't exist anymore - if (task.getStatus().state().isFinal()) { + if (task.status().state().isFinal()) { throw new TaskNotFoundError(); } // For non-final tasks, recreate the queue so client can receive future events // (Note: historical events from before queue closed are not available) - LOGGER.debug("Queue not found for active task {}, creating new queue for future events", task.getId()); - queue = queueManager.createOrTap(task.getId()); + LOGGER.debug("Queue not found for active task {}, creating new queue for future events", task.id()); + queue = queueManager.createOrTap(task.id()); } EventConsumer consumer = new EventConsumer(queue); @@ -808,8 +808,8 @@ private CompletableFuture cleanupProducer(@Nullable CompletableFuture pushConfigs = configStore.getInfo(task.getId()); + List pushConfigs = configStore.getInfo(task.id()); if (pushConfigs == null || pushConfigs.isEmpty()) { return; } @@ -59,10 +59,10 @@ public void sendNotification(Task task) { try { boolean allSent = dispatchResult.get(); if (! allSent) { - LOGGER.warn("Some push notifications failed to send for taskId: " + task.getId()); + LOGGER.warn("Some push notifications failed to send for taskId: " + task.id()); } } catch (InterruptedException | ExecutionException e) { - LOGGER.warn("Some push notifications failed to send for taskId " + task.getId() + ": {}", e.getMessage(), e); + LOGGER.warn("Some push notifications failed to send for taskId " + task.id() + ": {}", e.getMessage(), e); } } diff --git a/server-common/src/main/java/io/a2a/server/tasks/InMemoryTaskStore.java b/server-common/src/main/java/io/a2a/server/tasks/InMemoryTaskStore.java index fbc424511..bb853e297 100644 --- a/server-common/src/main/java/io/a2a/server/tasks/InMemoryTaskStore.java +++ b/server-common/src/main/java/io/a2a/server/tasks/InMemoryTaskStore.java @@ -21,7 +21,7 @@ public class InMemoryTaskStore implements TaskStore, TaskStateProvider { @Override public void save(Task task) { - tasks.put(task.getId(), task); + tasks.put(task.id(), task); } @Override @@ -38,20 +38,20 @@ public void delete(String taskId) { public ListTasksResult list(ListTasksParams params) { // Filter and sort tasks in a single stream pipeline List allFilteredTasks = tasks.values().stream() - .filter(task -> params.contextId() == null || params.contextId().equals(task.getContextId())) + .filter(task -> params.contextId() == null || params.contextId().equals(task.contextId())) .filter(task -> params.status() == null || - (task.getStatus() != null && params.status().equals(task.getStatus().state()))) + (task.status() != null && params.status().equals(task.status().state()))) .filter(task -> params.lastUpdatedAfter() == null || - (task.getStatus() != null && - task.getStatus().timestamp() != null && - task.getStatus().timestamp().toInstant().isAfter(params.lastUpdatedAfter()))) + (task.status() != null && + task.status().timestamp() != null && + task.status().timestamp().toInstant().isAfter(params.lastUpdatedAfter()))) .sorted(Comparator.comparing( - (Task t) -> (t.getStatus() != null && t.getStatus().timestamp() != null) + (Task t) -> (t.status() != null && t.status().timestamp() != null) // Truncate to milliseconds for consistency with pageToken precision - ? t.getStatus().timestamp().toInstant().truncatedTo(java.time.temporal.ChronoUnit.MILLIS) + ? t.status().timestamp().toInstant().truncatedTo(java.time.temporal.ChronoUnit.MILLIS) : null, Comparator.nullsLast(Comparator.reverseOrder())) - .thenComparing(Task::getId)) + .thenComparing(Task::id)) .toList(); int totalSize = allFilteredTasks.size(); @@ -81,11 +81,11 @@ public ListTasksResult list(ListTasksParams params) { // All tasks have timestamps (TaskStatus canonical constructor ensures this) // Truncate to milliseconds for consistency with pageToken precision - java.time.Instant taskTimestamp = task.getStatus().timestamp().toInstant() + java.time.Instant taskTimestamp = task.status().timestamp().toInstant() .truncatedTo(java.time.temporal.ChronoUnit.MILLIS); int timestampCompare = taskTimestamp.compareTo(tokenTimestamp); - if (timestampCompare < 0 || (timestampCompare == 0 && task.getId().compareTo(tokenId) > 0)) { + if (timestampCompare < 0 || (timestampCompare == 0 && task.id().compareTo(tokenId) > 0)) { // This task is after the token, search left half right = mid; } else { @@ -115,8 +115,8 @@ public ListTasksResult list(ListTasksParams params) { if (endIndex < allFilteredTasks.size()) { Task lastTask = allFilteredTasks.get(endIndex - 1); // All tasks have timestamps (TaskStatus canonical constructor ensures this) - long timestampMillis = lastTask.getStatus().timestamp().toInstant().toEpochMilli(); - nextPageToken = timestampMillis + ":" + lastTask.getId(); + long timestampMillis = lastTask.status().timestamp().toInstant().toEpochMilli(); + nextPageToken = timestampMillis + ":" + lastTask.id(); } // Transform tasks: limit history and optionally remove artifacts @@ -132,16 +132,16 @@ public ListTasksResult list(ListTasksParams params) { private Task transformTask(Task task, int historyLength, boolean includeArtifacts) { // Limit history if needed (keep most recent N messages) - List history = task.getHistory(); + List history = task.history(); if (historyLength > 0 && history != null && history.size() > historyLength) { history = history.subList(history.size() - historyLength, history.size()); } // Remove artifacts if not requested - List artifacts = includeArtifacts ? task.getArtifacts() : List.of(); + List artifacts = includeArtifacts ? task.artifacts() : List.of(); // If no transformation needed, return original task - if (history == task.getHistory() && artifacts == task.getArtifacts()) { + if (history == task.history() && artifacts == task.artifacts()) { return task; } @@ -159,7 +159,7 @@ public boolean isTaskActive(String taskId) { return false; } // Task is active if not in final state - return task.getStatus() == null || task.getStatus().state() == null || !task.getStatus().state().isFinal(); + return task.status() == null || task.status().state() == null || !task.status().state().isFinal(); } @Override @@ -169,8 +169,8 @@ public boolean isTaskFinalized(String taskId) { return false; } // Task is finalized if in final state (ignores grace period) - return task.getStatus() != null - && task.getStatus().state() != null - && task.getStatus().state().isFinal(); + return task.status() != null + && task.status().state() != null + && task.status().state().isFinal(); } } diff --git a/server-common/src/main/java/io/a2a/server/tasks/ResultAggregator.java b/server-common/src/main/java/io/a2a/server/tasks/ResultAggregator.java index ffb9a3099..0fd62113f 100644 --- a/server-common/src/main/java/io/a2a/server/tasks/ResultAggregator.java +++ b/server-common/src/main/java/io/a2a/server/tasks/ResultAggregator.java @@ -161,10 +161,10 @@ public EventTypeAndInterrupt consumeAndBreakOnInterrupt(EventConsumer consumer, // Determine interrupt behavior boolean shouldInterrupt = false; boolean continueInBackground = false; - boolean isFinalEvent = (event instanceof Task task && task.getStatus().state().isFinal()) + boolean isFinalEvent = (event instanceof Task task && task.status().state().isFinal()) || (event instanceof TaskStatusUpdateEvent tsue && tsue.isFinal()); - boolean isAuthRequired = (event instanceof Task task && task.getStatus().state() == TaskState.AUTH_REQUIRED) - || (event instanceof TaskStatusUpdateEvent tsue && tsue.getStatus().state() == TaskState.AUTH_REQUIRED); + boolean isAuthRequired = (event instanceof Task task && task.status().state() == TaskState.AUTH_REQUIRED) + || (event instanceof TaskStatusUpdateEvent tsue && tsue.status().state() == TaskState.AUTH_REQUIRED); // Always interrupt on auth_required, as it needs external action. if (isAuthRequired) { @@ -286,7 +286,7 @@ private void callTaskManagerProcess(Event event) throws A2AServerException { private String taskIdForLogging() { Task task = taskManager.getTask(); - return task != null ? task.getId() : "unknown"; + return task != null ? task.id() : "unknown"; } public record EventTypeAndInterrupt(EventKind eventType, boolean interrupted, CompletableFuture consumptionFuture) { diff --git a/server-common/src/main/java/io/a2a/server/tasks/TaskManager.java b/server-common/src/main/java/io/a2a/server/tasks/TaskManager.java index d0644b5d0..55b24e409 100644 --- a/server-common/src/main/java/io/a2a/server/tasks/TaskManager.java +++ b/server-common/src/main/java/io/a2a/server/tasks/TaskManager.java @@ -61,28 +61,28 @@ public TaskManager(@Nullable String taskId, @Nullable String contextId, TaskStor } Task saveTaskEvent(Task task) throws A2AServerException { - checkIdsAndUpdateIfNecessary(task.getId(), task.getContextId()); + checkIdsAndUpdateIfNecessary(task.id(), task.contextId()); return saveTask(task); } Task saveTaskEvent(TaskStatusUpdateEvent event) throws A2AServerException { - checkIdsAndUpdateIfNecessary(event.getTaskId(), event.getContextId()); - Task task = ensureTask(event.getTaskId(), event.getContextId()); + checkIdsAndUpdateIfNecessary(event.taskId(), event.contextId()); + Task task = ensureTask(event.taskId(), event.contextId()); Task.Builder builder = Task.builder(task) - .status(event.getStatus()); + .status(event.status()); - if (task.getStatus().message() != null) { - List newHistory = task.getHistory() == null ? new ArrayList<>() : new ArrayList<>(task.getHistory()); - newHistory.add(task.getStatus().message()); + if (task.status().message() != null) { + List newHistory = task.history() == null ? new ArrayList<>() : new ArrayList<>(task.history()); + newHistory.add(task.status().message()); builder.history(newHistory); } // Handle metadata from the event - if (event.getMetadata() != null) { - Map metadata = task.getMetadata() == null ? new HashMap<>() : new HashMap<>(task.getMetadata()); - metadata.putAll(event.getMetadata()); + if (event.metadata() != null) { + Map metadata = task.metadata() == null ? new HashMap<>() : new HashMap<>(task.metadata()); + metadata.putAll(event.metadata()); builder.metadata(metadata); } @@ -91,8 +91,8 @@ Task saveTaskEvent(TaskStatusUpdateEvent event) throws A2AServerException { } Task saveTaskEvent(TaskArtifactUpdateEvent event) throws A2AServerException { - checkIdsAndUpdateIfNecessary(event.getTaskId(), event.getContextId()); - Task task = ensureTask(event.getTaskId(), event.getContextId()); + checkIdsAndUpdateIfNecessary(event.taskId(), event.contextId()); + Task task = ensureTask(event.taskId(), event.contextId()); // taskId is guaranteed to be non-null after checkIdsAndUpdateIfNecessary String nonNullTaskId = taskId; if (nonNullTaskId == null) { @@ -114,9 +114,9 @@ public Event process(Event event) throws A2AServerException { } public Task updateWithMessage(Message message, Task task) { - List history = new ArrayList<>(task.getHistory()); + List history = new ArrayList<>(task.history()); - TaskStatus status = task.getStatus(); + TaskStatus status = task.status(); if (status.message() != null) { history.add(status.message()); status = new TaskStatus(status.state(), null, status.timestamp()); @@ -174,8 +174,8 @@ private Task createTask(String taskId, String contextId) { private Task saveTask(Task task) { taskStore.save(task); if (taskId == null) { - taskId = task.getId(); - contextId = task.getContextId(); + taskId = task.id(); + contextId = task.contextId(); } currentTask = task; return currentTask; diff --git a/server-common/src/test/java/io/a2a/server/agentexecution/RequestContextTest.java b/server-common/src/test/java/io/a2a/server/agentexecution/RequestContextTest.java index 7dfc0f6ac..d75829f0b 100644 --- a/server-common/src/test/java/io/a2a/server/agentexecution/RequestContextTest.java +++ b/server-common/src/test/java/io/a2a/server/agentexecution/RequestContextTest.java @@ -50,11 +50,12 @@ public void testInitWithParamsNoIds() { RequestContext context = new RequestContext(mockParams, null, null, null, null, null); - assertEquals(mockParams.message(), context.getMessage()); + // getMessage() returns a new Message with generated IDs, not the original + assertNotNull(context.getMessage()); assertEquals(taskId.toString(), context.getTaskId()); - assertEquals(mockParams.message().getTaskId(), taskId.toString()); + assertEquals(taskId.toString(), context.getMessage().taskId()); assertEquals(contextId.toString(), context.getContextId()); - assertEquals(mockParams.message().getContextId(), contextId.toString()); + assertEquals(contextId.toString(), context.getMessage().contextId()); } } @@ -67,7 +68,7 @@ public void testInitWithTaskId() { RequestContext context = new RequestContext(mockParams, taskId, null, null, null, null); assertEquals(taskId, context.getTaskId()); - assertEquals(taskId, mockParams.message().getTaskId()); + assertEquals(taskId, mockParams.message().taskId()); } @Test @@ -78,7 +79,7 @@ public void testInitWithContextId() { RequestContext context = new RequestContext(mockParams, null, contextId, null, null, null); assertEquals(contextId, context.getContextId()); - assertEquals(contextId, mockParams.message().getContextId()); + assertEquals(contextId, mockParams.message().contextId()); } @Test @@ -90,9 +91,9 @@ public void testInitWithBothIds() { RequestContext context = new RequestContext(mockParams, taskId, contextId, null, null, null); assertEquals(taskId, context.getTaskId()); - assertEquals(taskId, mockParams.message().getTaskId()); + assertEquals(taskId, mockParams.message().taskId()); assertEquals(contextId, context.getContextId()); - assertEquals(contextId, mockParams.message().getContextId()); + assertEquals(contextId, mockParams.message().contextId()); } @Test @@ -138,7 +139,7 @@ public void testCheckOrGenerateTaskIdWithExistingTaskId() { RequestContext context = new RequestContext(mockParams, null, null, null, null, null); assertEquals(existingId, context.getTaskId()); - assertEquals(existingId, mockParams.message().getTaskId()); + assertEquals(existingId, mockParams.message().taskId()); } @Test @@ -151,7 +152,7 @@ public void testCheckOrGenerateContextIdWithExistingContextId() { RequestContext context = new RequestContext(mockParams, null, null, null, null, null); assertEquals(existingId, context.getContextId()); - assertEquals(existingId, mockParams.message().getContextId()); + assertEquals(existingId, mockParams.message().contextId()); } @Test @@ -173,7 +174,7 @@ public void testInitRaisesErrorOnContextIdMismatch() { var mockTask = Task.builder().id("task-123").contextId("context-456").status(new TaskStatus(TaskState.COMPLETED)).build(); InvalidParamsError error = assertThrows(InvalidParamsError.class, () -> - new RequestContext(mockParams, mockTask.getId(), "wrong-context-id", mockTask, null, null)); + new RequestContext(mockParams, mockTask.id(), "wrong-context-id", mockTask, null, null)); assertTrue(error.getMessage().contains("bad context id")); } @@ -204,7 +205,10 @@ public void testMessagePropertyWithParams() { var mockParams = MessageSendParams.builder().message(mockMessage).build(); RequestContext context = new RequestContext(mockParams, null, null, null, null, null); - assertEquals(mockParams.message(), context.getMessage()); + // getMessage() returns a new Message with generated IDs, not the original + assertNotNull(context.getMessage()); + assertEquals(mockMessage.role(), context.getMessage().role()); + assertEquals(mockMessage.parts(), context.getMessage().parts()); } @Test @@ -229,9 +233,9 @@ public void testInitWithTaskIdAndExistingTaskIdMatch() { var mockTask = Task.builder().id("task-123").contextId("context-456").status(new TaskStatus(TaskState.COMPLETED)).build(); - RequestContext context = new RequestContext(mockParams, mockTask.getId(), null, mockTask, null, null); + RequestContext context = new RequestContext(mockParams, mockTask.id(), null, mockTask, null, null); - assertEquals(mockTask.getId(), context.getTaskId()); + assertEquals(mockTask.id(), context.getTaskId()); assertEquals(mockTask, context.getTask()); } @@ -242,9 +246,9 @@ public void testInitWithContextIdAndExistingContextIdMatch() { var mockTask = Task.builder().id("task-123").contextId("context-456").status(new TaskStatus(TaskState.COMPLETED)).build(); - RequestContext context = new RequestContext(mockParams, mockTask.getId(), mockTask.getContextId(), mockTask, null, null); + RequestContext context = new RequestContext(mockParams, mockTask.id(), mockTask.contextId(), mockTask, null, null); - assertEquals(mockTask.getContextId(), context.getContextId()); + assertEquals(mockTask.contextId(), context.getContextId()); assertEquals(mockTask, context.getTask()); } @@ -254,8 +258,8 @@ void testMessageBuilderGeneratesId() { var mockParams = MessageSendParams.builder().message(mockMessage).build(); RequestContext context = new RequestContext(mockParams, null, null, null, null, null); - assertNotNull(mockMessage.getMessageId()); - assertFalse(mockMessage.getMessageId().isEmpty()); + assertNotNull(mockMessage.messageId()); + assertFalse(mockMessage.messageId().isEmpty()); } @Test @@ -264,6 +268,6 @@ void testMessageBuilderUsesProvidedId() { var mockParams = MessageSendParams.builder().message(mockMessage).build(); RequestContext context = new RequestContext(mockParams, null, null, null, null, null); - assertEquals("123", mockMessage.getMessageId()); + assertEquals("123", mockMessage.messageId()); } } diff --git a/server-common/src/test/java/io/a2a/server/requesthandlers/DefaultRequestHandlerTest.java b/server-common/src/test/java/io/a2a/server/requesthandlers/DefaultRequestHandlerTest.java index ca6a210e2..abf881752 100644 --- a/server-common/src/test/java/io/a2a/server/requesthandlers/DefaultRequestHandlerTest.java +++ b/server-common/src/test/java/io/a2a/server/requesthandlers/DefaultRequestHandlerTest.java @@ -115,8 +115,8 @@ void testBlockingMessageContinueTask() throws Exception { assertTrue(result1 instanceof Task); Task task1 = (Task) result1; - assertTrue(task1.getId().equals(taskId)); - assertTrue(task1.getStatus().state() == TaskState.SUBMITTED); + assertTrue(task1.id().equals(taskId)); + assertTrue(task1.status().state() == TaskState.SUBMITTED); // Second blocking message to SAME taskId - should not hang Message message2 = Message.builder() @@ -414,9 +414,9 @@ void testDisconnectPersistsFinalTaskToStore() throws Exception { if (persistedTask != null) { // If task was persisted, it should have the final state assertTrue( - persistedTask.getStatus().state() == TaskState.COMPLETED || - persistedTask.getStatus().state() == TaskState.WORKING, - "Task should be persisted with working or completed state, got: " + persistedTask.getStatus().state() + persistedTask.status().state() == TaskState.COMPLETED || + persistedTask.status().state() == TaskState.WORKING, + "Task should be persisted with working or completed state, got: " + persistedTask.status().state() ); } // Note: In some architectures, the task might not be persisted if the @@ -480,15 +480,15 @@ void testBlockingFireAndForgetReturnsNonFinalTask() throws Exception { Task returnedTask = (Task) result; // Verify task is in WORKING state (non-final, fire-and-forget) - assertEquals(TaskState.WORKING, returnedTask.getStatus().state(), - "Returned task should be WORKING (fire-and-forget), got: " + returnedTask.getStatus().state()); + assertEquals(TaskState.WORKING, returnedTask.status().state(), + "Returned task should be WORKING (fire-and-forget), got: " + returnedTask.status().state()); // Verify artifacts are included in the returned task - assertNotNull(returnedTask.getArtifacts(), + assertNotNull(returnedTask.artifacts(), "Returned task should have artifacts"); - assertTrue(returnedTask.getArtifacts().size() >= 1, + assertTrue(returnedTask.artifacts().size() >= 1, "Returned task should have at least 1 artifact, got: " + - returnedTask.getArtifacts().size()); + returnedTask.artifacts().size()); } /** @@ -569,8 +569,8 @@ void testNonBlockingMessagePersistsAllEventsInBackground() throws Exception { // Assertion 1: The immediate result should be the first event (WORKING) assertTrue(result instanceof Task, "Result should be a Task"); Task immediateTask = (Task) result; - assertEquals(TaskState.WORKING, immediateTask.getStatus().state(), - "Non-blocking should return immediately with WORKING state, got: " + immediateTask.getStatus().state()); + assertEquals(TaskState.WORKING, immediateTask.status().state(), + "Non-blocking should return immediately with WORKING state, got: " + immediateTask.status().state()); // At this point, the non-blocking call has returned, but the agent is still running @@ -586,7 +586,7 @@ void testNonBlockingMessagePersistsAllEventsInBackground() throws Exception { while (System.currentTimeMillis() - startTime < timeoutMs) { persistedTask = taskStore.get(taskId); - if (persistedTask != null && persistedTask.getStatus().state() == TaskState.COMPLETED) { + if (persistedTask != null && persistedTask.status().state() == TaskState.COMPLETED) { completedStateFound = true; break; } @@ -597,7 +597,7 @@ void testNonBlockingMessagePersistsAllEventsInBackground() throws Exception { assertTrue( completedStateFound, "Final task state should be COMPLETED (background consumption should have processed it), got: " + - (persistedTask != null ? persistedTask.getStatus().state() : "null") + + (persistedTask != null ? persistedTask.status().state() : "null") + " after " + (System.currentTimeMillis() - startTime) + "ms" ); } @@ -784,15 +784,15 @@ void testBlockingCallReturnsCompleteTaskWithArtifacts() throws Exception { Task returnedTask = (Task) result; // Verify task is completed - assertEquals(TaskState.COMPLETED, returnedTask.getStatus().state(), + assertEquals(TaskState.COMPLETED, returnedTask.status().state(), "Returned task should be COMPLETED"); // Verify artifacts are included in the returned task - assertNotNull(returnedTask.getArtifacts(), + assertNotNull(returnedTask.artifacts(), "Returned task should have artifacts"); - assertTrue(returnedTask.getArtifacts().size() >= 2, + assertTrue(returnedTask.artifacts().size() >= 2, "Returned task should have at least 2 artifacts, got: " + - returnedTask.getArtifacts().size()); + returnedTask.artifacts().size()); } /** @@ -860,7 +860,7 @@ void testBlockingMessageStoresPushNotificationConfigForNewTask() throws Exceptio // Verify result is a task assertTrue(result instanceof Task, "Result should be a Task"); Task returnedTask = (Task) result; - assertEquals(taskId, returnedTask.getId()); + assertEquals(taskId, returnedTask.id()); // THE KEY ASSERTION: Verify pushNotificationConfig was stored List storedConfigs = pushConfigStore.getInfo(taskId); diff --git a/server-common/src/test/java/io/a2a/server/tasks/InMemoryPushNotificationConfigStoreTest.java b/server-common/src/test/java/io/a2a/server/tasks/InMemoryPushNotificationConfigStoreTest.java index aabeeedde..d90629b09 100644 --- a/server-common/src/test/java/io/a2a/server/tasks/InMemoryPushNotificationConfigStoreTest.java +++ b/server-common/src/test/java/io/a2a/server/tasks/InMemoryPushNotificationConfigStoreTest.java @@ -67,8 +67,8 @@ private void verifyHttpCallWithoutToken(PushNotificationConfig config, Task task // Verify the request body contains the task data String sentBody = bodyCaptor.getValue(); - assertTrue(sentBody.contains(task.getId())); - assertTrue(sentBody.contains(task.getStatus().state().asString())); + assertTrue(sentBody.contains(task.id())); + assertTrue(sentBody.contains(task.status().state().asString())); } private Task createSampleTask(String taskId, TaskState state) { @@ -244,8 +244,8 @@ public void testSendNotificationSuccess() throws Exception { // Verify the request body contains the task data String sentBody = bodyCaptor.getValue(); - assertTrue(sentBody.contains(task.getId())); - assertTrue(sentBody.contains(task.getStatus().state().asString())); + assertTrue(sentBody.contains(task.id())); + assertTrue(sentBody.contains(task.status().state().asString())); } @Test @@ -276,8 +276,8 @@ public void testSendNotificationWithToken() throws Exception { // Verify the request body contains the task data String sentBody = bodyCaptor.getValue(); - assertTrue(sentBody.contains(task.getId())); - assertTrue(sentBody.contains(task.getStatus().state().asString())); + assertTrue(sentBody.contains(task.id())); + assertTrue(sentBody.contains(task.status().state().asString())); } @Test diff --git a/server-common/src/test/java/io/a2a/server/tasks/InMemoryTaskStoreTest.java b/server-common/src/test/java/io/a2a/server/tasks/InMemoryTaskStoreTest.java index d49f6de4f..a042ef179 100644 --- a/server-common/src/test/java/io/a2a/server/tasks/InMemoryTaskStoreTest.java +++ b/server-common/src/test/java/io/a2a/server/tasks/InMemoryTaskStoreTest.java @@ -21,7 +21,7 @@ public void testSaveAndGet() throws Exception { InMemoryTaskStore store = new InMemoryTaskStore(); Task task = Utils.unmarshalFrom(TASK_JSON, Task.class); store.save(task); - Task retrieved = store.get(task.getId()); + Task retrieved = store.get(task.id()); assertSame(task, retrieved); } @@ -37,8 +37,8 @@ public void testDelete() throws Exception { InMemoryTaskStore store = new InMemoryTaskStore(); Task task = Utils.unmarshalFrom(TASK_JSON, Task.class); store.save(task); - store.delete(task.getId()); - Task retrieved = store.get(task.getId()); + store.delete(task.id()); + Task retrieved = store.get(task.id()); assertNull(retrieved); } diff --git a/server-common/src/test/java/io/a2a/server/tasks/PushNotificationSenderTest.java b/server-common/src/test/java/io/a2a/server/tasks/PushNotificationSenderTest.java index 9a2186a68..fcc9e9cf0 100644 --- a/server-common/src/test/java/io/a2a/server/tasks/PushNotificationSenderTest.java +++ b/server-common/src/test/java/io/a2a/server/tasks/PushNotificationSenderTest.java @@ -159,7 +159,7 @@ private void testSendNotificationWithInvalidToken(String token, String testName) // Verify the task was sent via HTTP assertEquals(1, testHttpClient.tasks.size()); Task sentTask = testHttpClient.tasks.get(0); - assertEquals(taskData.getId(), sentTask.getId()); + assertEquals(taskData.id(), sentTask.id()); // Verify that no authentication header was sent (invalid token should not add header) assertEquals(1, testHttpClient.headers.size()); @@ -208,9 +208,9 @@ public void testSendNotificationSuccess() throws InterruptedException { // Verify the task was sent via HTTP assertEquals(1, testHttpClient.tasks.size()); Task sentTask = testHttpClient.tasks.get(0); - assertEquals(taskData.getId(), sentTask.getId()); - assertEquals(taskData.getContextId(), sentTask.getContextId()); - assertEquals(taskData.getStatus().state(), sentTask.getStatus().state()); + assertEquals(taskData.id(), sentTask.id()); + assertEquals(taskData.contextId(), sentTask.contextId()); + assertEquals(taskData.status().state(), sentTask.status().state()); } @Test @@ -233,7 +233,7 @@ public void testSendNotificationWithTokenSuccess() throws InterruptedException { // Verify the task was sent via HTTP assertEquals(1, testHttpClient.tasks.size()); Task sentTask = testHttpClient.tasks.get(0); - assertEquals(taskData.getId(), sentTask.getId()); + assertEquals(taskData.id(), sentTask.id()); // Verify that the X-A2A-Notification-Token header is sent with the correct token assertEquals(1, testHttpClient.headers.size()); @@ -295,9 +295,9 @@ public void testSendNotificationMultipleConfigs() throws InterruptedException { // Both tasks should be identical (same task sent to different endpoints) for (Task sentTask : testHttpClient.tasks) { - assertEquals(taskData.getId(), sentTask.getId()); - assertEquals(taskData.getContextId(), sentTask.getContextId()); - assertEquals(taskData.getStatus().state(), sentTask.getStatus().state()); + assertEquals(taskData.id(), sentTask.id()); + assertEquals(taskData.contextId(), sentTask.contextId()); + assertEquals(taskData.status().state(), sentTask.status().state()); } } diff --git a/server-common/src/test/java/io/a2a/server/tasks/TaskManagerTest.java b/server-common/src/test/java/io/a2a/server/tasks/TaskManagerTest.java index b2f440e95..0fc5648c9 100644 --- a/server-common/src/test/java/io/a2a/server/tasks/TaskManagerTest.java +++ b/server-common/src/test/java/io/a2a/server/tasks/TaskManagerTest.java @@ -43,7 +43,7 @@ public class TaskManagerTest { public void init() throws Exception { minimalTask = Utils.unmarshalFrom(TASK_JSON, Task.class); taskStore = new InMemoryTaskStore(); - taskManager = new TaskManager(minimalTask.getId(), minimalTask.getContextId(), taskStore, null); + taskManager = new TaskManager(minimalTask.id(), minimalTask.contextId(), taskStore, null); } @Test @@ -82,9 +82,9 @@ public void testSaveTaskEventStatusUpdate() throws A2AServerException { .build(), null); TaskStatusUpdateEvent event = new TaskStatusUpdateEvent( - minimalTask.getId(), + minimalTask.id(), newStatus, - minimalTask.getContextId(), + minimalTask.contextId(), false, new HashMap<>()); @@ -95,11 +95,11 @@ public void testSaveTaskEventStatusUpdate() throws A2AServerException { assertNotSame(initialTask, updated); assertSame(updated, saved); - assertEquals(initialTask.getId(), updated.getId()); - assertEquals(initialTask.getContextId(), updated.getContextId()); + assertEquals(initialTask.id(), updated.id()); + assertEquals(initialTask.contextId(), updated.contextId()); // TODO type does not get unmarshalled //assertEquals(initialTask.getType(), updated.getType()); - assertSame(newStatus, updated.getStatus()); + assertSame(newStatus, updated.status()); } @Test @@ -111,8 +111,8 @@ public void testSaveTaskEventArtifactUpdate() throws A2AServerException { .parts(Collections.singletonList(new TextPart("content"))) .build(); TaskArtifactUpdateEvent event = TaskArtifactUpdateEvent.builder() - .taskId(minimalTask.getId()) - .contextId(minimalTask.getContextId()) + .taskId(minimalTask.id()) + .contextId(minimalTask.contextId()) .artifact(newArtifact) .build(); Task saved = taskManager.saveTaskEvent(event); @@ -121,11 +121,11 @@ public void testSaveTaskEventArtifactUpdate() throws A2AServerException { assertSame(updatedTask, saved); assertNotSame(initialTask, updatedTask); - assertEquals(initialTask.getId(), updatedTask.getId()); - assertEquals(initialTask.getContextId(), updatedTask.getContextId()); - assertSame(initialTask.getStatus().state(), updatedTask.getStatus().state()); - assertEquals(1, updatedTask.getArtifacts().size()); - assertEquals(newArtifact, updatedTask.getArtifacts().get(0)); + assertEquals(initialTask.id(), updatedTask.id()); + assertEquals(initialTask.contextId(), updatedTask.contextId()); + assertSame(initialTask.status().state(), updatedTask.status().state()); + assertEquals(1, updatedTask.artifacts().size()); + assertEquals(newArtifact, updatedTask.artifacts().get(0)); } @Test @@ -146,13 +146,13 @@ public void testEnsureTaskNonExistentForStatusUpdate() throws A2AServerException .build(); Task task = taskManagerWithoutId.saveTaskEvent(event); - assertEquals(event.getTaskId(), taskManagerWithoutId.getTaskId()); - assertEquals(event.getContextId(), taskManagerWithoutId.getContextId()); + assertEquals(event.taskId(), taskManagerWithoutId.getTaskId()); + assertEquals(event.contextId(), taskManagerWithoutId.getContextId()); Task newTask = taskManagerWithoutId.getTask(); - assertEquals(event.getTaskId(), newTask.getId()); - assertEquals(event.getContextId(), newTask.getContextId()); - assertEquals(TaskState.SUBMITTED, newTask.getStatus().state()); + assertEquals(event.taskId(), newTask.id()); + assertEquals(event.contextId(), newTask.contextId()); + assertEquals(TaskState.SUBMITTED, newTask.status().state()); assertSame(newTask, task); } @@ -166,8 +166,8 @@ public void testSaveTaskEventNewTaskNoTaskId() throws A2AServerException { .build(); Task saved = taskManagerWithoutId.saveTaskEvent(task); - assertEquals(task.getId(), taskManagerWithoutId.getTaskId()); - assertEquals(task.getContextId(), taskManagerWithoutId.getContextId()); + assertEquals(task.id(), taskManagerWithoutId.getTaskId()); + assertEquals(task.contextId(), taskManagerWithoutId.getContextId()); Task retrieved = taskManagerWithoutId.getTask(); assertSame(task, retrieved); @@ -204,20 +204,20 @@ public void testTaskArtifactUpdateEventAppendTrueWithExistingArtifact() throws A .parts(Collections.singletonList(new TextPart("new content"))) .build(); TaskArtifactUpdateEvent event = TaskArtifactUpdateEvent.builder() - .taskId(minimalTask.getId()) - .contextId(minimalTask.getContextId()) + .taskId(minimalTask.id()) + .contextId(minimalTask.contextId()) .artifact(newArtifact) .append(true) .build(); Task updatedTask = taskManager.saveTaskEvent(event); - assertEquals(1, updatedTask.getArtifacts().size()); - Artifact updatedArtifact = updatedTask.getArtifacts().get(0); + assertEquals(1, updatedTask.artifacts().size()); + Artifact updatedArtifact = updatedTask.artifacts().get(0); assertEquals("artifact-id", updatedArtifact.artifactId()); assertEquals(2, updatedArtifact.parts().size()); - assertEquals("existing content", ((TextPart) updatedArtifact.parts().get(0)).getText()); - assertEquals("new content", ((TextPart) updatedArtifact.parts().get(1)).getText()); + assertEquals("existing content", ((TextPart) updatedArtifact.parts().get(0)).text()); + assertEquals("new content", ((TextPart) updatedArtifact.parts().get(1)).text()); } @Test @@ -233,8 +233,8 @@ public void testTaskArtifactUpdateEventAppendTrueWithoutExistingArtifact() throw .parts(Collections.singletonList(new TextPart("new content"))) .build(); TaskArtifactUpdateEvent event = TaskArtifactUpdateEvent.builder() - .taskId(minimalTask.getId()) - .contextId(minimalTask.getContextId()) + .taskId(minimalTask.id()) + .contextId(minimalTask.contextId()) .artifact(newArtifact) .append(true) .build(); @@ -243,7 +243,7 @@ public void testTaskArtifactUpdateEventAppendTrueWithoutExistingArtifact() throw Task updatedTask = taskManager.getTask(); // Should have no artifacts since append was ignored - assertEquals(0, updatedTask.getArtifacts().size()); + assertEquals(0, updatedTask.artifacts().size()); } @Test @@ -267,8 +267,8 @@ public void testTaskArtifactUpdateEventAppendFalseWithExistingArtifact() throws .parts(Collections.singletonList(new TextPart("replacement content"))) .build(); TaskArtifactUpdateEvent event = TaskArtifactUpdateEvent.builder() - .taskId(minimalTask.getId()) - .contextId(minimalTask.getContextId()) + .taskId(minimalTask.id()) + .contextId(minimalTask.contextId()) .artifact(newArtifact) .append(false) .build(); @@ -276,11 +276,11 @@ public void testTaskArtifactUpdateEventAppendFalseWithExistingArtifact() throws Task saved = taskManager.saveTaskEvent(event); Task updatedTask = taskManager.getTask(); - assertEquals(1, updatedTask.getArtifacts().size()); - Artifact updatedArtifact = updatedTask.getArtifacts().get(0); + assertEquals(1, updatedTask.artifacts().size()); + Artifact updatedArtifact = updatedTask.artifacts().get(0); assertEquals("artifact-id", updatedArtifact.artifactId()); assertEquals(1, updatedArtifact.parts().size()); - assertEquals("replacement content", ((TextPart) updatedArtifact.parts().get(0)).getText()); + assertEquals("replacement content", ((TextPart) updatedArtifact.parts().get(0)).text()); } @Test @@ -304,19 +304,19 @@ public void testTaskArtifactUpdateEventAppendNullWithExistingArtifact() throws A .parts(Collections.singletonList(new TextPart("replacement content"))) .build(); TaskArtifactUpdateEvent event = TaskArtifactUpdateEvent.builder() - .taskId(minimalTask.getId()) - .contextId(minimalTask.getContextId()) + .taskId(minimalTask.id()) + .contextId(minimalTask.contextId()) .artifact(newArtifact) .build(); // append is null Task saved = taskManager.saveTaskEvent(event); Task updatedTask = taskManager.getTask(); - assertEquals(1, updatedTask.getArtifacts().size()); - Artifact updatedArtifact = updatedTask.getArtifacts().get(0); + assertEquals(1, updatedTask.artifacts().size()); + Artifact updatedArtifact = updatedTask.artifacts().get(0); assertEquals("artifact-id", updatedArtifact.artifactId()); assertEquals(1, updatedArtifact.parts().size()); - assertEquals("replacement content", ((TextPart) updatedArtifact.parts().get(0)).getText()); + assertEquals("replacement content", ((TextPart) updatedArtifact.parts().get(0)).text()); } @Test @@ -397,12 +397,12 @@ public void testTaskWithNoMessageUsesInitialMessage() throws A2AServerException Task retrieved = taskManagerWithInitialMessage.getTask(); // Check that the task has the initial message in its history - assertNotNull(retrieved.getHistory()); - assertEquals(1, retrieved.getHistory().size()); - Message historyMessage = retrieved.getHistory().get(0); - assertEquals(initialMessage.getMessageId(), historyMessage.getMessageId()); - assertEquals(initialMessage.getRole(), historyMessage.getRole()); - assertEquals("initial message", ((TextPart) historyMessage.getParts().get(0)).getText()); + assertNotNull(retrieved.history()); + assertEquals(1, retrieved.history().size()); + Message historyMessage = retrieved.history().get(0); + assertEquals(initialMessage.messageId(), historyMessage.messageId()); + assertEquals(initialMessage.role(), historyMessage.role()); + assertEquals("initial message", ((TextPart) historyMessage.parts().get(0)).text()); } @Test @@ -435,13 +435,13 @@ public void testTaskWithMessageDoesNotUseInitialMessage() throws A2AServerExcept // There should now be a history containing the initialMessage // But the current message (taskMessage) should be in the state, not in the history - assertNotNull(retrieved.getHistory()); - assertEquals(1, retrieved.getHistory().size()); - assertEquals("initial message", ((TextPart) retrieved.getHistory().get(0).getParts().get(0)).getText()); + assertNotNull(retrieved.history()); + assertEquals(1, retrieved.history().size()); + assertEquals("initial message", ((TextPart) retrieved.history().get(0).parts().get(0)).text()); // The message in the current state should be taskMessage - assertNotNull(retrieved.getStatus().message()); - assertEquals("task message", ((TextPart) retrieved.getStatus().message().getParts().get(0)).getText()); + assertNotNull(retrieved.status().message()); + assertEquals("task message", ((TextPart) retrieved.status().message().parts().get(0)).text()); } @Test @@ -457,8 +457,8 @@ public void testMultipleArtifactsWithSameArtifactId() throws A2AServerException .parts(Collections.singletonList(new TextPart("content 1"))) .build(); TaskArtifactUpdateEvent event1 = TaskArtifactUpdateEvent.builder() - .taskId(minimalTask.getId()) - .contextId(minimalTask.getContextId()) + .taskId(minimalTask.id()) + .contextId(minimalTask.contextId()) .artifact(artifact1) .build(); taskManager.saveTaskEvent(event1); @@ -470,18 +470,18 @@ public void testMultipleArtifactsWithSameArtifactId() throws A2AServerException .parts(Collections.singletonList(new TextPart("content 2"))) .build(); TaskArtifactUpdateEvent event2 = TaskArtifactUpdateEvent.builder() - .taskId(minimalTask.getId()) - .contextId(minimalTask.getContextId()) + .taskId(minimalTask.id()) + .contextId(minimalTask.contextId()) .artifact(artifact2) .build(); taskManager.saveTaskEvent(event2); Task updatedTask = taskManager.getTask(); - assertEquals(1, updatedTask.getArtifacts().size()); - Artifact finalArtifact = updatedTask.getArtifacts().get(0); + assertEquals(1, updatedTask.artifacts().size()); + Artifact finalArtifact = updatedTask.artifacts().get(0); assertEquals("artifact-id", finalArtifact.artifactId()); assertEquals("artifact-2", finalArtifact.name()); - assertEquals("content 2", ((TextPart) finalArtifact.parts().get(0)).getText()); + assertEquals("content 2", ((TextPart) finalArtifact.parts().get(0)).text()); } @Test @@ -497,8 +497,8 @@ public void testMultipleArtifactsWithDifferentArtifactIds() throws A2AServerExce .parts(Collections.singletonList(new TextPart("content 1"))) .build(); TaskArtifactUpdateEvent event1 = TaskArtifactUpdateEvent.builder() - .taskId(minimalTask.getId()) - .contextId(minimalTask.getContextId()) + .taskId(minimalTask.id()) + .contextId(minimalTask.contextId()) .artifact(artifact1) .build(); taskManager.saveTaskEvent(event1); @@ -510,24 +510,24 @@ public void testMultipleArtifactsWithDifferentArtifactIds() throws A2AServerExce .parts(Collections.singletonList(new TextPart("content 2"))) .build(); TaskArtifactUpdateEvent event2 = TaskArtifactUpdateEvent.builder() - .taskId(minimalTask.getId()) - .contextId(minimalTask.getContextId()) + .taskId(minimalTask.id()) + .contextId(minimalTask.contextId()) .artifact(artifact2) .build(); taskManager.saveTaskEvent(event2); Task updatedTask = taskManager.getTask(); - assertEquals(2, updatedTask.getArtifacts().size()); + assertEquals(2, updatedTask.artifacts().size()); // Verify both artifacts are present - List artifacts = updatedTask.getArtifacts(); + List artifacts = updatedTask.artifacts(); assertTrue(artifacts.stream() .anyMatch(a -> "artifact-id-1".equals(a.artifactId()) - && "content 1".equals(((TextPart) a.parts().get(0)).getText())) + && "content 1".equals(((TextPart) a.parts().get(0)).text())) , "Artifact 1 should be present"); assertTrue(artifacts.stream() .anyMatch(a -> "artifact-id-2".equals(a.artifactId()) - && "content 2".equals(((TextPart) a.parts().get(0)).getText())) + && "content 2".equals(((TextPart) a.parts().get(0)).text())) , "Artifact 2 should be present"); } @@ -552,8 +552,8 @@ public void testSaveTaskEventMetadataUpdate() throws A2AServerException { newMetadata.put("meta_key_test", "meta_value_test"); TaskStatusUpdateEvent event = TaskStatusUpdateEvent.builder() - .taskId(minimalTask.getId()) - .contextId(minimalTask.getContextId()) + .taskId(minimalTask.id()) + .contextId(minimalTask.contextId()) .status(new TaskStatus(TaskState.WORKING)) .isFinal(false) .metadata(newMetadata) @@ -562,7 +562,7 @@ public void testSaveTaskEventMetadataUpdate() throws A2AServerException { taskManager.saveTaskEvent(event); Task updatedTask = taskManager.getTask(); - assertEquals(newMetadata, updatedTask.getMetadata()); + assertEquals(newMetadata, updatedTask.metadata()); } @Test @@ -572,8 +572,8 @@ public void testSaveTaskEventMetadataUpdateNull() throws A2AServerException { taskStore.save(initialTask); TaskStatusUpdateEvent event = TaskStatusUpdateEvent.builder() - .taskId(minimalTask.getId()) - .contextId(minimalTask.getContextId()) + .taskId(minimalTask.id()) + .contextId(minimalTask.contextId()) .status(new TaskStatus(TaskState.WORKING)) .isFinal(false) .metadata(null) @@ -583,7 +583,7 @@ public void testSaveTaskEventMetadataUpdateNull() throws A2AServerException { Task updatedTask = taskManager.getTask(); // Should preserve original task's metadata (which is likely null for minimal task) - assertNull(updatedTask.getMetadata()); + assertNull(updatedTask.metadata()); } @Test @@ -601,8 +601,8 @@ public void testSaveTaskEventMetadataMergeExisting() throws A2AServerException { newMetadata.put("new_key", "new_value"); TaskStatusUpdateEvent event = TaskStatusUpdateEvent.builder() - .taskId(minimalTask.getId()) - .contextId(minimalTask.getContextId()) + .taskId(minimalTask.id()) + .contextId(minimalTask.contextId()) .status(new TaskStatus(TaskState.WORKING)) .isFinal(false) .metadata(newMetadata) @@ -614,7 +614,7 @@ public void testSaveTaskEventMetadataMergeExisting() throws A2AServerException { Map mergedMetadata = new HashMap<>(originalMetadata); mergedMetadata.putAll(newMetadata); - assertEquals(mergedMetadata, updatedTask.getMetadata()); + assertEquals(mergedMetadata, updatedTask.metadata()); } @Test @@ -639,16 +639,16 @@ public void testCreateTaskWithInitialMessage() throws A2AServerException { // Verify task was created properly assertNotNull(savedTask); - assertEquals("new-task-id", savedTask.getId()); - assertEquals("some-context", savedTask.getContextId()); - assertEquals(TaskState.SUBMITTED, savedTask.getStatus().state()); + assertEquals("new-task-id", savedTask.id()); + assertEquals("some-context", savedTask.contextId()); + assertEquals(TaskState.SUBMITTED, savedTask.status().state()); // Verify initial message is in history - assertNotNull(savedTask.getHistory()); - assertEquals(1, savedTask.getHistory().size()); - Message historyMessage = savedTask.getHistory().get(0); - assertEquals("initial-msg-id", historyMessage.getMessageId()); - assertEquals("initial message", ((TextPart) historyMessage.getParts().get(0)).getText()); + assertNotNull(savedTask.history()); + assertEquals(1, savedTask.history().size()); + Message historyMessage = savedTask.history().get(0); + assertEquals("initial-msg-id", historyMessage.messageId()); + assertEquals("initial message", ((TextPart) historyMessage.parts().get(0)).text()); } @Test @@ -667,12 +667,12 @@ public void testCreateTaskWithoutInitialMessage() throws A2AServerException { // Verify task was created properly assertNotNull(savedTask); - assertEquals("new-task-id", savedTask.getId()); - assertEquals("some-context", savedTask.getContextId()); - assertEquals(TaskState.SUBMITTED, savedTask.getStatus().state()); + assertEquals("new-task-id", savedTask.id()); + assertEquals("some-context", savedTask.contextId()); + assertEquals(TaskState.SUBMITTED, savedTask.status().state()); // Verify no history since there was no initial message - assertTrue(savedTask.getHistory().isEmpty()); + assertTrue(savedTask.history().isEmpty()); } @Test @@ -728,13 +728,13 @@ public void testUpdateWithMessage() throws A2AServerException { Task updated = taskManagerWithInitialMessage.updateWithMessage(updateMessage, saved); // There should now be a history containing the initialMessage, task message and update message - assertNotNull(updated.getHistory()); - assertEquals(3, updated.getHistory().size()); - assertEquals("initial message", ((TextPart) updated.getHistory().get(0).getParts().get(0)).getText()); + assertNotNull(updated.history()); + assertEquals(3, updated.history().size()); + assertEquals("initial message", ((TextPart) updated.history().get(0).parts().get(0)).text()); // The message in the current state should be null - assertNull(updated.getStatus().message()); - assertEquals("task message", ((TextPart) updated.getHistory().get(1).getParts().get(0)).getText()); - assertEquals("update message", ((TextPart) updated.getHistory().get(2).getParts().get(0)).getText()); + assertNull(updated.status().message()); + assertEquals("task message", ((TextPart) updated.history().get(1).parts().get(0)).text()); + assertEquals("update message", ((TextPart) updated.history().get(2).parts().get(0)).text()); } } diff --git a/server-common/src/test/java/io/a2a/server/tasks/TaskUpdaterTest.java b/server-common/src/test/java/io/a2a/server/tasks/TaskUpdaterTest.java index 842ce72d4..40f763569 100644 --- a/server-common/src/test/java/io/a2a/server/tasks/TaskUpdaterTest.java +++ b/server-common/src/test/java/io/a2a/server/tasks/TaskUpdaterTest.java @@ -61,11 +61,11 @@ public void testAddArtifactWithCustomIdAndName() throws Exception { assertInstanceOf(TaskArtifactUpdateEvent.class, event); TaskArtifactUpdateEvent taue = (TaskArtifactUpdateEvent) event; - assertEquals(TEST_TASK_ID, taue.getTaskId()); - assertEquals(TEST_TASK_CONTEXT_ID, taue.getContextId()); - assertEquals("custom-artifact-id", taue.getArtifact().artifactId()); - assertEquals("Custom Artifact", taue.getArtifact().name()); - assertSame(SAMPLE_PARTS, taue.getArtifact().parts()); + assertEquals(TEST_TASK_ID, taue.taskId()); + assertEquals(TEST_TASK_CONTEXT_ID, taue.contextId()); + assertEquals("custom-artifact-id", taue.artifact().artifactId()); + assertEquals("Custom Artifact", taue.artifact().name()); + assertSame(SAMPLE_PARTS, taue.artifact().parts()); assertNull(eventQueue.dequeueEventItem(0)); @@ -215,12 +215,12 @@ public void testNonTerminalStateUpdatesAllowed() throws Exception { public void testNewAgentMessage() throws Exception { Message message = taskUpdater.newAgentMessage(SAMPLE_PARTS, null); - assertEquals(AGENT, message.getRole()); - assertEquals(TEST_TASK_ID, message.getTaskId()); - assertEquals(TEST_TASK_CONTEXT_ID, message.getContextId()); - assertNotNull(message.getMessageId()); - assertEquals(SAMPLE_PARTS, message.getParts()); - assertNull(message.getMetadata()); + assertEquals(AGENT, message.role()); + assertEquals(TEST_TASK_ID, message.taskId()); + assertEquals(TEST_TASK_CONTEXT_ID, message.contextId()); + assertNotNull(message.messageId()); + assertEquals(SAMPLE_PARTS, message.parts()); + assertNull(message.metadata()); } @Test @@ -228,12 +228,12 @@ public void testNewAgentMessageWithMetadata() throws Exception { Map metadata = Map.of("key", "value"); Message message = taskUpdater.newAgentMessage(SAMPLE_PARTS, metadata); - assertEquals(AGENT, message.getRole()); - assertEquals(TEST_TASK_ID, message.getTaskId()); - assertEquals(TEST_TASK_CONTEXT_ID, message.getContextId()); - assertNotNull(message.getMessageId()); - assertEquals(SAMPLE_PARTS, message.getParts()); - assertEquals(metadata, message.getMetadata()); + assertEquals(AGENT, message.role()); + assertEquals(TEST_TASK_ID, message.taskId()); + assertEquals(TEST_TASK_CONTEXT_ID, message.contextId()); + assertNotNull(message.messageId()); + assertEquals(SAMPLE_PARTS, message.parts()); + assertEquals(metadata, message.metadata()); } @Test @@ -244,13 +244,13 @@ public void testAddArtifactWithAppendTrue() throws Exception { assertInstanceOf(TaskArtifactUpdateEvent.class, event); TaskArtifactUpdateEvent taue = (TaskArtifactUpdateEvent) event; - assertEquals(TEST_TASK_ID, taue.getTaskId()); - assertEquals(TEST_TASK_CONTEXT_ID, taue.getContextId()); - assertEquals("artifact-id", taue.getArtifact().artifactId()); - assertEquals("Test Artifact", taue.getArtifact().name()); - assertSame(SAMPLE_PARTS, taue.getArtifact().parts()); - assertEquals(true, taue.isAppend()); - assertNull(taue.isLastChunk()); + assertEquals(TEST_TASK_ID, taue.taskId()); + assertEquals(TEST_TASK_CONTEXT_ID, taue.contextId()); + assertEquals("artifact-id", taue.artifact().artifactId()); + assertEquals("Test Artifact", taue.artifact().name()); + assertSame(SAMPLE_PARTS, taue.artifact().parts()); + assertEquals(true, taue.append()); + assertNull(taue.lastChunk()); assertNull(eventQueue.dequeueEventItem(0)); } @@ -263,9 +263,9 @@ public void testAddArtifactWithLastChunkTrue() throws Exception { assertInstanceOf(TaskArtifactUpdateEvent.class, event); TaskArtifactUpdateEvent taue = (TaskArtifactUpdateEvent) event; - assertEquals("artifact-id", taue.getArtifact().artifactId()); - assertNull(taue.isAppend()); - assertEquals(true, taue.isLastChunk()); + assertEquals("artifact-id", taue.artifact().artifactId()); + assertNull(taue.append()); + assertEquals(true, taue.lastChunk()); assertNull(eventQueue.dequeueEventItem(0)); } @@ -278,8 +278,8 @@ public void testAddArtifactWithAppendAndLastChunk() throws Exception { assertInstanceOf(TaskArtifactUpdateEvent.class, event); TaskArtifactUpdateEvent taue = (TaskArtifactUpdateEvent) event; - assertEquals(true, taue.isAppend()); - assertEquals(false, taue.isLastChunk()); + assertEquals(true, taue.append()); + assertEquals(false, taue.lastChunk()); assertNull(eventQueue.dequeueEventItem(0)); } @@ -292,9 +292,9 @@ public void testAddArtifactGeneratesIdWhenNull() throws Exception { assertInstanceOf(TaskArtifactUpdateEvent.class, event); TaskArtifactUpdateEvent taue = (TaskArtifactUpdateEvent) event; - assertNotNull(taue.getArtifact().artifactId()); + assertNotNull(taue.artifact().artifactId()); // Check that it's a valid UUID format - String artifactId = taue.getArtifact().artifactId(); + String artifactId = taue.artifact().artifactId(); assertEquals(36, artifactId.length()); // Standard UUID length assertTrue(artifactId.matches("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$")); @@ -389,7 +389,7 @@ public void testConcurrentCompletionAttempts() throws Exception { TaskStatusUpdateEvent tsue = (TaskStatusUpdateEvent) event; assertTrue(tsue.isFinal()); - assertTrue(tsue.getStatus().state() == TaskState.COMPLETED || tsue.getStatus().state() == TaskState.FAILED); + assertTrue(tsue.status().state() == TaskState.COMPLETED || tsue.status().state() == TaskState.FAILED); // No additional events should be queued assertNull(eventQueue.dequeueEventItem(0)); @@ -402,11 +402,11 @@ private TaskStatusUpdateEvent checkTaskStatusUpdateEventOnQueue(boolean isFinal, assertInstanceOf(TaskStatusUpdateEvent.class, event); TaskStatusUpdateEvent tsue = (TaskStatusUpdateEvent) event; - assertEquals(TEST_TASK_ID, tsue.getTaskId()); - assertEquals(TEST_TASK_CONTEXT_ID, tsue.getContextId()); + assertEquals(TEST_TASK_ID, tsue.taskId()); + assertEquals(TEST_TASK_CONTEXT_ID, tsue.contextId()); assertEquals(isFinal, tsue.isFinal()); - assertEquals(state, tsue.getStatus().state()); - assertEquals(statusMessage, tsue.getStatus().message()); + assertEquals(state, tsue.status().state()); + assertEquals(statusMessage, tsue.status().message()); assertNull(eventQueue.dequeueEventItem(0)); diff --git a/server-common/src/test/java/io/a2a/server/util/ArtifactUtilsTest.java b/server-common/src/test/java/io/a2a/server/util/ArtifactUtilsTest.java index b41197bfc..8b4bd628c 100644 --- a/server-common/src/test/java/io/a2a/server/util/ArtifactUtilsTest.java +++ b/server-common/src/test/java/io/a2a/server/util/ArtifactUtilsTest.java @@ -77,7 +77,7 @@ void testNewTextArtifactPartContainsProvidedText() { // Then TextPart textPart = (TextPart) artifact.parts().get(0); - assertEquals(text, textPart.getText()); + assertEquals(text, textPart.text()); } @Test @@ -120,7 +120,7 @@ void testNewDataArtifactPartContainsProvidedData() { // Then DataPart dataPart = (DataPart) artifact.parts().get(0); - assertEquals(sampleData, dataPart.getData()); + assertEquals(sampleData, dataPart.data()); } @Test diff --git a/spec-grpc/src/main/java/io/a2a/grpc/mapper/APIKeySecuritySchemeMapper.java b/spec-grpc/src/main/java/io/a2a/grpc/mapper/APIKeySecuritySchemeMapper.java index 8dd44a18a..2b1a068f8 100644 --- a/spec-grpc/src/main/java/io/a2a/grpc/mapper/APIKeySecuritySchemeMapper.java +++ b/spec-grpc/src/main/java/io/a2a/grpc/mapper/APIKeySecuritySchemeMapper.java @@ -14,7 +14,7 @@ public interface APIKeySecuritySchemeMapper { APIKeySecuritySchemeMapper INSTANCE = A2AMappers.getMapper(APIKeySecuritySchemeMapper.class); // location enum is converted to string via ProtoMapperConfig.map(Location) - @Mapping(target = "description", source = "description", conditionExpression = "java(domain.getDescription() != null)") + @Mapping(target = "description", source = "description", conditionExpression = "java(domain.description() != null)") io.a2a.grpc.APIKeySecurityScheme toProto(io.a2a.spec.APIKeySecurityScheme domain); default io.a2a.spec.APIKeySecurityScheme fromProto(io.a2a.grpc.APIKeySecurityScheme proto) { diff --git a/spec-grpc/src/main/java/io/a2a/grpc/mapper/DataPartMapper.java b/spec-grpc/src/main/java/io/a2a/grpc/mapper/DataPartMapper.java index 9ce364c0a..9ee0f94d3 100644 --- a/spec-grpc/src/main/java/io/a2a/grpc/mapper/DataPartMapper.java +++ b/spec-grpc/src/main/java/io/a2a/grpc/mapper/DataPartMapper.java @@ -24,30 +24,13 @@ public interface DataPartMapper { * Uses CommonFieldMapper for Map → Struct conversion. * Metadata is ignored (not part of proto definition). */ - @Mapping(target = "data", source = "data", conditionExpression = "java(domain.getData() != null)", qualifiedByName = "mapToStruct") + @Mapping(target = "data", source = "data", conditionExpression = "java(domain.data() != null)", qualifiedByName = "mapToStruct") io.a2a.grpc.DataPart toProto(io.a2a.spec.DataPart domain); /** * Converts proto DataPart to domain DataPart. - * Uses CommonFieldMapper for Struct → Map conversion. - * Uses factory method to construct DataPart with single-arg constructor. - * Metadata is ignored (not part of proto definition). + * Uses CommonFieldMapper for Struct → Map conversion via Builder. */ @Mapping(target = "data", source = "data", qualifiedByName = "structToMap") io.a2a.spec.DataPart fromProto(io.a2a.grpc.DataPart proto); - - /** - * Object factory for creating DataPart instances. - *

- * Resolves constructor ambiguity by explicitly using the single-arg constructor. - * The metadata field will be null (not part of proto definition). - * - * @param proto the proto DataPart - * @return new DataPart instance using single-arg constructor - */ - @ObjectFactory - default io.a2a.spec.DataPart createDataPart(io.a2a.grpc.DataPart proto) { - java.util.Map data = A2ACommonFieldMapper.INSTANCE.structToMap(proto.getData()); - return new io.a2a.spec.DataPart(data); - } } diff --git a/spec-grpc/src/main/java/io/a2a/grpc/mapper/FilePartMapper.java b/spec-grpc/src/main/java/io/a2a/grpc/mapper/FilePartMapper.java index 347a15684..2174f2dc8 100644 --- a/spec-grpc/src/main/java/io/a2a/grpc/mapper/FilePartMapper.java +++ b/spec-grpc/src/main/java/io/a2a/grpc/mapper/FilePartMapper.java @@ -32,7 +32,7 @@ default io.a2a.grpc.FilePart toProto(io.a2a.spec.FilePart domain) { } io.a2a.grpc.FilePart.Builder builder = io.a2a.grpc.FilePart.newBuilder(); - FileContent fileContent = domain.getFile(); + FileContent fileContent = domain.file(); if (fileContent instanceof FileWithBytes fileWithBytes) { builder.setFileWithBytes(ByteString.copyFrom(Base64.getDecoder().decode(fileWithBytes.bytes()))); diff --git a/spec-grpc/src/main/java/io/a2a/grpc/mapper/HTTPAuthSecuritySchemeMapper.java b/spec-grpc/src/main/java/io/a2a/grpc/mapper/HTTPAuthSecuritySchemeMapper.java index 629fcdd37..4953635a1 100644 --- a/spec-grpc/src/main/java/io/a2a/grpc/mapper/HTTPAuthSecuritySchemeMapper.java +++ b/spec-grpc/src/main/java/io/a2a/grpc/mapper/HTTPAuthSecuritySchemeMapper.java @@ -13,8 +13,8 @@ public interface HTTPAuthSecuritySchemeMapper { HTTPAuthSecuritySchemeMapper INSTANCE = A2AMappers.getMapper(HTTPAuthSecuritySchemeMapper.class); - @Mapping(target = "bearerFormat", source = "bearerFormat", conditionExpression = "java(domain.getBearerFormat() != null)") - @Mapping(target = "description", source = "description", conditionExpression = "java(domain.getDescription() != null)") + @Mapping(target = "bearerFormat", source = "bearerFormat", conditionExpression = "java(domain.bearerFormat() != null)") + @Mapping(target = "description", source = "description", conditionExpression = "java(domain.description() != null)") io.a2a.grpc.HTTPAuthSecurityScheme toProto(io.a2a.spec.HTTPAuthSecurityScheme domain); default io.a2a.spec.HTTPAuthSecurityScheme fromProto(io.a2a.grpc.HTTPAuthSecurityScheme proto) { diff --git a/spec-grpc/src/main/java/io/a2a/grpc/mapper/MessageMapper.java b/spec-grpc/src/main/java/io/a2a/grpc/mapper/MessageMapper.java index 53dd56222..6888379f1 100644 --- a/spec-grpc/src/main/java/io/a2a/grpc/mapper/MessageMapper.java +++ b/spec-grpc/src/main/java/io/a2a/grpc/mapper/MessageMapper.java @@ -24,9 +24,9 @@ public interface MessageMapper { * Converts domain Message to proto Message. * Uses CommonFieldMapper for metadata conversion and ADDER_PREFERRED for lists. */ - @Mapping(target = "messageId", source = "messageId", conditionExpression = "java(domain.getMessageId() != null)") - @Mapping(target = "contextId", source = "contextId", conditionExpression = "java(domain.getContextId() != null)") - @Mapping(target = "taskId", source = "taskId", conditionExpression = "java(domain.getTaskId() != null)") + @Mapping(target = "messageId", source = "messageId", conditionExpression = "java(domain.messageId() != null)") + @Mapping(target = "contextId", source = "contextId", conditionExpression = "java(domain.contextId() != null)") + @Mapping(target = "taskId", source = "taskId", conditionExpression = "java(domain.taskId() != null)") @Mapping(target = "metadata", source = "metadata", qualifiedByName = "metadataToProto") io.a2a.grpc.Message toProto(Message domain); diff --git a/spec-grpc/src/main/java/io/a2a/grpc/mapper/MutualTLSSecuritySchemeMapper.java b/spec-grpc/src/main/java/io/a2a/grpc/mapper/MutualTLSSecuritySchemeMapper.java index 2464d0c38..c6155d580 100644 --- a/spec-grpc/src/main/java/io/a2a/grpc/mapper/MutualTLSSecuritySchemeMapper.java +++ b/spec-grpc/src/main/java/io/a2a/grpc/mapper/MutualTLSSecuritySchemeMapper.java @@ -13,7 +13,7 @@ public interface MutualTLSSecuritySchemeMapper { MutualTLSSecuritySchemeMapper INSTANCE = A2AMappers.getMapper(MutualTLSSecuritySchemeMapper.class); - @Mapping(target = "description", source = "description", conditionExpression = "java(domain.getDescription() != null)") + @Mapping(target = "description", source = "description", conditionExpression = "java(domain.description() != null)") io.a2a.grpc.MutualTlsSecurityScheme toProto(io.a2a.spec.MutualTLSSecurityScheme domain); default io.a2a.spec.MutualTLSSecurityScheme fromProto(io.a2a.grpc.MutualTlsSecurityScheme proto) { diff --git a/spec-grpc/src/main/java/io/a2a/grpc/mapper/OAuth2SecuritySchemeMapper.java b/spec-grpc/src/main/java/io/a2a/grpc/mapper/OAuth2SecuritySchemeMapper.java index b762f720b..088cb509d 100644 --- a/spec-grpc/src/main/java/io/a2a/grpc/mapper/OAuth2SecuritySchemeMapper.java +++ b/spec-grpc/src/main/java/io/a2a/grpc/mapper/OAuth2SecuritySchemeMapper.java @@ -14,8 +14,8 @@ public interface OAuth2SecuritySchemeMapper { OAuth2SecuritySchemeMapper INSTANCE = A2AMappers.getMapper(OAuth2SecuritySchemeMapper.class); - @Mapping(target = "description", source = "description", conditionExpression = "java(domain.getDescription() != null)") - @Mapping(target = "oauth2MetadataUrl", source = "oauth2MetadataUrl", conditionExpression = "java(domain.getOauth2MetadataUrl() != null)") + @Mapping(target = "description", source = "description", conditionExpression = "java(domain.description() != null)") + @Mapping(target = "oauth2MetadataUrl", source = "oauth2MetadataUrl", conditionExpression = "java(domain.oauth2MetadataUrl() != null)") io.a2a.grpc.OAuth2SecurityScheme toProto(io.a2a.spec.OAuth2SecurityScheme domain); default io.a2a.spec.OAuth2SecurityScheme fromProto(io.a2a.grpc.OAuth2SecurityScheme proto) { diff --git a/spec-grpc/src/main/java/io/a2a/grpc/mapper/OpenIdConnectSecuritySchemeMapper.java b/spec-grpc/src/main/java/io/a2a/grpc/mapper/OpenIdConnectSecuritySchemeMapper.java index 14d848fd9..da1dd2d6b 100644 --- a/spec-grpc/src/main/java/io/a2a/grpc/mapper/OpenIdConnectSecuritySchemeMapper.java +++ b/spec-grpc/src/main/java/io/a2a/grpc/mapper/OpenIdConnectSecuritySchemeMapper.java @@ -13,7 +13,7 @@ public interface OpenIdConnectSecuritySchemeMapper { OpenIdConnectSecuritySchemeMapper INSTANCE = A2AMappers.getMapper(OpenIdConnectSecuritySchemeMapper.class); - @Mapping(target = "description", source = "description", conditionExpression = "java(domain.getDescription() != null)") + @Mapping(target = "description", source = "description", conditionExpression = "java(domain.description() != null)") io.a2a.grpc.OpenIdConnectSecurityScheme toProto(io.a2a.spec.OpenIdConnectSecurityScheme domain); default io.a2a.spec.OpenIdConnectSecurityScheme fromProto(io.a2a.grpc.OpenIdConnectSecurityScheme proto) { diff --git a/spec-grpc/src/main/java/io/a2a/grpc/mapper/PartMapper.java b/spec-grpc/src/main/java/io/a2a/grpc/mapper/PartMapper.java index a82d8527c..98c777256 100644 --- a/spec-grpc/src/main/java/io/a2a/grpc/mapper/PartMapper.java +++ b/spec-grpc/src/main/java/io/a2a/grpc/mapper/PartMapper.java @@ -37,7 +37,7 @@ default io.a2a.grpc.Part toProto(Part domain) { io.a2a.grpc.Part.Builder builder = io.a2a.grpc.Part.newBuilder(); if (domain instanceof TextPart textPart) { - builder.setText(textPart.getText()); + builder.setText(textPart.text()); } else if (domain instanceof FilePart filePart) { builder.setFile(FilePartMapper.INSTANCE.toProto(filePart)); } else if (domain instanceof DataPart dataPart) { diff --git a/spec-grpc/src/main/java/io/a2a/grpc/mapper/TaskArtifactUpdateEventMapper.java b/spec-grpc/src/main/java/io/a2a/grpc/mapper/TaskArtifactUpdateEventMapper.java index 6c907d22b..2c52d80d2 100644 --- a/spec-grpc/src/main/java/io/a2a/grpc/mapper/TaskArtifactUpdateEventMapper.java +++ b/spec-grpc/src/main/java/io/a2a/grpc/mapper/TaskArtifactUpdateEventMapper.java @@ -20,8 +20,8 @@ public interface TaskArtifactUpdateEventMapper { * Converts domain TaskArtifactUpdateEvent to proto. * Uses declarative mapping with CommonFieldMapper for metadata conversion. */ - @Mapping(target = "append", source = "append", conditionExpression = "java(domain.isAppend() != null)") - @Mapping(target = "lastChunk", source = "lastChunk", conditionExpression = "java(domain.isLastChunk() != null)") + @Mapping(target = "append", source = "append", conditionExpression = "java(domain.append() != null)") + @Mapping(target = "lastChunk", source = "lastChunk", conditionExpression = "java(domain.lastChunk() != null)") @Mapping(target = "metadata", source = "metadata", qualifiedByName = "metadataToProto") io.a2a.grpc.TaskArtifactUpdateEvent toProto(TaskArtifactUpdateEvent domain); diff --git a/spec-grpc/src/main/java/io/a2a/grpc/mapper/TaskMapper.java b/spec-grpc/src/main/java/io/a2a/grpc/mapper/TaskMapper.java index a76cb259b..20ece6064 100644 --- a/spec-grpc/src/main/java/io/a2a/grpc/mapper/TaskMapper.java +++ b/spec-grpc/src/main/java/io/a2a/grpc/mapper/TaskMapper.java @@ -24,8 +24,8 @@ public interface TaskMapper { * Converts domain Task to proto Task. * Uses CommonFieldMapper for metadata conversion and ADDER_PREFERRED for lists. */ - @Mapping(target = "id", source = "id", conditionExpression = "java(domain.getId() != null)") - @Mapping(target = "contextId", source = "contextId", conditionExpression = "java(domain.getContextId() != null)") + @Mapping(target = "id", source = "id", conditionExpression = "java(domain.id() != null)") + @Mapping(target = "contextId", source = "contextId", conditionExpression = "java(domain.contextId() != null)") @Mapping(target = "metadata", source = "metadata", qualifiedByName = "metadataToProto") io.a2a.grpc.Task toProto(Task domain); diff --git a/spec-grpc/src/main/java/io/a2a/grpc/mapper/TaskStatusUpdateEventMapper.java b/spec-grpc/src/main/java/io/a2a/grpc/mapper/TaskStatusUpdateEventMapper.java index bcda1795c..8187df48a 100644 --- a/spec-grpc/src/main/java/io/a2a/grpc/mapper/TaskStatusUpdateEventMapper.java +++ b/spec-grpc/src/main/java/io/a2a/grpc/mapper/TaskStatusUpdateEventMapper.java @@ -20,10 +20,10 @@ public interface TaskStatusUpdateEventMapper { /** * Converts domain TaskStatusUpdateEvent to proto. * Uses declarative mapping with CommonFieldMapper for metadata conversion. - * Note: MapStruct derives property "final" from domain's isFinal() getter (strips "is" prefix). + * Maps record's isFinal field to proto's final field. */ @Mapping(target = "metadata", source = "metadata", qualifiedByName = "metadataToProto") - @Mapping(target = "final", source = "final") + @Mapping(target = "final", source = "isFinal") io.a2a.grpc.TaskStatusUpdateEvent toProto(TaskStatusUpdateEvent domain); /** diff --git a/spec-grpc/src/test/java/io/a2a/grpc/mapper/StreamResponseMapperTest.java b/spec-grpc/src/test/java/io/a2a/grpc/mapper/StreamResponseMapperTest.java index 34c856208..ba1496547 100644 --- a/spec-grpc/src/test/java/io/a2a/grpc/mapper/StreamResponseMapperTest.java +++ b/spec-grpc/src/test/java/io/a2a/grpc/mapper/StreamResponseMapperTest.java @@ -59,9 +59,9 @@ void testConvertTask_FromProto() { assertNotNull(result); assertInstanceOf(Task.class, result); Task task = (Task) result; - assertEquals("task-123", task.getId()); - assertEquals("context-456", task.getContextId()); - assertEquals(TaskState.COMPLETED, task.getStatus().state()); + assertEquals("task-123", task.id()); + assertEquals("context-456", task.contextId()); + assertEquals(TaskState.COMPLETED, task.status().state()); } @Test @@ -106,9 +106,9 @@ void testConvertMessage_FromProto() { assertNotNull(result); assertInstanceOf(Message.class, result); Message message = (Message) result; - assertEquals("msg-123", message.getMessageId()); - assertEquals("context-456", message.getContextId()); - assertEquals(Message.Role.USER, message.getRole()); + assertEquals("msg-123", message.messageId()); + assertEquals("context-456", message.contextId()); + assertEquals(Message.Role.USER, message.role()); } @Test @@ -154,9 +154,9 @@ void testConvertTaskStatusUpdateEvent_FromProto() { assertNotNull(result); assertInstanceOf(TaskStatusUpdateEvent.class, result); TaskStatusUpdateEvent event = (TaskStatusUpdateEvent) result; - assertEquals("task-123", event.getTaskId()); - assertEquals("context-456", event.getContextId()); - assertEquals(TaskState.WORKING, event.getStatus().state()); + assertEquals("task-123", event.taskId()); + assertEquals("context-456", event.contextId()); + assertEquals(TaskState.WORKING, event.status().state()); assertEquals(false, event.isFinal()); } @@ -209,10 +209,10 @@ void testConvertTaskArtifactUpdateEvent_FromProto() { assertNotNull(result); assertInstanceOf(TaskArtifactUpdateEvent.class, result); TaskArtifactUpdateEvent event = (TaskArtifactUpdateEvent) result; - assertEquals("task-123", event.getTaskId()); - assertEquals("context-456", event.getContextId()); - assertEquals("artifact-1", event.getArtifact().artifactId()); - assertEquals("result", event.getArtifact().name()); + assertEquals("task-123", event.taskId()); + assertEquals("context-456", event.contextId()); + assertEquals("artifact-1", event.artifact().artifactId()); + assertEquals("result", event.artifact().name()); } @Test @@ -244,9 +244,9 @@ void testConvertStreamResponse_Roundtrip_Task() { assertNotNull(result); assertInstanceOf(Task.class, result); Task roundtrippedTask = (Task) result; - assertEquals(originalTask.getId(), roundtrippedTask.getId()); - assertEquals(originalTask.getContextId(), roundtrippedTask.getContextId()); - assertEquals(originalTask.getStatus().state(), roundtrippedTask.getStatus().state()); + assertEquals(originalTask.id(), roundtrippedTask.id()); + assertEquals(originalTask.contextId(), roundtrippedTask.contextId()); + assertEquals(originalTask.status().state(), roundtrippedTask.status().state()); } @Test @@ -267,8 +267,8 @@ void testConvertStreamResponse_Roundtrip_Message() { assertNotNull(result); assertInstanceOf(Message.class, result); Message roundtrippedMessage = (Message) result; - assertEquals(originalMessage.getMessageId(), roundtrippedMessage.getMessageId()); - assertEquals(originalMessage.getContextId(), roundtrippedMessage.getContextId()); - assertEquals(originalMessage.getRole(), roundtrippedMessage.getRole()); + assertEquals(originalMessage.messageId(), roundtrippedMessage.messageId()); + assertEquals(originalMessage.contextId(), roundtrippedMessage.contextId()); + assertEquals(originalMessage.role(), roundtrippedMessage.role()); } } diff --git a/spec-grpc/src/test/java/io/a2a/grpc/utils/ToProtoTest.java b/spec-grpc/src/test/java/io/a2a/grpc/utils/ToProtoTest.java index be5d358b2..d863efc17 100644 --- a/spec-grpc/src/test/java/io/a2a/grpc/utils/ToProtoTest.java +++ b/spec-grpc/src/test/java/io/a2a/grpc/utils/ToProtoTest.java @@ -289,7 +289,7 @@ public void convertTaskTimestampStatus() { io.a2a.grpc.Task grpcTask = ProtoUtils.ToProto.task(task); task = ProtoUtils.FromProto.task(grpcTask); - TaskStatus status = task.getStatus(); + TaskStatus status = task.status(); assertEquals(TaskState.COMPLETED, status.state()); assertNotNull(status.timestamp()); assertEquals(expectedTimestamp, status.timestamp()); diff --git a/spec/src/main/java/io/a2a/json/JsonMappingException.java b/spec/src/main/java/io/a2a/json/JsonMappingException.java index 550b7827c..8d3ad48e7 100644 --- a/spec/src/main/java/io/a2a/json/JsonMappingException.java +++ b/spec/src/main/java/io/a2a/json/JsonMappingException.java @@ -17,7 +17,7 @@ *

{@code
  * try {
  *     Task task = JsonUtil.fromJson(json, Task.class);
- *     if (task.getId() == null) {
+ *     if (task.id() == null) {
  *         throw new JsonMappingException(null, "Task ID cannot be null");
  *     }
  * } catch (JsonProcessingException e) {
diff --git a/spec/src/main/java/io/a2a/json/JsonUtil.java b/spec/src/main/java/io/a2a/json/JsonUtil.java
index 2ea564483..4fdc63878 100644
--- a/spec/src/main/java/io/a2a/json/JsonUtil.java
+++ b/spec/src/main/java/io/a2a/json/JsonUtil.java
@@ -1,11 +1,5 @@
 package io.a2a.json;
 
-import static com.google.gson.stream.JsonToken.BEGIN_ARRAY;
-import static com.google.gson.stream.JsonToken.BEGIN_OBJECT;
-import static com.google.gson.stream.JsonToken.BOOLEAN;
-import static com.google.gson.stream.JsonToken.NULL;
-import static com.google.gson.stream.JsonToken.NUMBER;
-import static com.google.gson.stream.JsonToken.STRING;
 import static io.a2a.spec.A2AErrorCodes.CONTENT_TYPE_NOT_SUPPORTED_ERROR_CODE;
 import static io.a2a.spec.A2AErrorCodes.INTERNAL_ERROR_CODE;
 import static io.a2a.spec.A2AErrorCodes.INVALID_AGENT_RESPONSE_ERROR_CODE;
@@ -591,16 +585,28 @@ public void write(JsonWriter out, Part value) throws java.io.IOException {
                 out.nullValue();
                 return;
             }
-            // Delegate to Gson's default serialization for the concrete type
+
+            // Serialize the concrete type to a JsonElement
+            com.google.gson.JsonElement jsonElement;
             if (value instanceof TextPart textPart) {
-                delegateGson.toJson(textPart, TextPart.class, out);
+                jsonElement = delegateGson.toJsonTree(textPart, TextPart.class);
             } else if (value instanceof FilePart filePart) {
-                delegateGson.toJson(filePart, FilePart.class, out);
+                jsonElement = delegateGson.toJsonTree(filePart, FilePart.class);
             } else if (value instanceof DataPart dataPart) {
-                delegateGson.toJson(dataPart, DataPart.class, out);
+                jsonElement = delegateGson.toJsonTree(dataPart, DataPart.class);
             } else {
                 throw new JsonSyntaxException("Unknown Part subclass: " + value.getClass().getName());
             }
+
+
+            // TODO temorary workaround to be fixed in https://github.com/a2aproject/a2a-java/issues/544
+            // Add the "kind" field from getKind() method
+            if (jsonElement.isJsonObject()) {
+                jsonElement.getAsJsonObject().addProperty("kind", value.getKind().asString());
+            }
+
+            // Write the modified JSON
+            delegateGson.toJson(jsonElement, out);
         }
 
         @Override
@@ -666,18 +672,29 @@ public void write(JsonWriter out, StreamingEventKind value) throws java.io.IOExc
                 out.nullValue();
                 return;
             }
-            // Delegate to Gson's default serialization for the concrete type
+
+            // Serialize the concrete type to a JsonElement
+            com.google.gson.JsonElement jsonElement;
             if (value instanceof Task task) {
-                delegateGson.toJson(task, Task.class, out);
+                jsonElement = delegateGson.toJsonTree(task, Task.class);
             } else if (value instanceof Message message) {
-                delegateGson.toJson(message, Message.class, out);
+                jsonElement = delegateGson.toJsonTree(message, Message.class);
             } else if (value instanceof TaskStatusUpdateEvent event) {
-                delegateGson.toJson(event, TaskStatusUpdateEvent.class, out);
+                jsonElement = delegateGson.toJsonTree(event, TaskStatusUpdateEvent.class);
             } else if (value instanceof TaskArtifactUpdateEvent event) {
-                delegateGson.toJson(event, TaskArtifactUpdateEvent.class, out);
+                jsonElement = delegateGson.toJsonTree(event, TaskArtifactUpdateEvent.class);
             } else {
                 throw new JsonSyntaxException("Unknown StreamingEventKind implementation: " + value.getClass().getName());
             }
+
+            // TODO temorary workaround to be fixed in https://github.com/a2aproject/a2a-java/issues/544
+            // Add the "kind" field from getKind() method
+            if (jsonElement.isJsonObject()) {
+                jsonElement.getAsJsonObject().addProperty("kind", value.kind());
+            }
+
+            // Write the modified JSON
+            delegateGson.toJson(jsonElement, out);
         }
 
         @Override
diff --git a/spec/src/main/java/io/a2a/spec/APIKeySecurityScheme.java b/spec/src/main/java/io/a2a/spec/APIKeySecurityScheme.java
index 43141ce2e..01fc23509 100644
--- a/spec/src/main/java/io/a2a/spec/APIKeySecurityScheme.java
+++ b/spec/src/main/java/io/a2a/spec/APIKeySecurityScheme.java
@@ -12,18 +12,31 @@
  * 

* Corresponds to the OpenAPI "apiKey" security scheme type. * + * @param location the location where the API key is sent (required) + * @param name the name of the API key parameter (required) + * @param description a human-readable description (optional) * @see SecurityScheme for the base interface * @see OpenAPI Security Scheme * @see A2A Protocol Specification */ -public final class APIKeySecurityScheme implements SecurityScheme { +public record APIKeySecurityScheme( + Location location, + String name, + String description +) implements SecurityScheme { /** The security scheme type identifier for API key authentication. */ public static final String API_KEY = "apiKey"; - private final Location location; - private final String name; - private final String type; - private final String description; + + /** + * Compact constructor with validation. + * + * @throws IllegalArgumentException if location or name is null + */ + public APIKeySecurityScheme { + Assert.checkNotNullParam("location", location); + Assert.checkNotNullParam("name", name); + } /** * Represents the location of the API key. @@ -76,78 +89,6 @@ public static Location fromString(String location) { } } - /** - * Creates a new APIKeySecurityScheme with the specified location, name, and description. - * - * @param location the location where the API key is sent (required) - * @param name the name of the API key parameter (required) - * @param description a human-readable description (optional) - * @throws IllegalArgumentException if location or name is null - */ - public APIKeySecurityScheme(Location location, String name, String description) { - this(location, name, description, API_KEY); - } - - /** - * Creates a new APIKeySecurityScheme with explicit type specification. - * - * @param location the location where the API key is sent (required) - * @param name the name of the API key parameter (required) - * @param description a human-readable description (optional) - * @param type the security scheme type (must be "apiKey") - * @throws IllegalArgumentException if location, name, or type is null, or if type is not "apiKey" - */ - public APIKeySecurityScheme(Location location, String name, - String description, String type) { - Assert.checkNotNullParam("location", location); - Assert.checkNotNullParam("name", name); - Assert.checkNotNullParam("type", type); - if (! type.equals(API_KEY)) { - throw new IllegalArgumentException("Invalid type for APIKeySecurityScheme"); - } - this.location = location; - this.name = name; - this.description = description; - this.type = type; - } - - /** - * Gets the human-readable description of this security scheme. - * - * @return the description, or null if not provided - */ - @Override - public String getDescription() { - return description; - } - - /** - * Gets the location where the API key is sent. - * - * @return the API key location - */ - public Location getLocation() { - return location; - } - - /** - * Gets the name of the API key parameter. - * - * @return the parameter name - */ - public String getName() { - return name; - } - - /** - * Gets the security scheme type. - * - * @return always returns "apiKey" - */ - public String getType() { - return type; - } - /** * Create a new Builder * diff --git a/spec/src/main/java/io/a2a/spec/DataPart.java b/spec/src/main/java/io/a2a/spec/DataPart.java index 91b16bc4f..8cbc83af0 100644 --- a/spec/src/main/java/io/a2a/spec/DataPart.java +++ b/spec/src/main/java/io/a2a/spec/DataPart.java @@ -4,6 +4,8 @@ import io.a2a.util.Assert; +import static io.a2a.util.Utils.SPEC_VERSION_1_0; + /** * Represents a structured data content part within a {@link Message} or {@link Artifact}. @@ -31,40 +33,71 @@ * ); * }

* + * @param data the structured data map (required, defensively copied for immutability) * @see Part * @see Message * @see Artifact */ -public class DataPart extends Part> { +public record DataPart(Map data) implements Part> { /** The type identifier for data parts in messages and artifacts. */ public static final String DATA = "data"; - private final Map data; - private final Kind kind; /** - * Constructs a DataPart with structured data. + * Compact constructor with validation and defensive copying. * - * @param data the structured data map (required) * @throws IllegalArgumentException if data is null */ - public DataPart(Map data) { + public DataPart { Assert.checkNotNullParam("data", data); - this.data = data; - this.kind = Kind.DATA; + data = Map.copyOf(data); } @Override public Kind getKind() { - return kind; + return Kind.DATA; } /** - * Gets the structured data contained in this part. + * Create a new Builder * - * @return a map of key-value pairs representing the data + * @return the builder + */ + public static Builder builder() { + return new Builder(); + } + + /** + * Builder for constructing immutable {@link DataPart} instances. */ - public Map getData() { - return data; + public static class Builder { + private Map data; + + /** + * Creates a new Builder with all fields unset. + */ + private Builder() { + } + + /** + * Sets the structured data map. + * + * @param data the structured data (required) + * @return this builder for method chaining + */ + public Builder data(Map data) { + this.data = data; + return this; + } + + /** + * Builds a new immutable {@link DataPart} from the current builder state. + * + * @return a new DataPart instance + * @throws IllegalArgumentException if data is null + */ + public DataPart build() { + return new DataPart(data); + } } } diff --git a/spec/src/main/java/io/a2a/spec/EventKind.java b/spec/src/main/java/io/a2a/spec/EventKind.java index 7c53cf653..982bc82f7 100644 --- a/spec/src/main/java/io/a2a/spec/EventKind.java +++ b/spec/src/main/java/io/a2a/spec/EventKind.java @@ -26,5 +26,5 @@ public interface EventKind { * * @return the event kind string (e.g., "task", "message") */ - String getKind(); + String kind(); } diff --git a/spec/src/main/java/io/a2a/spec/FilePart.java b/spec/src/main/java/io/a2a/spec/FilePart.java index 5d06e8f26..f7c3e7426 100644 --- a/spec/src/main/java/io/a2a/spec/FilePart.java +++ b/spec/src/main/java/io/a2a/spec/FilePart.java @@ -3,6 +3,8 @@ import io.a2a.util.Assert; +import static io.a2a.util.Utils.SPEC_VERSION_1_0; + /** * Represents a file content part within a {@link Message} or {@link Artifact}. @@ -30,43 +32,29 @@ * ); * } * + * @param file the file content (required, either FileWithBytes or FileWithUri) * @see Part * @see FileContent * @see FileWithBytes * @see FileWithUri */ -public class FilePart extends Part { +public record FilePart(FileContent file) implements Part { /** The type identifier for file parts in messages and artifacts. */ public static final String FILE = "file"; - private final FileContent file; - private final Kind kind; - /** - * Constructs a FilePart with file content. + * Compact constructor with validation. * - * @param file the file content (required, either FileWithBytes or FileWithUri) * @throws IllegalArgumentException if file is null */ - public FilePart(FileContent file) { + public FilePart { Assert.checkNotNullParam("file", file); - this.file = file; - this.kind = Kind.FILE; } @Override public Kind getKind() { - return kind; - } - - /** - * Gets the file content contained in this part. - * - * @return the file content (FileWithBytes or FileWithUri) - */ - public FileContent getFile() { - return file; + return Kind.FILE; } -} \ No newline at end of file +} diff --git a/spec/src/main/java/io/a2a/spec/HTTPAuthSecurityScheme.java b/spec/src/main/java/io/a2a/spec/HTTPAuthSecurityScheme.java index e2f6433cb..76620d868 100644 --- a/spec/src/main/java/io/a2a/spec/HTTPAuthSecurityScheme.java +++ b/spec/src/main/java/io/a2a/spec/HTTPAuthSecurityScheme.java @@ -3,6 +3,7 @@ import io.a2a.util.Assert; import static io.a2a.spec.HTTPAuthSecurityScheme.HTTP; +import static io.a2a.util.Utils.SPEC_VERSION_1_0; /** * HTTP authentication security scheme for agent authentication. @@ -22,88 +23,37 @@ *

* Example usage: *

{@code
- * HTTPAuthSecurityScheme scheme = new HTTPAuthSecurityScheme.Builder()
+ * HTTPAuthSecurityScheme scheme = HTTPAuthSecurityScheme.builder()
  *     .scheme("bearer")
  *     .bearerFormat("JWT")
  *     .description("JWT bearer token authentication")
  *     .build();
  * }
* + * @param bearerFormat the bearer token format (optional) + * @param scheme the authentication scheme (required) + * @param description the scheme description (optional) * @see SecurityScheme for the base interface * @see OpenAPI Security Scheme * @see RFC 7235 - HTTP Authentication * @see A2A Protocol Specification */ -public final class HTTPAuthSecurityScheme implements SecurityScheme { +public record HTTPAuthSecurityScheme( + String bearerFormat, + String scheme, + String description +) implements SecurityScheme { /** The HTTP security scheme type identifier. */ public static final String HTTP = "http"; - private final String bearerFormat; - private final String scheme; - private final String description; - private final String type; /** - * Constructs HTTP auth security scheme without type. + * Compact constructor with validation. * - * @param bearerFormat the bearer token format - * @param scheme the authentication scheme - * @param description the scheme description + * @throws IllegalArgumentException if scheme is null */ - public HTTPAuthSecurityScheme(String bearerFormat, String scheme, String description) { - this(bearerFormat, scheme, description, HTTP); - } - - /** - * Constructs HTTP auth security scheme with full parameters. - * - * @param bearerFormat the bearer token format - * @param scheme the authentication scheme - * @param description the scheme description - * @param type the security scheme type - */ - public HTTPAuthSecurityScheme(String bearerFormat, String scheme, String description, String type) { + public HTTPAuthSecurityScheme { Assert.checkNotNullParam("scheme", scheme); - Assert.checkNotNullParam("type", type); - if (! HTTP.equals(type)) { - throw new IllegalArgumentException("Invalid type for HTTPAuthSecurityScheme"); - } - this.bearerFormat = bearerFormat; - this.scheme = scheme; - this.description = description; - this.type = type; - } - - @Override - public String getDescription() { - return description; - } - - /** - * Gets the bearer token format. - * - * @return the bearer format - */ - public String getBearerFormat() { - return bearerFormat; - } - - /** - * Gets the authentication scheme. - * - * @return the scheme - */ - public String getScheme() { - return scheme; - } - - /** - * Gets the security scheme type. - * - * @return the type - */ - public String getType() { - return type; } /** diff --git a/spec/src/main/java/io/a2a/spec/Message.java b/spec/src/main/java/io/a2a/spec/Message.java index fb8825d48..b218b5396 100644 --- a/spec/src/main/java/io/a2a/spec/Message.java +++ b/spec/src/main/java/io/a2a/spec/Message.java @@ -7,6 +7,7 @@ import io.a2a.util.Assert; import static io.a2a.spec.Message.MESSAGE; +import static io.a2a.util.Utils.SPEC_VERSION_1_0; /** * Represents a single message in the conversation between a user and an agent in the A2A Protocol. @@ -25,183 +26,51 @@ * This class is mutable (allows setting taskId and contextId) to support post-construction correlation * with tasks and conversation contexts. Use the {@link Builder} for construction. * + * @param role the role of the message sender (user or agent) + * @param parts the content parts of the message (text, file, or data) + * @param messageId the unique identifier for this message + * @param contextId the conversation context identifier + * @param taskId the task identifier this message is associated with + * @param referenceTaskIds list of reference task identifiers + * @param metadata additional metadata for the message + * @param extensions list of protocol extensions used in this message * @see A2A Protocol Specification */ -public final class Message implements EventKind, StreamingEventKind { +public record Message(Role role, List> parts, + String messageId, String contextId, + String taskId, List referenceTaskIds, + Map metadata, List extensions +) implements EventKind, StreamingEventKind { - /** - * The kind identifier for Message events: "message". - */ public static final String MESSAGE = "message"; - private final Role role; - private final List> parts; - private final String messageId; - private String contextId; - private String taskId; - private final Map metadata; - private final String kind; - private final List referenceTaskIds; - private final List extensions; - - /** - * Constructs a Message with default kind. - * - * @param role the message role (required) - * @param parts the message content parts (required) - * @param messageId the message identifier (required) - * @param contextId the context identifier (optional) - * @param taskId the task identifier (optional) - * @param referenceTaskIds list of related task IDs (optional) - * @param metadata additional metadata (optional) - * @param extensions list of protocol extensions (optional) - */ - public Message(Role role, List> parts, String messageId, String contextId, String taskId, - List referenceTaskIds, Map metadata, List extensions) { - this(role, parts, messageId, contextId, taskId, referenceTaskIds, metadata, extensions, MESSAGE); - } /** - * Constructs a Message with all parameters. + * Compact constructor with validation and defensive copying. * - * @param role the message role (required) - * @param parts the message content parts (required) - * @param messageId the message identifier (required) - * @param contextId the context identifier (optional) - * @param taskId the task identifier (optional) - * @param referenceTaskIds list of related task IDs (optional) - * @param metadata additional metadata (optional) - * @param extensions list of protocol extensions (optional) - * @param kind the event kind (must be "message") + * @throws IllegalArgumentException if role, parts, or messageId is null, or if parts is empty */ - public Message(Role role, List> parts, - String messageId, String contextId, - String taskId, List referenceTaskIds, - Map metadata, List extensions, - String kind) { - Assert.checkNotNullParam("kind", kind); + public Message { + Assert.checkNotNullParam("role", role); Assert.checkNotNullParam("parts", parts); + Assert.checkNotNullParam("messageId", messageId); if (parts.isEmpty()) { throw new IllegalArgumentException("Parts cannot be empty"); } - Assert.checkNotNullParam("role", role); - if (! kind.equals(MESSAGE)) { - throw new IllegalArgumentException("Invalid Message"); - } - Assert.checkNotNullParam("messageId", messageId); - this.role = role; - this.parts = parts; - this.messageId = messageId; - this.contextId = contextId; - this.taskId = taskId; - this.referenceTaskIds = referenceTaskIds; - this.metadata = metadata; - this.extensions = extensions; - this.kind = kind; - } - - /** - * Returns the role of the message sender. - * - * @return the message role (USER or AGENT) - */ - public Role getRole() { - return role; - } - - /** - * Returns the content parts of this message. - * - * @return an immutable list of message parts - */ - public List> getParts() { - return parts; - } - - /** - * Returns the unique identifier for this message. - * - * @return the message ID - */ - public String getMessageId() { - return messageId; - } - - /** - * Returns the conversation context identifier. - * - * @return the context ID, or null if not set - */ - public String getContextId() { - return contextId; - } - - /** - * Returns the task identifier this message is associated with. - * - * @return the task ID, or null if not set - */ - public String getTaskId() { - return taskId; - } - - /** - * Returns the metadata associated with this message. - * - * @return a map of metadata key-value pairs, or null if not set - */ - public Map getMetadata() { - return metadata; - } - - /** - * Sets the task identifier for this message. - *

- * This method allows associating the message with a task after construction. - * - * @param taskId the task ID to set - */ - public void setTaskId(String taskId) { - this.taskId = taskId; - } - - /** - * Sets the conversation context identifier for this message. - *

- * This method allows associating the message with a context after construction. - * - * @param contextId the context ID to set - */ - public void setContextId(String contextId) { - this.contextId = contextId; - } - - /** - * Returns the list of reference task identifiers this message relates to. - * - * @return a list of task IDs, or null if not set - */ - public List getReferenceTaskIds() { - return referenceTaskIds; - } - - /** - * Returns the list of protocol extensions used in this message. - * - * @return a list of extension identifiers, or null if not set - */ - public List getExtensions() { - return extensions; + parts = List.copyOf(parts); + referenceTaskIds = referenceTaskIds != null ? List.copyOf(referenceTaskIds) : null; + extensions = extensions != null ? List.copyOf(extensions) : null; + metadata = (metadata != null) ? Map.copyOf(metadata) : null; } @Override - public String getKind() { - return kind; + public String kind() { + return MESSAGE; } /** * Creates a new Builder for constructing Message instances. * - * @return a new Message.Builder instance + * @return a Message.builder instance */ public static Builder builder() { return new Builder(); @@ -211,7 +80,6 @@ public static Builder builder() { * Creates a new Builder initialized with values from an existing Message. * * @param message the Message to copy values from - * @return the builder */ public static Builder builder(Message message) { return new Builder(message); @@ -260,7 +128,7 @@ public String asString() { *

{@code
      * Message userMessage = Message.builder()
      *     .role(Message.Role.USER)
-     *     .parts(List.of(new TextPart("Hello, agent!", null)))
+     *     .parts(List.of(new TextPart("Hello, agent!")))
      *     .contextId("conv-123")
      *     .build();
      * }
@@ -288,14 +156,14 @@ private Builder() { * @param message the Message to copy values from */ private Builder(Message message) { - role = message.role; - parts = message.parts; - messageId = message.messageId; - contextId = message.contextId; - taskId = message.taskId; - referenceTaskIds = message.referenceTaskIds; - metadata = message.metadata; - extensions = message.extensions; + role = message.role(); + parts = message.parts(); + messageId = message.messageId(); + contextId = message.contextId(); + taskId = message.taskId(); + referenceTaskIds = message.referenceTaskIds(); + metadata = message.metadata(); + extensions = message.extensions(); } /** diff --git a/spec/src/main/java/io/a2a/spec/MutualTLSSecurityScheme.java b/spec/src/main/java/io/a2a/spec/MutualTLSSecurityScheme.java index f7b9dc1f9..659df3c7a 100644 --- a/spec/src/main/java/io/a2a/spec/MutualTLSSecurityScheme.java +++ b/spec/src/main/java/io/a2a/spec/MutualTLSSecurityScheme.java @@ -1,7 +1,5 @@ package io.a2a.spec; -import io.a2a.util.Assert; - import static io.a2a.spec.MutualTLSSecurityScheme.MUTUAL_TLS; /** @@ -22,68 +20,17 @@ * ); * } * + * @param description optional description of the security scheme * @see SecurityScheme for the base interface * @see OpenAPI Security Scheme * @see RFC 8446 - TLS 1.3 Client Authentication * @see A2A Protocol Specification */ -public final class MutualTLSSecurityScheme implements SecurityScheme { +public record MutualTLSSecurityScheme(String description) implements SecurityScheme { /** * The type identifier for mutual TLS security schemes: "mutualTLS". */ public static final String MUTUAL_TLS = "mutualTLS"; - private final String description; - private final String type; - - /** - * Constructs a mutual TLS security scheme with the specified description. - * - * @param description optional description of the security scheme - */ - public MutualTLSSecurityScheme(String description) { - this(description, MUTUAL_TLS); - } - - /** - * Constructs a mutual TLS security scheme with no description. - */ - public MutualTLSSecurityScheme() { - this(null, MUTUAL_TLS); - } - - /** - * Constructs a mutual TLS security scheme with the specified description and type. - * - * @param description optional description of the security scheme - * @param type the security scheme type (must be "mutualTLS") - */ - public MutualTLSSecurityScheme(String description, String type) { - Assert.checkNotNullParam("type", type); - if (!type.equals(MUTUAL_TLS)) { - throw new IllegalArgumentException("Invalid type for MutualTLSSecurityScheme"); - } - this.description = description; - this.type = type; - } - - /** - * Gets the Description. - * - * @return the Description - */ - @Override - public String getDescription() { - return description; - } - - /** - * Gets the Type. - * - * @return the Type - */ - public String getType() { - return type; - } } diff --git a/spec/src/main/java/io/a2a/spec/OAuth2SecurityScheme.java b/spec/src/main/java/io/a2a/spec/OAuth2SecurityScheme.java index 9194069ef..ee6557efc 100644 --- a/spec/src/main/java/io/a2a/spec/OAuth2SecurityScheme.java +++ b/spec/src/main/java/io/a2a/spec/OAuth2SecurityScheme.java @@ -13,88 +13,32 @@ *

* Corresponds to the OpenAPI "oauth2" security scheme type. * + * @param flows the OAuth 2.0 flow configuration (required) + * @param description optional description of the security scheme + * @param oauth2MetadataUrl optional URL to OAuth 2.0 metadata (RFC 8414) * @see SecurityScheme for the base interface * @see OAuthFlows for flow configuration * @see OpenAPI Security Scheme * @see A2A Protocol Specification */ -public final class OAuth2SecurityScheme implements SecurityScheme { +public record OAuth2SecurityScheme( + OAuthFlows flows, + String description, + String oauth2MetadataUrl +) implements SecurityScheme { /** * The type identifier for OAuth 2.0 security schemes: "oauth2". */ public static final String OAUTH2 = "oauth2"; - private final OAuthFlows flows; - private final String description; - private final String type; - private final String oauth2MetadataUrl; /** - * Constructs an OAuth 2.0 security scheme. + * Compact constructor with validation. * - * @param flows the OAuth 2.0 flow configuration (required) - * @param description optional description of the security scheme - * @param oauth2MetadataUrl optional URL to OAuth 2.0 metadata (RFC 8414) + * @throws IllegalArgumentException if flows is null */ - public OAuth2SecurityScheme(OAuthFlows flows, String description, String oauth2MetadataUrl) { - this(flows, description, oauth2MetadataUrl, OAUTH2); - } - - /** - * Constructs an OAuth 2.0 security scheme with explicit type. - * - * @param flows the OAuth 2.0 flow configuration (required) - * @param description optional description of the security scheme - * @param oauth2MetadataUrl optional URL to OAuth 2.0 metadata (RFC 8414) - * @param type the security scheme type (must be "oauth2") - */ - public OAuth2SecurityScheme(OAuthFlows flows, String description, String oauth2MetadataUrl, String type) { + public OAuth2SecurityScheme { Assert.checkNotNullParam("flows", flows); - Assert.checkNotNullParam("type", type); - if (!type.equals(OAUTH2)) { - throw new IllegalArgumentException("Invalid type for OAuth2SecurityScheme"); - } - this.flows = flows; - this.description = description; - this.oauth2MetadataUrl = oauth2MetadataUrl; - this.type = type; - } - - /** - * Gets the Description. - * - * @return the Description - */ - @Override - public String getDescription() { - return description; - } - - /** - * Returns the OAuth flows configuration. - * - * @return the OAuth flows - */ - public OAuthFlows getFlows() { - return flows; - } - - /** - * Gets the Type. - * - * @return the Type - */ - public String getType() { - return type; - } - - /** - * Gets the Oauth2MetadataUrl. - * - * @return the Oauth2MetadataUrl - */ - public String getOauth2MetadataUrl() { - return oauth2MetadataUrl; } /** @@ -107,7 +51,16 @@ public static Builder builder() { } /** - * Builder for constructing instances. + * Builder for constructing immutable {@link OAuth2SecurityScheme} instances. + *

+ * Example usage: + *

{@code
+     * OAuth2SecurityScheme scheme = OAuth2SecurityScheme.builder()
+     *     .flows(flows)
+     *     .description("OAuth 2.0 authentication")
+     *     .oauth2MetadataUrl("https://example.com/.well-known/oauth-authorization-server")
+     *     .build();
+     * }
*/ public static class Builder { private OAuthFlows flows; @@ -121,9 +74,9 @@ private Builder() { } /** - * Sets the flows. + * Sets the OAuth flows configuration. * - * @param flows the flows + * @param flows the OAuth 2.0 flow configuration (required) * @return this builder for method chaining */ public Builder flows(OAuthFlows flows) { @@ -132,9 +85,9 @@ public Builder flows(OAuthFlows flows) { } /** - * Sets the description. + * Sets the human-readable description of the security scheme. * - * @param description the description + * @param description the description (optional) * @return this builder for method chaining */ public Builder description(String description) { @@ -143,9 +96,9 @@ public Builder description(String description) { } /** - * Sets the oauth2MetadataUrl. + * Sets the OAuth 2.0 metadata URL. * - * @param oauth2MetadataUrl the oauth2MetadataUrl + * @param oauth2MetadataUrl URL to OAuth 2.0 metadata document (RFC 8414) (optional) * @return this builder for method chaining */ public Builder oauth2MetadataUrl(String oauth2MetadataUrl) { @@ -154,9 +107,10 @@ public Builder oauth2MetadataUrl(String oauth2MetadataUrl) { } /** - * Builds the OAuth2SecurityScheme. + * Builds a new immutable {@link OAuth2SecurityScheme} from the current builder state. * * @return a new OAuth2SecurityScheme instance + * @throws IllegalArgumentException if flows is null */ public OAuth2SecurityScheme build() { return new OAuth2SecurityScheme(flows, description, oauth2MetadataUrl); diff --git a/spec/src/main/java/io/a2a/spec/OpenIdConnectSecurityScheme.java b/spec/src/main/java/io/a2a/spec/OpenIdConnectSecurityScheme.java index 1b971828b..0ba446cad 100644 --- a/spec/src/main/java/io/a2a/spec/OpenIdConnectSecurityScheme.java +++ b/spec/src/main/java/io/a2a/spec/OpenIdConnectSecurityScheme.java @@ -17,81 +17,36 @@ *

* Example usage: *

{@code
- * OpenIdConnectSecurityScheme scheme = new OpenIdConnectSecurityScheme.Builder()
+ * OpenIdConnectSecurityScheme scheme = OpenIdConnectSecurityScheme.builder()
  *     .openIdConnectUrl("https://example.com/.well-known/openid-configuration")
  *     .description("OpenID Connect authentication")
  *     .build();
  * }
* + * @param openIdConnectUrl URL to the OpenID Connect Discovery document (required) + * @param description optional description of the security scheme * @see SecurityScheme for the base interface * @see OpenAPI Security Scheme * @see OpenID Connect Discovery * @see A2A Protocol Specification */ -public final class OpenIdConnectSecurityScheme implements SecurityScheme { +public record OpenIdConnectSecurityScheme( + String openIdConnectUrl, + String description +) implements SecurityScheme { /** * The type identifier for OpenID Connect security schemes: "openIdConnect". */ public static final String OPENID_CONNECT = "openIdConnect"; - private final String openIdConnectUrl; - private final String description; - private final String type; /** - * Constructs an OpenID Connect security scheme. + * Compact constructor with validation. * - * @param openIdConnectUrl URL to the OpenID Connect Discovery document (required) - * @param description optional description of the security scheme + * @throws IllegalArgumentException if openIdConnectUrl is null */ - public OpenIdConnectSecurityScheme(String openIdConnectUrl, String description) { - this(openIdConnectUrl, description, OPENID_CONNECT); - } - - /** - * Constructs an OpenID Connect security scheme with explicit type. - * - * @param openIdConnectUrl URL to the OpenID Connect Discovery document (required) - * @param description optional description of the security scheme - * @param type the security scheme type (must be "openIdConnect") - */ - public OpenIdConnectSecurityScheme(String openIdConnectUrl, String description, String type) { - Assert.checkNotNullParam("type", type); + public OpenIdConnectSecurityScheme { Assert.checkNotNullParam("openIdConnectUrl", openIdConnectUrl); - if (!type.equals(OPENID_CONNECT)) { - throw new IllegalArgumentException("Invalid type for OpenIdConnectSecurityScheme"); - } - this.openIdConnectUrl = openIdConnectUrl; - this.description = description; - this.type = type; - } - - /** - * Gets the Description. - * - * @return the Description - */ - @Override - public String getDescription() { - return description; - } - - /** - * Gets the OpenIdConnectUrl. - * - * @return the OpenIdConnectUrl - */ - public String getOpenIdConnectUrl() { - return openIdConnectUrl; - } - - /** - * Gets the Type. - * - * @return the Type - */ - public String getType() { - return type; } /** @@ -104,7 +59,7 @@ public static Builder builder() { } /** - * Builder for constructing {@link OpenIdConnectSecurityScheme} instances. + * Builder for constructing immutable {@link OpenIdConnectSecurityScheme} instances. *

* Provides a fluent API for creating OpenID Connect security schemes. * The {@code openIdConnectUrl} parameter is required. @@ -123,7 +78,7 @@ private Builder() { * Sets the OpenID Connect Discovery URL. * * @param openIdConnectUrl URL to the OpenID Connect Discovery document (required) - * @return this builder instance + * @return this builder for method chaining */ public Builder openIdConnectUrl(String openIdConnectUrl) { this.openIdConnectUrl = openIdConnectUrl; @@ -131,10 +86,10 @@ public Builder openIdConnectUrl(String openIdConnectUrl) { } /** - * Sets an optional description of the security scheme. + * Sets the human-readable description of the security scheme. * - * @param description human-readable description - * @return this builder instance + * @param description the description (optional) + * @return this builder for method chaining */ public Builder description(String description) { this.description = description; @@ -142,14 +97,13 @@ public Builder description(String description) { } /** - * Builds the {@link OpenIdConnectSecurityScheme} instance. + * Builds a new immutable {@link OpenIdConnectSecurityScheme} from the current builder state. * - * @return a new immutable OpenIdConnectSecurityScheme + * @return a new OpenIdConnectSecurityScheme instance * @throws IllegalArgumentException if openIdConnectUrl is null */ public OpenIdConnectSecurityScheme build() { return new OpenIdConnectSecurityScheme(openIdConnectUrl, description); } } - } diff --git a/spec/src/main/java/io/a2a/spec/Part.java b/spec/src/main/java/io/a2a/spec/Part.java index d7f07a180..345db0602 100644 --- a/spec/src/main/java/io/a2a/spec/Part.java +++ b/spec/src/main/java/io/a2a/spec/Part.java @@ -1,7 +1,7 @@ package io.a2a.spec; /** - * Base class for content parts within {@link Message}s and {@link Artifact}s. + * Base interface for content parts within {@link Message}s and {@link Artifact}s. *

* Parts represent the fundamental content units in the A2A Protocol, allowing multi-modal * communication through different content types. A Part can be: @@ -21,11 +21,11 @@ * @see Artifact * @see A2A Protocol Specification */ -public abstract class Part { +public interface Part { /** * Enum defining the different types of content parts. */ - public enum Kind { + enum Kind { /** * Plain text content part. */ @@ -62,5 +62,5 @@ public String asString() { * * @return the Part.Kind indicating the content type */ - public abstract Kind getKind(); + Kind getKind(); } \ No newline at end of file diff --git a/spec/src/main/java/io/a2a/spec/SecurityScheme.java b/spec/src/main/java/io/a2a/spec/SecurityScheme.java index 57b409a4c..2121a636e 100644 --- a/spec/src/main/java/io/a2a/spec/SecurityScheme.java +++ b/spec/src/main/java/io/a2a/spec/SecurityScheme.java @@ -26,9 +26,9 @@ public sealed interface SecurityScheme permits APIKeySecurityScheme, HTTPAuthSec OpenIdConnectSecurityScheme, MutualTLSSecurityScheme { /** - * Gets the human-readable description of this security scheme. + * Returns the human-readable description of this security scheme. * * @return the description, or null if not provided */ - String getDescription(); + String description(); } diff --git a/spec/src/main/java/io/a2a/spec/StreamingEventKind.java b/spec/src/main/java/io/a2a/spec/StreamingEventKind.java index 561cba970..4b7751c71 100644 --- a/spec/src/main/java/io/a2a/spec/StreamingEventKind.java +++ b/spec/src/main/java/io/a2a/spec/StreamingEventKind.java @@ -1,10 +1,5 @@ package io.a2a.spec; -import static io.a2a.spec.Message.MESSAGE; -import static io.a2a.spec.Task.TASK; -import static io.a2a.spec.TaskArtifactUpdateEvent.ARTIFACT_UPDATE; -import static io.a2a.spec.TaskStatusUpdateEvent.STATUS_UPDATE; - /** * Sealed interface for events that can be emitted during streaming A2A Protocol operations. *

@@ -41,5 +36,5 @@ public sealed interface StreamingEventKind extends Event permits Task, Message, * * @return the event kind string (e.g., "task", "message", "status-update", "artifact-update") */ - String getKind(); + String kind(); } diff --git a/spec/src/main/java/io/a2a/spec/Task.java b/spec/src/main/java/io/a2a/spec/Task.java index 383a3a8a8..e949a2fe3 100644 --- a/spec/src/main/java/io/a2a/spec/Task.java +++ b/spec/src/main/java/io/a2a/spec/Task.java @@ -6,9 +6,7 @@ import io.a2a.util.Assert; import static io.a2a.spec.Task.TASK; - -import org.jspecify.annotations.NullMarked; -import org.jspecify.annotations.Nullable; +import static io.a2a.util.Utils.SPEC_VERSION_1_0; /** * Represents a single, stateful operation or conversation between a client and an agent in the A2A Protocol. @@ -28,160 +26,76 @@ *

  • Streaming: Client subscribes to Task updates and receives incremental artifacts as they are produced
  • * *

    - * Tasks are immutable once created and use the Builder pattern for construction. Updates to a Task's + * Tasks are immutable once created (including their history, artifacts and metadata attributes). + * They use the Builder pattern for construction. Updates to a Task's * state are communicated via new Task instances or TaskStatusUpdateEvent/TaskArtifactUpdateEvent objects. *

    * This class implements {@link EventKind} and {@link StreamingEventKind}, allowing Task instances to * be transmitted as events in both blocking and streaming scenarios. * + * @param id the unique identifier for this task + * @param contextId the context identifier associating this task with a conversation or session + * @param status the current status of the task + * @param artifacts the list of artifacts produced by the agent during task execution + * @param history the conversation history for this task + * @param metadata arbitrary metadata associated with the task * @see TaskStatus * @see TaskState * @see Artifact * @see Message * @see A2A Protocol Specification */ -@NullMarked -public final class Task implements EventKind, StreamingEventKind { +public record Task( + String id, + String contextId, + TaskStatus status, + List artifacts, + List history, + Map metadata +) implements EventKind, StreamingEventKind { - /** - * The kind identifier for Task events: "task". - */ public static final String TASK = "task"; - private final String id; - private final String contextId; - private final TaskStatus status; - private final List artifacts; - private final List history; - private final Map metadata; - private final String kind; /** - * Constructs a Task with default kind. + * Compact constructor with validation and defensive copying. * - * @param id the task identifier (required) - * @param contextId the context identifier (required) - * @param status the task status (required) - * @param artifacts the list of artifacts (optional) - * @param history the conversation history (optional) - * @param metadata additional metadata (optional) + * @throws IllegalArgumentException if id, contextId, or status is null */ - public Task(String id, String contextId, TaskStatus status, List artifacts, - List history, Map metadata) { - this(id, contextId, status, artifacts, history, metadata, TASK); - } - - /** - * Constructs a Task with all parameters. - * - * @param id the task identifier (required) - * @param contextId the context identifier (required) - * @param status the task status (required) - * @param artifacts the list of artifacts (optional) - * @param history the conversation history (optional) - * @param metadata additional metadata (optional) - * @param kind the event kind (must be "task") - */ - public Task(String id, String contextId, TaskStatus status, - @Nullable List artifacts, @Nullable List history, - Map metadata, String kind) { + public Task { Assert.checkNotNullParam("id", id); Assert.checkNotNullParam("contextId", contextId); Assert.checkNotNullParam("status", status); - Assert.checkNotNullParam("kind", kind); - if (! TASK.equals(kind)) { - throw new IllegalArgumentException("Invalid Task"); - } - this.id = id; - this.contextId = contextId; - this.status = status; - this.artifacts = artifacts != null ? List.copyOf(artifacts) : List.of(); - this.history = history != null ? List.copyOf(history) : List.of(); - this.metadata = metadata; - this.kind = kind; - } - - /** - * Returns the unique identifier for this task. - * - * @return the task ID - */ - public String getId() { - return id; - } - - /** - * Returns the conversation context identifier. - * - * @return the context ID - */ - public String getContextId() { - return contextId; - } - - /** - * Returns the current status of this task. - * - * @return the task status - */ - public TaskStatus getStatus() { - return status; - } - - /** - * Returns the artifacts produced by the agent during task execution. - * - * @return an immutable list of artifacts - */ - public List getArtifacts() { - return artifacts; - } - - /** - * Returns the conversation history for this task. - * - * @return an immutable list of messages - */ - public List getHistory() { - return history; - } - - /** - * Returns the metadata associated with this task. - * - * @return a map of metadata key-value pairs, or null if not set - */ - public Map getMetadata() { - return metadata; + artifacts = artifacts != null ? List.copyOf(artifacts) : List.of(); + history = history != null ? List.copyOf(history) : List.of(); + metadata = (metadata != null) ? Map.copyOf(metadata) : null; } @Override - public String getKind() { - return kind; + public String kind() { + return TASK; } /** - * Create a new Builder + * Creates a new Builder for constructing Task instances. * - * @return the builder + * @return a new Task.Builder instance */ public static Builder builder() { return new Builder(); } /** - * Create a new Builder initialized with values from an existing Task. + * Creates a new Builder initialized with values from an existing Task. *

    - * This Builder allows for creating a modified copy of an existing Task + * This constructor allows for creating a modified copy of an existing Task * by copying all fields and then selectively updating specific values. * * @param task the Task to copy values from - * @return a new builder */ public static Builder builder(Task task) { return new Builder(task); } - /** * Builder for constructing immutable {@link Task} instances. *

    @@ -192,7 +106,7 @@ public static Builder builder(Task task) { *

    * Example usage: *

    {@code
    -     * Task task = new Task.Builder()
    +     * Task task = Task.builder()
          *     .id("task-123")
          *     .contextId("context-456")
          *     .status(new TaskStatus(TaskState.WORKING))
    @@ -202,7 +116,6 @@ public static Builder builder(Task task) {
          *     .build();
          * }
    */ - @SuppressWarnings("NullAway") public static class Builder { private String id; private String contextId; @@ -215,24 +128,20 @@ public static class Builder { * Creates a new Builder with all fields unset. */ private Builder() { - } /** * Creates a new Builder initialized with values from an existing Task. - *

    - * This constructor allows for creating a modified copy of an existing Task - * by copying all fields and then selectively updating specific values. * * @param task the Task to copy values from */ private Builder(Task task) { - id = task.id; - contextId = task.contextId; - status = task.status; - artifacts = task.artifacts; - history = task.history; - metadata = task.metadata; + id = task.id(); + contextId = task.contextId(); + status = task.status(); + artifacts = task.artifacts(); + history = task.history(); + metadata = task.metadata(); } diff --git a/spec/src/main/java/io/a2a/spec/TaskArtifactUpdateEvent.java b/spec/src/main/java/io/a2a/spec/TaskArtifactUpdateEvent.java index 11f9604ad..5f492be3d 100644 --- a/spec/src/main/java/io/a2a/spec/TaskArtifactUpdateEvent.java +++ b/spec/src/main/java/io/a2a/spec/TaskArtifactUpdateEvent.java @@ -29,124 +29,45 @@ * The {@code lastChunk} flag indicates whether this is the final update for an artifact, * allowing clients to distinguish between intermediate and final states. * + * @param taskId the task identifier (required) + * @param artifact the artifact being updated (required) + * @param contextId the context identifier (required) + * @param append whether to append to existing artifact (optional) + * @param lastChunk whether this is the final chunk (optional) + * @param metadata additional metadata (optional) * @see UpdateEvent * @see StreamingEventKind * @see Artifact * @see Task */ -public final class TaskArtifactUpdateEvent implements EventKind, StreamingEventKind, UpdateEvent { +public record TaskArtifactUpdateEvent( + String taskId, + Artifact artifact, + String contextId, + Boolean append, + Boolean lastChunk, + Map metadata +) implements EventKind, StreamingEventKind, UpdateEvent { /** * The kind identifier for artifact update events: "artifact-update". */ public static final String ARTIFACT_UPDATE = "artifact-update"; - private final String taskId; - private final Boolean append; - private final Boolean lastChunk; - private final Artifact artifact; - private final String contextId; - private final Map metadata; - private final String kind; /** - * Constructs a TaskArtifactUpdateEvent with default kind. + * Compact constructor with validation. * - * @param taskId the task identifier (required) - * @param artifact the artifact being updated (required) - * @param contextId the context identifier (required) - * @param append whether to append to existing artifact (optional) - * @param lastChunk whether this is the final chunk (optional) - * @param metadata additional metadata (optional) + * @throws IllegalArgumentException if taskId, artifact, or contextId is null */ - public TaskArtifactUpdateEvent(String taskId, Artifact artifact, String contextId, Boolean append, Boolean lastChunk, Map metadata) { - this(taskId, artifact, contextId, append, lastChunk, metadata, ARTIFACT_UPDATE); - } - - /** - * Constructs a TaskArtifactUpdateEvent with all parameters. - * - * @param taskId the task identifier (required) - * @param artifact the artifact being updated (required) - * @param contextId the context identifier (required) - * @param append whether to append to existing artifact (optional) - * @param lastChunk whether this is the final chunk (optional) - * @param metadata additional metadata (optional) - * @param kind the event kind (must be "artifact-update") - */ - public TaskArtifactUpdateEvent(String taskId, Artifact artifact, String contextId, Boolean append, Boolean lastChunk, Map metadata, String kind) { + public TaskArtifactUpdateEvent { Assert.checkNotNullParam("taskId", taskId); Assert.checkNotNullParam("artifact", artifact); Assert.checkNotNullParam("contextId", contextId); - Assert.checkNotNullParam("kind", kind); - if (! kind.equals(ARTIFACT_UPDATE)) { - throw new IllegalArgumentException("Invalid TaskArtifactUpdateEvent"); - } - this.taskId = taskId; - this.artifact = artifact; - this.contextId = contextId; - this.append = append; - this.lastChunk = lastChunk; - this.metadata = metadata; - this.kind = kind; - } - - /** - * Returns the task identifier. - * - * @return the task ID - */ - public String getTaskId() { - return taskId; - } - - /** - * Returns the artifact being updated. - * - * @return the artifact - */ - public Artifact getArtifact() { - return artifact; - } - - /** - * Returns the context identifier. - * - * @return the context ID - */ - public String getContextId() { - return contextId; - } - - /** - * Returns whether this update should append to an existing artifact. - * - * @return true if appending, false or null for new artifact - */ - public Boolean isAppend() { - return append; - } - - /** - * Returns whether this is the final chunk for the artifact. - * - * @return true if final chunk, false or null otherwise - */ - public Boolean isLastChunk() { - return lastChunk; - } - - /** - * Returns the metadata associated with this event. - * - * @return a map of metadata key-value pairs, or null if not set - */ - public Map getMetadata() { - return metadata; } @Override - public String getKind() { - return kind; + public String kind() { + return ARTIFACT_UPDATE; } /** diff --git a/spec/src/main/java/io/a2a/spec/TaskStatusUpdateEvent.java b/spec/src/main/java/io/a2a/spec/TaskStatusUpdateEvent.java index 43f5dbc23..d9d791f9d 100644 --- a/spec/src/main/java/io/a2a/spec/TaskStatusUpdateEvent.java +++ b/spec/src/main/java/io/a2a/spec/TaskStatusUpdateEvent.java @@ -10,110 +10,38 @@ /** * An event sent by the agent to notify the client of a change in a task's status. * This is typically used in streaming or subscription models. + * + * @param taskId the task identifier (required) + * @param status the task status (required) + * @param contextId the context identifier (required) + * @param isFinal whether this is a final status + * @param metadata additional metadata (optional) */ -public final class TaskStatusUpdateEvent implements EventKind, StreamingEventKind, UpdateEvent { +public record TaskStatusUpdateEvent( + String taskId, + TaskStatus status, + String contextId, + @SerializedName("final") boolean isFinal, + Map metadata +) implements EventKind, StreamingEventKind, UpdateEvent { /** * The kind identifier for status update events: "status-update". */ public static final String STATUS_UPDATE = "status-update"; - private final String taskId; - private final TaskStatus status; - private final String contextId; - @SerializedName("final") - private final boolean isFinal; - private final Map metadata; - private final String kind; - /** - * Constructs a TaskStatusUpdateEvent with default kind. - * - * @param taskId the task identifier (required) - * @param status the task status (required) - * @param contextId the context identifier (required) - * @param isFinal whether this is a final status - * @param metadata additional metadata (optional) + * Compact constructor with validation. */ - public TaskStatusUpdateEvent(String taskId, TaskStatus status, String contextId, boolean isFinal, - Map metadata) { - this(taskId, status, contextId, isFinal, metadata, STATUS_UPDATE); - } - - /** - * Constructs a TaskStatusUpdateEvent with all parameters. - * - * @param taskId the task identifier (required) - * @param status the task status (required) - * @param contextId the context identifier (required) - * @param isFinal whether this is a final status - * @param metadata additional metadata (optional) - * @param kind the event kind (must be "status-update") - */ - public TaskStatusUpdateEvent(String taskId, TaskStatus status, String contextId, boolean isFinal, Map metadata, String kind) { + public TaskStatusUpdateEvent { Assert.checkNotNullParam("taskId", taskId); Assert.checkNotNullParam("status", status); Assert.checkNotNullParam("contextId", contextId); - Assert.checkNotNullParam("kind", kind); - if (! kind.equals(STATUS_UPDATE)) { - throw new IllegalArgumentException("Invalid TaskStatusUpdateEvent"); - } - this.taskId = taskId; - this.status = status; - this.contextId = contextId; - this.isFinal = isFinal; - this.metadata = metadata; - this.kind = kind; - } - - /** - * Returns the task identifier. - * - * @return the task ID - */ - public String getTaskId() { - return taskId; - } - - /** - * Returns the task status. - * - * @return the task status - */ - public TaskStatus getStatus() { - return status; - } - - /** - * Returns the context identifier. - * - * @return the context ID - */ - public String getContextId() { - return contextId; - } - - /** - * Returns whether this is a final status. - * - * @return true if this is a final status - */ - public boolean isFinal() { - return isFinal; - } - - /** - * Returns the metadata. - * - * @return the metadata map - */ - public Map getMetadata() { - return metadata; } @Override - public String getKind() { - return kind; + public String kind() { + return STATUS_UPDATE; } /** diff --git a/spec/src/main/java/io/a2a/spec/TextPart.java b/spec/src/main/java/io/a2a/spec/TextPart.java index b6356dd57..4010d0063 100644 --- a/spec/src/main/java/io/a2a/spec/TextPart.java +++ b/spec/src/main/java/io/a2a/spec/TextPart.java @@ -3,6 +3,8 @@ import io.a2a.util.Assert; +import static io.a2a.util.Utils.SPEC_VERSION_1_0; + /** * Represents a plain text content part within a {@link Message} or {@link Artifact}. @@ -19,41 +21,29 @@ * TextPart withMetadata = new TextPart("Bonjour!", Map.of("language", "fr")); * } * + * @param text the text content (required, must not be null) * @see Part * @see Message * @see Artifact */ -public class TextPart extends Part { +public record TextPart(String text) implements Part { /** * The kind identifier for text parts: "text". */ public static final String TEXT = "text"; - private final String text; - private final Kind kind; /** - * Constructs a TextPart with the specified text content. + * Compact constructor with validation. * - * @param text the text content (required, must not be null) + * @throws IllegalArgumentException if text is null */ - public TextPart(String text) { + public TextPart { Assert.checkNotNullParam("text", text); - this.text = text; - this.kind = Kind.TEXT; } @Override public Kind getKind() { - return kind; - } - - /** - * Returns the text content. - * - * @return the text content - */ - public String getText() { - return text; + return Kind.TEXT; } -} \ No newline at end of file +} diff --git a/spec/src/main/java/io/a2a/util/Utils.java b/spec/src/main/java/io/a2a/util/Utils.java index 01d796d16..24b2e650d 100644 --- a/spec/src/main/java/io/a2a/util/Utils.java +++ b/spec/src/main/java/io/a2a/util/Utils.java @@ -40,6 +40,11 @@ public class Utils { private static final Logger log = Logger.getLogger(Utils.class.getName()); + /** + * Specification version constant for deprecation annotations. + */ + public static final String SPEC_VERSION_1_0 = "1.0"; + /** * Deserializes JSON string into a typed object using Gson. *

    @@ -113,11 +118,11 @@ public static void rethrow(Throwable t) throws T { */ public static Task appendArtifactToTask(Task task, TaskArtifactUpdateEvent event, String taskId) { // Append artifacts - List artifacts = task.getArtifacts() == null ? new ArrayList<>() : new ArrayList<>(task.getArtifacts()); + List artifacts = task.artifacts() == null ? new ArrayList<>() : new ArrayList<>(task.artifacts()); - Artifact newArtifact = event.getArtifact(); + Artifact newArtifact = event.artifact(); String artifactId = newArtifact.artifactId(); - boolean appendParts = event.isAppend() != null && event.isAppend(); + boolean appendParts = event.append() != null && event.append(); Artifact existingArtifact = null; int existingArtifactIndex = -1; diff --git a/spec/src/test/java/io/a2a/spec/TaskSerializationTest.java b/spec/src/test/java/io/a2a/spec/TaskSerializationTest.java index ff33b11d2..c74dd3999 100644 --- a/spec/src/test/java/io/a2a/spec/TaskSerializationTest.java +++ b/spec/src/test/java/io/a2a/spec/TaskSerializationTest.java @@ -39,8 +39,8 @@ void testBasicTaskSerialization() throws JsonProcessingException { Task deserialized = JsonUtil.fromJson(json, Task.class); // Verify deserialized task matches original - assertEquals(task.getId(), deserialized.getId()); - assertEquals(task.getStatus().state(), deserialized.getStatus().state()); + assertEquals(task.id(), deserialized.id()); + assertEquals(task.status().state(), deserialized.status().state()); } @Test @@ -60,8 +60,8 @@ void testTaskWithTimestamp() throws JsonProcessingException { Task deserialized = JsonUtil.fromJson(json, Task.class); // Verify OffsetDateTime timestamp is preserved - assertNotNull(deserialized.getStatus().timestamp()); - assertEquals(task.getStatus().timestamp(), deserialized.getStatus().timestamp()); + assertNotNull(deserialized.status().timestamp()); + assertEquals(task.status().timestamp(), deserialized.status().timestamp()); } @Test @@ -95,10 +95,10 @@ void testTaskWithArtifacts() throws JsonProcessingException { Task deserialized = JsonUtil.fromJson(json, Task.class); // Verify artifacts are preserved - assertNotNull(deserialized.getArtifacts()); - assertEquals(1, deserialized.getArtifacts().size()); - assertEquals("artifact-1", deserialized.getArtifacts().get(0).artifactId()); - assertEquals(2, deserialized.getArtifacts().get(0).parts().size()); + assertNotNull(deserialized.artifacts()); + assertEquals(1, deserialized.artifacts().size()); + assertEquals("artifact-1", deserialized.artifacts().get(0).artifactId()); + assertEquals(2, deserialized.artifacts().get(0).parts().size()); } @Test @@ -126,10 +126,10 @@ void testTaskWithHistory() throws JsonProcessingException { Task deserialized = JsonUtil.fromJson(json, Task.class); // Verify history is preserved - assertNotNull(deserialized.getHistory()); - assertEquals(1, deserialized.getHistory().size()); - assertEquals(Message.Role.USER, deserialized.getHistory().get(0).getRole()); - assertEquals(1, deserialized.getHistory().get(0).getParts().size()); + assertNotNull(deserialized.history()); + assertEquals(1, deserialized.history().size()); + assertEquals(Message.Role.USER, deserialized.history().get(0).role()); + assertEquals(1, deserialized.history().get(0).parts().size()); } @Test @@ -166,14 +166,14 @@ void testTaskWithAllFields() throws JsonProcessingException { Task deserialized = JsonUtil.fromJson(json, Task.class); // Verify all fields are preserved - assertEquals(task.getId(), deserialized.getId()); - assertEquals(task.getContextId(), deserialized.getContextId()); - assertEquals(task.getStatus().state(), deserialized.getStatus().state()); - assertEquals(task.getStatus().timestamp(), deserialized.getStatus().timestamp()); - assertEquals(task.getHistory().size(), deserialized.getHistory().size()); - assertEquals(task.getArtifacts().size(), deserialized.getArtifacts().size()); - assertNotNull(deserialized.getMetadata()); - assertEquals("value1", deserialized.getMetadata().get("key1")); + assertEquals(task.id(), deserialized.id()); + assertEquals(task.contextId(), deserialized.contextId()); + assertEquals(task.status().state(), deserialized.status().state()); + assertEquals(task.status().timestamp(), deserialized.status().timestamp()); + assertEquals(task.history().size(), deserialized.history().size()); + assertEquals(task.artifacts().size(), deserialized.artifacts().size()); + assertNotNull(deserialized.metadata()); + assertEquals("value1", deserialized.metadata().get("key1")); } @Test @@ -195,7 +195,7 @@ void testTaskWithDifferentStates() throws JsonProcessingException { Task deserialized = JsonUtil.fromJson(json, Task.class); // Verify state is preserved - assertEquals(state, deserialized.getStatus().state()); + assertEquals(state, deserialized.status().state()); } } @@ -215,15 +215,15 @@ void testTaskWithNullOptionalFields() throws JsonProcessingException { Task deserialized = JsonUtil.fromJson(json, Task.class); // Verify required fields are present - assertEquals("task-123", deserialized.getId()); - assertEquals("context-456", deserialized.getContextId()); - assertEquals(TaskState.SUBMITTED, deserialized.getStatus().state()); + assertEquals("task-123", deserialized.id()); + assertEquals("context-456", deserialized.contextId()); + assertEquals(TaskState.SUBMITTED, deserialized.status().state()); // Verify optional lists default to empty - assertNotNull(deserialized.getArtifacts()); - assertEquals(0, deserialized.getArtifacts().size()); - assertNotNull(deserialized.getHistory()); - assertEquals(0, deserialized.getHistory().size()); + assertNotNull(deserialized.artifacts()); + assertEquals(0, deserialized.artifacts().size()); + assertNotNull(deserialized.history()); + assertEquals(0, deserialized.history().size()); } @Test @@ -254,11 +254,11 @@ void testTaskWithFilePartBytes() throws JsonProcessingException { Task deserialized = JsonUtil.fromJson(json, Task.class); // Verify file part is preserved - Part part = deserialized.getArtifacts().get(0).parts().get(0); + Part part = deserialized.artifacts().get(0).parts().get(0); assertTrue(part instanceof FilePart); FilePart deserializedFilePart = (FilePart) part; - assertTrue(deserializedFilePart.getFile() instanceof FileWithBytes); - FileWithBytes fileWithBytes = (FileWithBytes) deserializedFilePart.getFile(); + assertTrue(deserializedFilePart.file() instanceof FileWithBytes); + FileWithBytes fileWithBytes = (FileWithBytes) deserializedFilePart.file(); assertEquals("document.pdf", fileWithBytes.name()); assertEquals("application/pdf", fileWithBytes.mimeType()); } @@ -289,11 +289,11 @@ void testTaskWithFilePartUri() throws JsonProcessingException { Task deserialized = JsonUtil.fromJson(json, Task.class); // Verify file part URI is preserved - Part part = deserialized.getArtifacts().get(0).parts().get(0); + Part part = deserialized.artifacts().get(0).parts().get(0); assertTrue(part instanceof FilePart); FilePart deserializedFilePart = (FilePart) part; - assertTrue(deserializedFilePart.getFile() instanceof FileWithUri); - FileWithUri fileWithUri = (FileWithUri) deserializedFilePart.getFile(); + assertTrue(deserializedFilePart.file() instanceof FileWithUri); + FileWithUri fileWithUri = (FileWithUri) deserializedFilePart.file(); assertEquals("https://example.com/photo.png", fileWithUri.uri()); } @@ -324,10 +324,10 @@ void testTaskWithDataPart() throws JsonProcessingException { Task deserialized = JsonUtil.fromJson(json, Task.class); // Verify data part is preserved - Part part = deserialized.getArtifacts().get(0).parts().get(0); + Part part = deserialized.artifacts().get(0).parts().get(0); assertTrue(part instanceof DataPart); DataPart deserializedDataPart = (DataPart) part; - assertNotNull(deserializedDataPart.getData()); + assertNotNull(deserializedDataPart.data()); } @Test @@ -371,11 +371,11 @@ void testTaskRoundTrip() throws JsonProcessingException { Task deserialized2 = JsonUtil.fromJson(json2, Task.class); // Verify multiple round-trips produce identical results - assertEquals(deserialized.getId(), deserialized2.getId()); - assertEquals(deserialized.getContextId(), deserialized2.getContextId()); - assertEquals(deserialized.getStatus().state(), deserialized2.getStatus().state()); - assertEquals(deserialized.getHistory().size(), deserialized2.getHistory().size()); - assertEquals(deserialized.getArtifacts().size(), deserialized2.getArtifacts().size()); + assertEquals(deserialized.id(), deserialized2.id()); + assertEquals(deserialized.contextId(), deserialized2.contextId()); + assertEquals(deserialized.status().state(), deserialized2.status().state()); + assertEquals(deserialized.history().size(), deserialized2.history().size()); + assertEquals(deserialized.artifacts().size(), deserialized2.artifacts().size()); } @Test @@ -402,10 +402,10 @@ void testTaskStatusWithMessage() throws JsonProcessingException { Task deserialized = JsonUtil.fromJson(json, Task.class); // Verify status message is preserved - assertEquals(TaskState.COMPLETED, deserialized.getStatus().state()); - assertNotNull(deserialized.getStatus().message()); - assertEquals(Message.Role.AGENT, deserialized.getStatus().message().getRole()); - assertTrue(deserialized.getStatus().message().getParts().get(0) instanceof TextPart); + assertEquals(TaskState.COMPLETED, deserialized.status().state()); + assertNotNull(deserialized.status().message()); + assertEquals(Message.Role.AGENT, deserialized.status().message().role()); + assertTrue(deserialized.status().message().parts().get(0) instanceof TextPart); } @Test @@ -423,12 +423,12 @@ void testDeserializeTaskFromJson() throws JsonProcessingException { Task task = JsonUtil.fromJson(json, Task.class); - assertEquals("task-123", task.getId()); - assertEquals("context-456", task.getContextId()); - assertEquals(TaskState.SUBMITTED, task.getStatus().state()); - assertNull(task.getStatus().message()); + assertEquals("task-123", task.id()); + assertEquals("context-456", task.contextId()); + assertEquals(TaskState.SUBMITTED, task.status().state()); + assertNull(task.status().message()); // TaskStatus automatically sets timestamp to current time if not provided - assertNotNull(task.getStatus().timestamp()); + assertNotNull(task.status().timestamp()); } @Test @@ -458,14 +458,14 @@ void testDeserializeTaskWithArtifactsFromJson() throws JsonProcessingException { Task task = JsonUtil.fromJson(json, Task.class); - assertEquals("task-123", task.getId()); - assertEquals(TaskState.COMPLETED, task.getStatus().state()); - assertEquals(1, task.getArtifacts().size()); - assertEquals("artifact-1", task.getArtifacts().get(0).artifactId()); - assertEquals("Result", task.getArtifacts().get(0).name()); - assertEquals(1, task.getArtifacts().get(0).parts().size()); - assertTrue(task.getArtifacts().get(0).parts().get(0) instanceof TextPart); - assertEquals("Hello World", ((TextPart) task.getArtifacts().get(0).parts().get(0)).getText()); + assertEquals("task-123", task.id()); + assertEquals(TaskState.COMPLETED, task.status().state()); + assertEquals(1, task.artifacts().size()); + assertEquals("artifact-1", task.artifacts().get(0).artifactId()); + assertEquals("Result", task.artifacts().get(0).name()); + assertEquals(1, task.artifacts().get(0).parts().size()); + assertTrue(task.artifacts().get(0).parts().get(0) instanceof TextPart); + assertEquals("Hello World", ((TextPart) task.artifacts().get(0).parts().get(0)).text()); } @Test @@ -498,13 +498,13 @@ void testDeserializeTaskWithFilePartBytesFromJson() throws JsonProcessingExcepti Task task = JsonUtil.fromJson(json, Task.class); - assertEquals("task-123", task.getId()); - assertEquals(1, task.getArtifacts().size()); - Part part = task.getArtifacts().get(0).parts().get(0); + assertEquals("task-123", task.id()); + assertEquals(1, task.artifacts().size()); + Part part = task.artifacts().get(0).parts().get(0); assertTrue(part instanceof FilePart); FilePart filePart = (FilePart) part; - assertTrue(filePart.getFile() instanceof FileWithBytes); - FileWithBytes fileWithBytes = (FileWithBytes) filePart.getFile(); + assertTrue(filePart.file() instanceof FileWithBytes); + FileWithBytes fileWithBytes = (FileWithBytes) filePart.file(); assertEquals("application/pdf", fileWithBytes.mimeType()); assertEquals("document.pdf", fileWithBytes.name()); assertEquals("base64encodeddata", fileWithBytes.bytes()); @@ -540,12 +540,12 @@ void testDeserializeTaskWithFilePartUriFromJson() throws JsonProcessingException Task task = JsonUtil.fromJson(json, Task.class); - assertEquals("task-123", task.getId()); - Part part = task.getArtifacts().get(0).parts().get(0); + assertEquals("task-123", task.id()); + Part part = task.artifacts().get(0).parts().get(0); assertTrue(part instanceof FilePart); FilePart filePart = (FilePart) part; - assertTrue(filePart.getFile() instanceof FileWithUri); - FileWithUri fileWithUri = (FileWithUri) filePart.getFile(); + assertTrue(filePart.file() instanceof FileWithUri); + FileWithUri fileWithUri = (FileWithUri) filePart.file(); assertEquals("image/png", fileWithUri.mimeType()); assertEquals("photo.png", fileWithUri.name()); assertEquals("https://example.com/photo.png", fileWithUri.uri()); @@ -580,11 +580,11 @@ void testDeserializeTaskWithDataPartFromJson() throws JsonProcessingException { Task task = JsonUtil.fromJson(json, Task.class); - assertEquals("task-123", task.getId()); - Part part = task.getArtifacts().get(0).parts().get(0); + assertEquals("task-123", task.id()); + Part part = task.artifacts().get(0).parts().get(0); assertTrue(part instanceof DataPart); DataPart dataPart = (DataPart) part; - assertNotNull(dataPart.getData()); + assertNotNull(dataPart.data()); } @Test @@ -604,7 +604,8 @@ void testDeserializeTaskWithHistoryFromJson() throws JsonProcessingException { "kind": "text", "text": "User message" } - ] + ], + "messageId": "msg-1" }, { "role": "agent", @@ -613,7 +614,8 @@ void testDeserializeTaskWithHistoryFromJson() throws JsonProcessingException { "kind": "text", "text": "Agent response" } - ] + ], + "messageId": "msg-2" } ], "kind": "task" @@ -622,12 +624,12 @@ void testDeserializeTaskWithHistoryFromJson() throws JsonProcessingException { Task task = JsonUtil.fromJson(json, Task.class); - assertEquals("task-123", task.getId()); - assertEquals(2, task.getHistory().size()); - assertEquals(Message.Role.USER, task.getHistory().get(0).getRole()); - assertEquals(Message.Role.AGENT, task.getHistory().get(1).getRole()); - assertTrue(task.getHistory().get(0).getParts().get(0) instanceof TextPart); - assertEquals("User message", ((TextPart) task.getHistory().get(0).getParts().get(0)).getText()); + assertEquals("task-123", task.id()); + assertEquals(2, task.history().size()); + assertEquals(Message.Role.USER, task.history().get(0).role()); + assertEquals(Message.Role.AGENT, task.history().get(1).role()); + assertTrue(task.history().get(0).parts().get(0) instanceof TextPart); + assertEquals("User message", ((TextPart) task.history().get(0).parts().get(0)).text()); } @Test @@ -646,10 +648,10 @@ void testDeserializeTaskWithTimestampFromJson() throws JsonProcessingException { Task task = JsonUtil.fromJson(json, Task.class); - assertEquals("task-123", task.getId()); - assertEquals(TaskState.WORKING, task.getStatus().state()); - assertNotNull(task.getStatus().timestamp()); - assertEquals("2023-10-01T12:00:00.234-05:00", task.getStatus().timestamp().toString()); + assertEquals("task-123", task.id()); + assertEquals(TaskState.WORKING, task.status().state()); + assertNotNull(task.status().timestamp()); + assertEquals("2023-10-01T12:00:00.234-05:00", task.status().timestamp().toString()); } @Test @@ -671,9 +673,9 @@ void testDeserializeTaskWithMetadataFromJson() throws JsonProcessingException { Task task = JsonUtil.fromJson(json, Task.class); - assertEquals("task-123", task.getId()); - assertNotNull(task.getMetadata()); - assertEquals("value1", task.getMetadata().get("key1")); + assertEquals("task-123", task.id()); + assertNotNull(task.metadata()); + assertEquals("value1", task.metadata().get("key1")); } @Test @@ -702,7 +704,7 @@ void testTaskWithMixedPartTypes() throws JsonProcessingException { Task deserialized = JsonUtil.fromJson(json, Task.class); // Verify all part types are preserved - List> parts = deserialized.getArtifacts().get(0).parts(); + List> parts = deserialized.artifacts().get(0).parts(); assertEquals(4, parts.size()); assertTrue(parts.get(0) instanceof TextPart); assertTrue(parts.get(1) instanceof FilePart); diff --git a/tck/src/main/java/io/a2a/tck/server/AgentExecutorProducer.java b/tck/src/main/java/io/a2a/tck/server/AgentExecutorProducer.java index adf0b5394..0adedad9a 100644 --- a/tck/src/main/java/io/a2a/tck/server/AgentExecutorProducer.java +++ b/tck/src/main/java/io/a2a/tck/server/AgentExecutorProducer.java @@ -50,7 +50,7 @@ public void execute(RequestContext context, EventQueue eventQueue) throws JSONRP } // Sleep to allow task state persistence before TCK resubscribe test - if (context.getMessage() != null && context.getMessage().getMessageId().startsWith("test-resubscribe-message-id")) { + if (context.getMessage() != null && context.getMessage().messageId().startsWith("test-resubscribe-message-id")) { int timeoutMs = Integer.parseInt(System.getenv().getOrDefault("RESUBSCRIBE_TIMEOUT_MS", "3000")); System.out.println("====> task id starts with test-resubscribe-message-id, sleeping for " + timeoutMs + " ms"); try { @@ -77,12 +77,12 @@ public void cancel(RequestContext context, EventQueue eventQueue) throws JSONRPC System.out.println("====> No task found"); throw new TaskNotCancelableError(); } - if (task.getStatus().state() == TaskState.CANCELED) { + if (task.status().state() == TaskState.CANCELED) { System.out.println("====> task already canceled"); throw new TaskNotCancelableError(); } - if (task.getStatus().state() == TaskState.COMPLETED) { + if (task.status().state() == TaskState.COMPLETED) { System.out.println("====> task already completed"); throw new TaskNotCancelableError(); } @@ -90,8 +90,8 @@ public void cancel(RequestContext context, EventQueue eventQueue) throws JSONRPC TaskUpdater updater = new TaskUpdater(context, eventQueue); updater.cancel(); eventQueue.enqueueEvent(TaskStatusUpdateEvent.builder() - .taskId(task.getId()) - .contextId(task.getContextId()) + .taskId(task.id()) + .contextId(task.contextId()) .status(new TaskStatus(TaskState.CANCELED)) .isFinal(true) .build()); diff --git a/tests/server-common/src/test/java/io/a2a/server/apps/common/AbstractA2AServerTest.java b/tests/server-common/src/test/java/io/a2a/server/apps/common/AbstractA2AServerTest.java index 166e60ef2..89c6de9b8 100644 --- a/tests/server-common/src/test/java/io/a2a/server/apps/common/AbstractA2AServerTest.java +++ b/tests/server-common/src/test/java/io/a2a/server/apps/common/AbstractA2AServerTest.java @@ -156,13 +156,13 @@ protected AbstractA2AServerTest(int serverPort) { public void testTaskStoreMethodsSanityTest() throws Exception { Task task = Task.builder(MINIMAL_TASK).id("abcde").build(); saveTaskInTaskStore(task); - Task saved = getTaskFromTaskStore(task.getId()); - assertEquals(task.getId(), saved.getId()); - assertEquals(task.getContextId(), saved.getContextId()); - assertEquals(task.getStatus().state(), saved.getStatus().state()); + Task saved = getTaskFromTaskStore(task.id()); + assertEquals(task.id(), saved.id()); + assertEquals(task.contextId(), saved.contextId()); + assertEquals(task.status().state(), saved.status().state()); - deleteTaskInTaskStore(task.getId()); - Task saved2 = getTaskFromTaskStore(task.getId()); + deleteTaskInTaskStore(task.id()); + Task saved2 = getTaskFromTaskStore(task.id()); assertNull(saved2); } @@ -178,14 +178,14 @@ private void testGetTask() throws Exception { private void testGetTask(String mediaType) throws Exception { saveTaskInTaskStore(MINIMAL_TASK); try { - Task response = getClient().getTask(new TaskQueryParams(MINIMAL_TASK.getId())); - assertEquals("task-123", response.getId()); - assertEquals("session-xyz", response.getContextId()); - assertEquals(TaskState.SUBMITTED, response.getStatus().state()); + Task response = getClient().getTask(new TaskQueryParams(MINIMAL_TASK.id())); + assertEquals("task-123", response.id()); + assertEquals("session-xyz", response.contextId()); + assertEquals(TaskState.SUBMITTED, response.status().state()); } catch (A2AClientException e) { fail("Unexpected exception during getTask: " + e.getMessage(), e); } finally { - deleteTaskInTaskStore(MINIMAL_TASK.getId()); + deleteTaskInTaskStore(MINIMAL_TASK.id()); } } @@ -205,14 +205,14 @@ public void testGetTaskNotFound() throws Exception { public void testCancelTaskSuccess() throws Exception { saveTaskInTaskStore(CANCEL_TASK); try { - Task task = getClient().cancelTask(new TaskIdParams(CANCEL_TASK.getId())); - assertEquals(CANCEL_TASK.getId(), task.getId()); - assertEquals(CANCEL_TASK.getContextId(), task.getContextId()); - assertEquals(TaskState.CANCELED, task.getStatus().state()); + Task task = getClient().cancelTask(new TaskIdParams(CANCEL_TASK.id())); + assertEquals(CANCEL_TASK.id(), task.id()); + assertEquals(CANCEL_TASK.contextId(), task.contextId()); + assertEquals(TaskState.CANCELED, task.status().state()); } catch (A2AClientException e) { fail("Unexpected exception during cancel task: " + e.getMessage(), e); } finally { - deleteTaskInTaskStore(CANCEL_TASK.getId()); + deleteTaskInTaskStore(CANCEL_TASK.id()); } } @@ -220,13 +220,13 @@ public void testCancelTaskSuccess() throws Exception { public void testCancelTaskNotSupported() throws Exception { saveTaskInTaskStore(CANCEL_TASK_NOT_SUPPORTED); try { - getClient().cancelTask(new TaskIdParams(CANCEL_TASK_NOT_SUPPORTED.getId())); + getClient().cancelTask(new TaskIdParams(CANCEL_TASK_NOT_SUPPORTED.id())); fail("Expected A2AClientException for unsupported cancel operation"); } catch (A2AClientException e) { // Expected - the client should throw an exception for unsupported operations assertInstanceOf(UnsupportedOperationError.class, e.getCause()); } finally { - deleteTaskInTaskStore(CANCEL_TASK_NOT_SUPPORTED.getId()); + deleteTaskInTaskStore(CANCEL_TASK_NOT_SUPPORTED.id()); } } @@ -275,9 +275,9 @@ public void testListTasksSuccess() throws Exception { assertEquals(result.tasks().size(), result.pageSize()); assertTrue(result.totalSize() >= 3, "Total size should be at least 3"); } finally { - deleteTaskInTaskStore(task1.getId()); - deleteTaskInTaskStore(task2.getId()); - deleteTaskInTaskStore(task3.getId()); + deleteTaskInTaskStore(task1.id()); + deleteTaskInTaskStore(task2.id()); + deleteTaskInTaskStore(task3.id()); } } @@ -314,11 +314,11 @@ public void testListTasksFilterByContextId() throws Exception { assertNotNull(result); assertNotNull(result.tasks()); assertEquals(2, result.tasks().size(), "Should have exactly 2 tasks with context-filter-1"); - assertTrue(result.tasks().stream().allMatch(t -> "context-filter-1".equals(t.getContextId()))); + assertTrue(result.tasks().stream().allMatch(t -> "context-filter-1".equals(t.contextId()))); } finally { - deleteTaskInTaskStore(task1.getId()); - deleteTaskInTaskStore(task2.getId()); - deleteTaskInTaskStore(task3.getId()); + deleteTaskInTaskStore(task1.id()); + deleteTaskInTaskStore(task2.id()); + deleteTaskInTaskStore(task3.id()); } } @@ -356,12 +356,12 @@ public void testListTasksFilterByStatus() throws Exception { assertNotNull(result.tasks()); assertTrue(result.tasks().size() >= 2, "Should have at least 2 WORKING tasks"); assertTrue(result.tasks().stream() - .filter(t -> t.getId().startsWith("list-task-status-")) - .allMatch(t -> TaskState.WORKING.equals(t.getStatus().state()))); + .filter(t -> t.id().startsWith("list-task-status-")) + .allMatch(t -> TaskState.WORKING.equals(t.status().state()))); } finally { - deleteTaskInTaskStore(task1.getId()); - deleteTaskInTaskStore(task2.getId()); - deleteTaskInTaskStore(task3.getId()); + deleteTaskInTaskStore(task1.id()); + deleteTaskInTaskStore(task2.id()); + deleteTaskInTaskStore(task3.id()); } } @@ -414,9 +414,9 @@ public void testListTasksWithPagination() throws Exception { assertNotNull(result2); assertTrue(result2.tasks().size() >= 1, "Second page should have at least 1 task"); } finally { - deleteTaskInTaskStore(task1.getId()); - deleteTaskInTaskStore(task2.getId()); - deleteTaskInTaskStore(task3.getId()); + deleteTaskInTaskStore(task1.id()); + deleteTaskInTaskStore(task2.id()); + deleteTaskInTaskStore(task3.id()); } } @@ -450,22 +450,22 @@ public void testListTasksWithHistoryLimit() throws Exception { assertNotNull(result); assertEquals(1, result.tasks().size()); Task task = result.tasks().get(0); - assertNotNull(task.getHistory()); - assertEquals(2, task.getHistory().size(), "History should be limited to 2 most recent messages"); + assertNotNull(task.history()); + assertEquals(2, task.history().size(), "History should be limited to 2 most recent messages"); // Verify we get the most recent messages (msg-3 and msg-4) - assertEquals("msg-3", task.getHistory().get(0).getMessageId()); - assertEquals("msg-4", task.getHistory().get(1).getMessageId()); + assertEquals("msg-3", task.history().get(0).messageId()); + assertEquals("msg-4", task.history().get(1).messageId()); } finally { - deleteTaskInTaskStore(taskWithHistory.getId()); + deleteTaskInTaskStore(taskWithHistory.id()); } } @Test public void testSendMessageNewMessageSuccess() throws Exception { - assertTrue(getTaskFromTaskStore(MINIMAL_TASK.getId()) == null); + assertTrue(getTaskFromTaskStore(MINIMAL_TASK.id()) == null); Message message = Message.builder(MESSAGE) - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .build(); CountDownLatch latch = new CountDownLatch(1); @@ -491,11 +491,11 @@ public void testSendMessageNewMessageSuccess() throws Exception { assertFalse(wasUnexpectedEvent.get()); Message messageResponse = receivedMessage.get(); assertNotNull(messageResponse); - assertEquals(MESSAGE.getMessageId(), messageResponse.getMessageId()); - assertEquals(MESSAGE.getRole(), messageResponse.getRole()); - Part part = messageResponse.getParts().get(0); + assertEquals(MESSAGE.messageId(), messageResponse.messageId()); + assertEquals(MESSAGE.role(), messageResponse.role()); + Part part = messageResponse.parts().get(0); assertEquals(Part.Kind.TEXT, part.getKind()); - assertEquals("test message", ((TextPart) part).getText()); + assertEquals("test message", ((TextPart) part).text()); } @Test @@ -503,8 +503,8 @@ public void testSendMessageExistingTaskSuccess() throws Exception { saveTaskInTaskStore(MINIMAL_TASK); try { Message message = Message.builder(MESSAGE) - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .build(); CountDownLatch latch = new CountDownLatch(1); @@ -529,15 +529,15 @@ public void testSendMessageExistingTaskSuccess() throws Exception { assertTrue(latch.await(10, TimeUnit.SECONDS)); Message messageResponse = receivedMessage.get(); assertNotNull(messageResponse); - assertEquals(MESSAGE.getMessageId(), messageResponse.getMessageId()); - assertEquals(MESSAGE.getRole(), messageResponse.getRole()); - Part part = messageResponse.getParts().get(0); + assertEquals(MESSAGE.messageId(), messageResponse.messageId()); + assertEquals(MESSAGE.role(), messageResponse.role()); + Part part = messageResponse.parts().get(0); assertEquals(Part.Kind.TEXT, part.getKind()); - assertEquals("test message", ((TextPart) part).getText()); + assertEquals("test message", ((TextPart) part).text()); } catch (A2AClientException e) { fail("Unexpected exception during sendMessage: " + e.getMessage(), e); } finally { - deleteTaskInTaskStore(MINIMAL_TASK.getId()); + deleteTaskInTaskStore(MINIMAL_TASK.id()); } } @@ -547,16 +547,16 @@ public void testSetPushNotificationSuccess() throws Exception { try { TaskPushNotificationConfig taskPushConfig = new TaskPushNotificationConfig( - MINIMAL_TASK.getId(), PushNotificationConfig.builder().id("c295ea44-7543-4f78-b524-7a38915ad6e4").url("http://example.com").build(), "tenant"); + MINIMAL_TASK.id(), PushNotificationConfig.builder().id("c295ea44-7543-4f78-b524-7a38915ad6e4").url("http://example.com").build(), "tenant"); TaskPushNotificationConfig config = getClient().setTaskPushNotificationConfiguration(taskPushConfig); - assertEquals(MINIMAL_TASK.getId(), config.taskId()); + assertEquals(MINIMAL_TASK.id(), config.taskId()); assertEquals("http://example.com", config.pushNotificationConfig().url()); assertEquals("c295ea44-7543-4f78-b524-7a38915ad6e4", config.pushNotificationConfig().id()); } catch (A2AClientException e) { fail("Unexpected exception during set push notification test: " + e.getMessage(), e); } finally { - deletePushNotificationConfigInStore(MINIMAL_TASK.getId(), "c295ea44-7543-4f78-b524-7a38915ad6e4"); - deleteTaskInTaskStore(MINIMAL_TASK.getId()); + deletePushNotificationConfigInStore(MINIMAL_TASK.id(), "c295ea44-7543-4f78-b524-7a38915ad6e4"); + deleteTaskInTaskStore(MINIMAL_TASK.id()); } } @@ -566,28 +566,28 @@ public void testGetPushNotificationSuccess() throws Exception { try { TaskPushNotificationConfig taskPushConfig = new TaskPushNotificationConfig( - MINIMAL_TASK.getId(), PushNotificationConfig.builder().id("c295ea44-7543-4f78-b524-7a38915ad6e4").url("http://example.com").build(), "tenant"); + MINIMAL_TASK.id(), PushNotificationConfig.builder().id("c295ea44-7543-4f78-b524-7a38915ad6e4").url("http://example.com").build(), "tenant"); TaskPushNotificationConfig setResult = getClient().setTaskPushNotificationConfiguration(taskPushConfig); assertNotNull(setResult); TaskPushNotificationConfig config = getClient().getTaskPushNotificationConfiguration( - new GetTaskPushNotificationConfigParams(MINIMAL_TASK.getId())); - assertEquals(MINIMAL_TASK.getId(), config.taskId()); + new GetTaskPushNotificationConfigParams(MINIMAL_TASK.id())); + assertEquals(MINIMAL_TASK.id(), config.taskId()); assertEquals("http://example.com", config.pushNotificationConfig().url()); } catch (A2AClientException e) { fail("Unexpected exception during get push notification test: " + e.getMessage(), e); } finally { - deletePushNotificationConfigInStore(MINIMAL_TASK.getId(), "c295ea44-7543-4f78-b524-7a38915ad6e4"); - deleteTaskInTaskStore(MINIMAL_TASK.getId()); + deletePushNotificationConfigInStore(MINIMAL_TASK.id(), "c295ea44-7543-4f78-b524-7a38915ad6e4"); + deleteTaskInTaskStore(MINIMAL_TASK.id()); } } @Test public void testError() throws A2AClientException { Message message = Message.builder(MESSAGE) - .taskId(SEND_MESSAGE_NOT_SUPPORTED.getId()) - .contextId(SEND_MESSAGE_NOT_SUPPORTED.getContextId()) + .taskId(SEND_MESSAGE_NOT_SUPPORTED.id()) + .contextId(SEND_MESSAGE_NOT_SUPPORTED.contextId()) .build(); try { @@ -637,7 +637,7 @@ public void testResubscribeExistingTaskSuccess() throws Exception { // attempting to send a streaming message instead of explicitly calling queueManager#createOrTap // does not work because after the message is sent, the queue becomes null but task resubscription // requires the queue to still be active - ensureQueueForTask(MINIMAL_TASK.getId()); + ensureQueueForTask(MINIMAL_TASK.id()); CountDownLatch eventLatch = new CountDownLatch(2); AtomicReference artifactUpdateEvent = new AtomicReference<>(); @@ -676,7 +676,7 @@ public void testResubscribeExistingTaskSuccess() throws Exception { .whenComplete((unused, throwable) -> subscriptionLatch.countDown()); // Resubscribe to the task with specific consumer and error handler - getClient().resubscribe(new TaskIdParams(MINIMAL_TASK.getId()), List.of(consumer), errorHandler); + getClient().resubscribe(new TaskIdParams(MINIMAL_TASK.id()), List.of(consumer), errorHandler); // Wait for subscription to be established assertTrue(subscriptionLatch.await(15, TimeUnit.SECONDS)); @@ -684,16 +684,16 @@ public void testResubscribeExistingTaskSuccess() throws Exception { // Enqueue events on the server List events = List.of( TaskArtifactUpdateEvent.builder() - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .artifact(Artifact.builder() .artifactId("11") .parts(new TextPart("text")) .build()) .build(), TaskStatusUpdateEvent.builder() - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .status(new TaskStatus(TaskState.COMPLETED)) .isFinal(true) .build()); @@ -710,21 +710,21 @@ public void testResubscribeExistingTaskSuccess() throws Exception { // Verify artifact update event TaskArtifactUpdateEvent receivedArtifactEvent = artifactUpdateEvent.get(); assertNotNull(receivedArtifactEvent); - assertEquals(MINIMAL_TASK.getId(), receivedArtifactEvent.getTaskId()); - assertEquals(MINIMAL_TASK.getContextId(), receivedArtifactEvent.getContextId()); - Part part = receivedArtifactEvent.getArtifact().parts().get(0); + assertEquals(MINIMAL_TASK.id(), receivedArtifactEvent.taskId()); + assertEquals(MINIMAL_TASK.contextId(), receivedArtifactEvent.contextId()); + Part part = receivedArtifactEvent.artifact().parts().get(0); assertEquals(Part.Kind.TEXT, part.getKind()); - assertEquals("text", ((TextPart) part).getText()); + assertEquals("text", ((TextPart) part).text()); // Verify status update event TaskStatusUpdateEvent receivedStatusEvent = statusUpdateEvent.get(); assertNotNull(receivedStatusEvent); - assertEquals(MINIMAL_TASK.getId(), receivedStatusEvent.getTaskId()); - assertEquals(MINIMAL_TASK.getContextId(), receivedStatusEvent.getContextId()); - assertEquals(TaskState.COMPLETED, receivedStatusEvent.getStatus().state()); - assertNotNull(receivedStatusEvent.getStatus().timestamp()); + assertEquals(MINIMAL_TASK.id(), receivedStatusEvent.taskId()); + assertEquals(MINIMAL_TASK.contextId(), receivedStatusEvent.contextId()); + assertEquals(TaskState.COMPLETED, receivedStatusEvent.status().state()); + assertNotNull(receivedStatusEvent.status().timestamp()); } finally { - deleteTaskInTaskStore(MINIMAL_TASK.getId()); + deleteTaskInTaskStore(MINIMAL_TASK.id()); } } @@ -736,7 +736,7 @@ public void testResubscribeExistingTaskSuccessWithClientConsumers() throws Excep // attempting to send a streaming message instead of explicitly calling queueManager#createOrTap // does not work because after the message is sent, the queue becomes null but task resubscription // requires the queue to still be active - ensureQueueForTask(MINIMAL_TASK.getId()); + ensureQueueForTask(MINIMAL_TASK.id()); CountDownLatch eventLatch = new CountDownLatch(2); AtomicReference artifactUpdateEvent = new AtomicReference<>(); @@ -782,7 +782,7 @@ public void testResubscribeExistingTaskSuccessWithClientConsumers() throws Excep .whenComplete((unused, throwable) -> subscriptionLatch.countDown()); // Resubscribe to the task with the client consumer and error handler - clientWithConsumer.resubscribe(new TaskIdParams(MINIMAL_TASK.getId())); + clientWithConsumer.resubscribe(new TaskIdParams(MINIMAL_TASK.id())); // Wait for subscription to be established assertTrue(subscriptionLatch.await(15, TimeUnit.SECONDS)); @@ -790,16 +790,16 @@ public void testResubscribeExistingTaskSuccessWithClientConsumers() throws Excep // Enqueue events on the server List events = List.of( TaskArtifactUpdateEvent.builder() - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .artifact(Artifact.builder() .artifactId("11") .parts(new TextPart("text")) .build()) .build(), TaskStatusUpdateEvent.builder() - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .status(new TaskStatus(TaskState.COMPLETED)) .isFinal(true) .build()); @@ -816,21 +816,21 @@ public void testResubscribeExistingTaskSuccessWithClientConsumers() throws Excep // Verify artifact update event TaskArtifactUpdateEvent receivedArtifactEvent = artifactUpdateEvent.get(); assertNotNull(receivedArtifactEvent); - assertEquals(MINIMAL_TASK.getId(), receivedArtifactEvent.getTaskId()); - assertEquals(MINIMAL_TASK.getContextId(), receivedArtifactEvent.getContextId()); - Part part = receivedArtifactEvent.getArtifact().parts().get(0); + assertEquals(MINIMAL_TASK.id(), receivedArtifactEvent.taskId()); + assertEquals(MINIMAL_TASK.contextId(), receivedArtifactEvent.contextId()); + Part part = receivedArtifactEvent.artifact().parts().get(0); assertEquals(Part.Kind.TEXT, part.getKind()); - assertEquals("text", ((TextPart) part).getText()); + assertEquals("text", ((TextPart) part).text()); // Verify status update event TaskStatusUpdateEvent receivedStatusEvent = statusUpdateEvent.get(); assertNotNull(receivedStatusEvent); - assertEquals(MINIMAL_TASK.getId(), receivedStatusEvent.getTaskId()); - assertEquals(MINIMAL_TASK.getContextId(), receivedStatusEvent.getContextId()); - assertEquals(TaskState.COMPLETED, receivedStatusEvent.getStatus().state()); - assertNotNull(receivedStatusEvent.getStatus().timestamp()); + assertEquals(MINIMAL_TASK.id(), receivedStatusEvent.taskId()); + assertEquals(MINIMAL_TASK.contextId(), receivedStatusEvent.contextId()); + assertEquals(TaskState.COMPLETED, receivedStatusEvent.status().state()); + assertNotNull(receivedStatusEvent.status().timestamp()); } finally { - deleteTaskInTaskStore(MINIMAL_TASK.getId()); + deleteTaskInTaskStore(MINIMAL_TASK.id()); } } @@ -901,7 +901,7 @@ public void testMainQueueReferenceCountingWithMultipleConsumers() throws Excepti saveTaskInTaskStore(MINIMAL_TASK); try { // 1. Ensure queue exists for the task - ensureQueueForTask(MINIMAL_TASK.getId()); + ensureQueueForTask(MINIMAL_TASK.id()); // 2. First consumer subscribes and receives initial event CountDownLatch firstConsumerLatch = new CountDownLatch(1); @@ -930,7 +930,7 @@ public void testMainQueueReferenceCountingWithMultipleConsumers() throws Excepti awaitStreamingSubscription() .whenComplete((unused, throwable) -> firstSubscriptionLatch.countDown()); - getClient().resubscribe(new TaskIdParams(MINIMAL_TASK.getId()), + getClient().resubscribe(new TaskIdParams(MINIMAL_TASK.id()), List.of(firstConsumer), firstErrorHandler); @@ -938,8 +938,8 @@ public void testMainQueueReferenceCountingWithMultipleConsumers() throws Excepti // Enqueue first event TaskArtifactUpdateEvent event1 = TaskArtifactUpdateEvent.builder() - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .artifact(Artifact.builder() .artifactId("artifact-1") .parts(new TextPart("First artifact")) @@ -954,7 +954,7 @@ public void testMainQueueReferenceCountingWithMultipleConsumers() throws Excepti assertNotNull(firstConsumerEvent.get()); // Verify we have multiple child queues (ensureQueue + first resubscribe) - int childCountBeforeSecond = getChildQueueCount(MINIMAL_TASK.getId()); + int childCountBeforeSecond = getChildQueueCount(MINIMAL_TASK.id()); assertTrue(childCountBeforeSecond >= 2, "Should have at least 2 child queues"); // 3. Second consumer resubscribes while first is still active @@ -989,21 +989,21 @@ public void testMainQueueReferenceCountingWithMultipleConsumers() throws Excepti // This should succeed with reference counting because MainQueue stays alive // while first consumer's ChildQueue exists - getClient().resubscribe(new TaskIdParams(MINIMAL_TASK.getId()), + getClient().resubscribe(new TaskIdParams(MINIMAL_TASK.id()), List.of(secondConsumer), secondErrorHandler); assertTrue(secondSubscriptionLatch.await(15, TimeUnit.SECONDS), "Second subscription should be established"); // Verify child queue count increased (now ensureQueue + first + second) - int childCountAfterSecond = getChildQueueCount(MINIMAL_TASK.getId()); + int childCountAfterSecond = getChildQueueCount(MINIMAL_TASK.id()); assertTrue(childCountAfterSecond > childCountBeforeSecond, "Child queue count should increase after second resubscription"); // 4. Enqueue second event - both consumers should receive it TaskArtifactUpdateEvent event2 = TaskArtifactUpdateEvent.builder() - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .artifact(Artifact.builder() .artifactId("artifact-2") .parts(new TextPart("Second artifact")) @@ -1019,11 +1019,11 @@ public void testMainQueueReferenceCountingWithMultipleConsumers() throws Excepti TaskArtifactUpdateEvent receivedEvent = secondConsumerEvent.get(); assertNotNull(receivedEvent); - assertEquals("artifact-2", receivedEvent.getArtifact().artifactId()); - assertEquals("Second artifact", ((TextPart) receivedEvent.getArtifact().parts().get(0)).getText()); + assertEquals("artifact-2", receivedEvent.artifact().artifactId()); + assertEquals("Second artifact", ((TextPart) receivedEvent.artifact().parts().get(0)).text()); } finally { - deleteTaskInTaskStore(MINIMAL_TASK.getId()); + deleteTaskInTaskStore(MINIMAL_TASK.id()); } } @@ -1065,21 +1065,21 @@ public void testListPushNotificationConfigWithConfigId() throws Exception { .url("http://example.com") .id("config2") .build(); - savePushNotificationConfigInStore(MINIMAL_TASK.getId(), notificationConfig1); - savePushNotificationConfigInStore(MINIMAL_TASK.getId(), notificationConfig2); + savePushNotificationConfigInStore(MINIMAL_TASK.id(), notificationConfig1); + savePushNotificationConfigInStore(MINIMAL_TASK.id(), notificationConfig2); try { List result = getClient().listTaskPushNotificationConfigurations( - new ListTaskPushNotificationConfigParams(MINIMAL_TASK.getId())); + new ListTaskPushNotificationConfigParams(MINIMAL_TASK.id())); assertEquals(2, result.size()); - assertEquals(new TaskPushNotificationConfig(MINIMAL_TASK.getId(), notificationConfig1, null), result.get(0)); - assertEquals(new TaskPushNotificationConfig(MINIMAL_TASK.getId(), notificationConfig2, null), result.get(1)); + assertEquals(new TaskPushNotificationConfig(MINIMAL_TASK.id(), notificationConfig1, null), result.get(0)); + assertEquals(new TaskPushNotificationConfig(MINIMAL_TASK.id(), notificationConfig2, null), result.get(1)); } catch (Exception e) { fail(); } finally { - deletePushNotificationConfigInStore(MINIMAL_TASK.getId(), "config1"); - deletePushNotificationConfigInStore(MINIMAL_TASK.getId(), "config2"); - deleteTaskInTaskStore(MINIMAL_TASK.getId()); + deletePushNotificationConfigInStore(MINIMAL_TASK.id(), "config1"); + deletePushNotificationConfigInStore(MINIMAL_TASK.id(), "config2"); + deleteTaskInTaskStore(MINIMAL_TASK.id()); } } @@ -1094,26 +1094,26 @@ public void testListPushNotificationConfigWithoutConfigId() throws Exception { = PushNotificationConfig.builder() .url("http://2.example.com") .build(); - savePushNotificationConfigInStore(MINIMAL_TASK.getId(), notificationConfig1); + savePushNotificationConfigInStore(MINIMAL_TASK.id(), notificationConfig1); // will overwrite the previous one - savePushNotificationConfigInStore(MINIMAL_TASK.getId(), notificationConfig2); + savePushNotificationConfigInStore(MINIMAL_TASK.id(), notificationConfig2); try { List result = getClient().listTaskPushNotificationConfigurations( - new ListTaskPushNotificationConfigParams(MINIMAL_TASK.getId())); + new ListTaskPushNotificationConfigParams(MINIMAL_TASK.id())); assertEquals(1, result.size()); PushNotificationConfig expectedNotificationConfig = PushNotificationConfig.builder() .url("http://2.example.com") - .id(MINIMAL_TASK.getId()) + .id(MINIMAL_TASK.id()) .build(); - assertEquals(new TaskPushNotificationConfig(MINIMAL_TASK.getId(), expectedNotificationConfig, null), + assertEquals(new TaskPushNotificationConfig(MINIMAL_TASK.id(), expectedNotificationConfig, null), result.get(0)); } catch (Exception e) { fail(); } finally { - deletePushNotificationConfigInStore(MINIMAL_TASK.getId(), MINIMAL_TASK.getId()); - deleteTaskInTaskStore(MINIMAL_TASK.getId()); + deletePushNotificationConfigInStore(MINIMAL_TASK.id(), MINIMAL_TASK.id()); + deleteTaskInTaskStore(MINIMAL_TASK.id()); } } @@ -1133,12 +1133,12 @@ public void testListPushNotificationConfigEmptyList() throws Exception { saveTaskInTaskStore(MINIMAL_TASK); try { List result = getClient().listTaskPushNotificationConfigurations( - new ListTaskPushNotificationConfigParams(MINIMAL_TASK.getId())); + new ListTaskPushNotificationConfigParams(MINIMAL_TASK.id())); assertEquals(0, result.size()); } catch (Exception e) { fail(e.getMessage()); } finally { - deleteTaskInTaskStore(MINIMAL_TASK.getId()); + deleteTaskInTaskStore(MINIMAL_TASK.id()); } } @@ -1161,18 +1161,18 @@ public void testDeletePushNotificationConfigWithValidConfigId() throws Exception .url("http://example.com") .id("config2") .build(); - savePushNotificationConfigInStore(MINIMAL_TASK.getId(), notificationConfig1); - savePushNotificationConfigInStore(MINIMAL_TASK.getId(), notificationConfig2); + savePushNotificationConfigInStore(MINIMAL_TASK.id(), notificationConfig1); + savePushNotificationConfigInStore(MINIMAL_TASK.id(), notificationConfig2); savePushNotificationConfigInStore("task-456", notificationConfig1); try { // specify the config ID to delete getClient().deleteTaskPushNotificationConfigurations( - new DeleteTaskPushNotificationConfigParams(MINIMAL_TASK.getId(), "config1")); + new DeleteTaskPushNotificationConfigParams(MINIMAL_TASK.id(), "config1")); // should now be 1 left List result = getClient().listTaskPushNotificationConfigurations( - new ListTaskPushNotificationConfigParams(MINIMAL_TASK.getId())); + new ListTaskPushNotificationConfigParams(MINIMAL_TASK.id())); assertEquals(1, result.size()); // should remain unchanged, this is a different task @@ -1182,10 +1182,10 @@ public void testDeletePushNotificationConfigWithValidConfigId() throws Exception } catch (Exception e) { fail(e.getMessage()); } finally { - deletePushNotificationConfigInStore(MINIMAL_TASK.getId(), "config1"); - deletePushNotificationConfigInStore(MINIMAL_TASK.getId(), "config2"); + deletePushNotificationConfigInStore(MINIMAL_TASK.id(), "config1"); + deletePushNotificationConfigInStore(MINIMAL_TASK.id(), "config2"); deletePushNotificationConfigInStore("task-456", "config1"); - deleteTaskInTaskStore(MINIMAL_TASK.getId()); + deleteTaskInTaskStore(MINIMAL_TASK.id()); deleteTaskInTaskStore("task-456"); } } @@ -1203,23 +1203,23 @@ public void testDeletePushNotificationConfigWithNonExistingConfigId() throws Exc .url("http://example.com") .id("config2") .build(); - savePushNotificationConfigInStore(MINIMAL_TASK.getId(), notificationConfig1); - savePushNotificationConfigInStore(MINIMAL_TASK.getId(), notificationConfig2); + savePushNotificationConfigInStore(MINIMAL_TASK.id(), notificationConfig1); + savePushNotificationConfigInStore(MINIMAL_TASK.id(), notificationConfig2); try { getClient().deleteTaskPushNotificationConfigurations( - new DeleteTaskPushNotificationConfigParams(MINIMAL_TASK.getId(), "non-existent-config-id")); + new DeleteTaskPushNotificationConfigParams(MINIMAL_TASK.id(), "non-existent-config-id")); // should remain unchanged List result = getClient().listTaskPushNotificationConfigurations( - new ListTaskPushNotificationConfigParams(MINIMAL_TASK.getId())); + new ListTaskPushNotificationConfigParams(MINIMAL_TASK.id())); assertEquals(2, result.size()); } catch (Exception e) { fail(); } finally { - deletePushNotificationConfigInStore(MINIMAL_TASK.getId(), "config1"); - deletePushNotificationConfigInStore(MINIMAL_TASK.getId(), "config2"); - deleteTaskInTaskStore(MINIMAL_TASK.getId()); + deletePushNotificationConfigInStore(MINIMAL_TASK.id(), "config1"); + deletePushNotificationConfigInStore(MINIMAL_TASK.id(), "config2"); + deleteTaskInTaskStore(MINIMAL_TASK.id()); } } @@ -1246,24 +1246,24 @@ public void testDeletePushNotificationConfigSetWithoutConfigId() throws Exceptio = PushNotificationConfig.builder() .url("http://2.example.com") .build(); - savePushNotificationConfigInStore(MINIMAL_TASK.getId(), notificationConfig1); + savePushNotificationConfigInStore(MINIMAL_TASK.id(), notificationConfig1); // this one will overwrite the previous one - savePushNotificationConfigInStore(MINIMAL_TASK.getId(), notificationConfig2); + savePushNotificationConfigInStore(MINIMAL_TASK.id(), notificationConfig2); try { getClient().deleteTaskPushNotificationConfigurations( - new DeleteTaskPushNotificationConfigParams(MINIMAL_TASK.getId(), MINIMAL_TASK.getId())); + new DeleteTaskPushNotificationConfigParams(MINIMAL_TASK.id(), MINIMAL_TASK.id())); // should now be 0 List result = getClient().listTaskPushNotificationConfigurations( - new ListTaskPushNotificationConfigParams(MINIMAL_TASK.getId()), null); + new ListTaskPushNotificationConfigParams(MINIMAL_TASK.id()), null); assertEquals(0, result.size()); } catch (Exception e) { fail(); } finally { - deletePushNotificationConfigInStore(MINIMAL_TASK.getId(), MINIMAL_TASK.getId()); - deleteTaskInTaskStore(MINIMAL_TASK.getId()); + deletePushNotificationConfigInStore(MINIMAL_TASK.id(), MINIMAL_TASK.id()); + deleteTaskInTaskStore(MINIMAL_TASK.id()); } } @@ -1282,10 +1282,10 @@ public void testNonBlockingWithMultipleMessages() throws Exception { BiConsumer firstMessageConsumer = (event, agentCard) -> { if (event instanceof TaskEvent te) { - taskIdRef.set(te.getTask().getId()); + taskIdRef.set(te.getTask().id()); firstTaskLatch.countDown(); } else if (event instanceof TaskUpdateEvent tue && tue.getUpdateEvent() instanceof TaskStatusUpdateEvent status) { - taskIdRef.set(status.getTaskId()); + taskIdRef.set(status.taskId()); firstTaskLatch.countDown(); } }; @@ -1395,18 +1395,18 @@ public void testNonBlockingWithMultipleMessages() throws Exception { .filter(e -> e instanceof TaskArtifactUpdateEvent) .findFirst() .orElseThrow(); - assertEquals("artifact-2", resubArtifact.getArtifact().artifactId()); + assertEquals("artifact-2", resubArtifact.artifact().artifactId()); assertEquals("Second message artifact", - ((TextPart) resubArtifact.getArtifact().parts().get(0)).getText()); + ((TextPart) resubArtifact.artifact().parts().get(0)).text()); // Verify artifact-2 details from streaming TaskArtifactUpdateEvent streamArtifact = (TaskArtifactUpdateEvent) streamReceivedEvents.stream() .filter(e -> e instanceof TaskArtifactUpdateEvent) .findFirst() .orElseThrow(); - assertEquals("artifact-2", streamArtifact.getArtifact().artifactId()); + assertEquals("artifact-2", streamArtifact.artifact().artifactId()); assertEquals("Second message artifact", - ((TextPart) streamArtifact.getArtifact().parts().get(0)).getText()); + ((TextPart) streamArtifact.artifact().parts().get(0)).text()); } @Test @@ -1581,8 +1581,8 @@ public void testStreamingMethodWithoutAcceptHeader() throws Exception { private void testSendStreamingMessageWithHttpClient(String mediaType) throws Exception { Message message = Message.builder(MESSAGE) - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .build(); SendStreamingMessageRequest request = new SendStreamingMessageRequest( "1", new MessageSendParams(message, null, null, "")); @@ -1603,11 +1603,11 @@ private void testSendStreamingMessageWithHttpClient(String mediaType) throws Exc if (jsonResponse != null) { assertNull(jsonResponse.getError()); Message messageResponse = (Message) jsonResponse.getResult(); - assertEquals(MESSAGE.getMessageId(), messageResponse.getMessageId()); - assertEquals(MESSAGE.getRole(), messageResponse.getRole()); - Part part = messageResponse.getParts().get(0); + assertEquals(MESSAGE.messageId(), messageResponse.messageId()); + assertEquals(MESSAGE.role(), messageResponse.role()); + Part part = messageResponse.parts().get(0); assertEquals(Part.Kind.TEXT, part.getKind()); - assertEquals("test message", ((TextPart) part).getText()); + assertEquals("test message", ((TextPart) part).text()); latch.countDown(); } } catch (JsonProcessingException e) { @@ -1634,8 +1634,8 @@ public void testSendStreamingMessage(boolean createTask) throws Exception { } try { Message message = Message.builder(MESSAGE) - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .build(); CountDownLatch latch = new CountDownLatch(1); @@ -1669,16 +1669,16 @@ public void testSendStreamingMessage(boolean createTask) throws Exception { assertNull(errorRef.get()); Message messageResponse = receivedMessage.get(); assertNotNull(messageResponse); - assertEquals(MESSAGE.getMessageId(), messageResponse.getMessageId()); - assertEquals(MESSAGE.getRole(), messageResponse.getRole()); - Part part = messageResponse.getParts().get(0); + assertEquals(MESSAGE.messageId(), messageResponse.messageId()); + assertEquals(MESSAGE.role(), messageResponse.role()); + Part part = messageResponse.parts().get(0); assertEquals(Part.Kind.TEXT, part.getKind()); - assertEquals("test message", ((TextPart) part).getText()); + assertEquals("test message", ((TextPart) part).text()); } catch (A2AClientException e) { fail("Unexpected exception during sendMessage: " + e.getMessage(), e); } finally { if (createTask) { - deleteTaskInTaskStore(MINIMAL_TASK.getId()); + deleteTaskInTaskStore(MINIMAL_TASK.id()); } } } @@ -1809,9 +1809,9 @@ protected void ensureQueueForTask(String taskId) throws Exception { protected void enqueueEventOnServer(Event event) throws Exception { String path; if (event instanceof TaskArtifactUpdateEvent e) { - path = "test/queue/enqueueTaskArtifactUpdateEvent/" + e.getTaskId(); + path = "test/queue/enqueueTaskArtifactUpdateEvent/" + e.taskId(); } else if (event instanceof TaskStatusUpdateEvent e) { - path = "test/queue/enqueueTaskStatusUpdateEvent/" + e.getTaskId(); + path = "test/queue/enqueueTaskStatusUpdateEvent/" + e.taskId(); } else { throw new RuntimeException("Unknown event type " + event.getClass() + ". If you need the ability to" + " handle more types, please add the REST endpoints."); @@ -2158,7 +2158,7 @@ public void testMainQueueClosesForFinalizedTasks() throws Exception { BiConsumer consumer = (event, agentCard) -> { if (event instanceof TaskEvent te) { // Might get Task with final state - if (te.getTask().getStatus().state().isFinal()) { + if (te.getTask().status().state().isFinal()) { completionLatch.countDown(); } } else if (event instanceof MessageEvent me) { diff --git a/tests/server-common/src/test/java/io/a2a/server/apps/common/AgentExecutorProducer.java b/tests/server-common/src/test/java/io/a2a/server/apps/common/AgentExecutorProducer.java index 8bff85c78..48daf8517 100644 --- a/tests/server-common/src/test/java/io/a2a/server/apps/common/AgentExecutorProducer.java +++ b/tests/server-common/src/test/java/io/a2a/server/apps/common/AgentExecutorProducer.java @@ -51,10 +51,10 @@ public void execute(RequestContext context, EventQueue eventQueue) throws JSONRP @Override public void cancel(RequestContext context, EventQueue eventQueue) throws JSONRPCError { - if (context.getTask().getId().equals("cancel-task-123")) { + if (context.getTask().id().equals("cancel-task-123")) { TaskUpdater taskUpdater = new TaskUpdater(context, eventQueue); taskUpdater.cancel(); - } else if (context.getTask().getId().equals("cancel-task-not-supported-123")) { + } else if (context.getTask().id().equals("cancel-task-not-supported-123")) { throw new UnsupportedOperationError(); } } diff --git a/transport/grpc/src/test/java/io/a2a/transport/grpc/handler/GrpcHandlerTest.java b/transport/grpc/src/test/java/io/a2a/transport/grpc/handler/GrpcHandlerTest.java index 0dc4c3a61..ff165a563 100644 --- a/transport/grpc/src/test/java/io/a2a/transport/grpc/handler/GrpcHandlerTest.java +++ b/transport/grpc/src/test/java/io/a2a/transport/grpc/handler/GrpcHandlerTest.java @@ -59,11 +59,11 @@ public class GrpcHandlerTest extends AbstractA2ARequestHandlerTest { private static final Message GRPC_MESSAGE = Message.newBuilder() - .setTaskId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) - .setContextId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getContextId()) - .setMessageId(AbstractA2ARequestHandlerTest.MESSAGE.getMessageId()) + .setTaskId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()) + .setContextId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.contextId()) + .setMessageId(AbstractA2ARequestHandlerTest.MESSAGE.messageId()) .setRole(Role.ROLE_AGENT) - .addParts(Part.newBuilder().setText(((TextPart) AbstractA2ARequestHandlerTest.MESSAGE.getParts().get(0)).getText()).build()) + .addParts(Part.newBuilder().setText(((TextPart) AbstractA2ARequestHandlerTest.MESSAGE.parts().get(0)).text()).build()) .setMetadata(Struct.newBuilder().build()) .build(); @@ -73,7 +73,7 @@ public void testOnGetTaskSuccess() throws Exception { GrpcHandler handler = new TestGrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler, internalExecutor); taskStore.save(AbstractA2ARequestHandlerTest.MINIMAL_TASK); GetTaskRequest request = GetTaskRequest.newBuilder() - .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) + .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); @@ -85,8 +85,8 @@ public void testOnGetTaskSuccess() throws Exception { Assertions.assertNotNull(result); Assertions.assertEquals(1, result.size()); Task task = result.get(0); - assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(), task.getId()); - assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getContextId(), task.getContextId()); + assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.id(), task.getId()); + assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.contextId(), task.getContextId()); assertEquals(TaskState.TASK_STATE_SUBMITTED, task.getStatus().getState()); } @@ -94,7 +94,7 @@ public void testOnGetTaskSuccess() throws Exception { public void testOnGetTaskNotFound() throws Exception { GrpcHandler handler = new TestGrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler, internalExecutor); GetTaskRequest request = GetTaskRequest.newBuilder() - .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) + .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); @@ -119,7 +119,7 @@ public void testOnCancelTaskSuccess() throws Exception { }; CancelTaskRequest request = CancelTaskRequest.newBuilder() - .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) + .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.cancelTask(request, streamRecorder); @@ -130,8 +130,8 @@ public void testOnCancelTaskSuccess() throws Exception { Assertions.assertNotNull(result); Assertions.assertEquals(1, result.size()); Task task = result.get(0); - assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(), task.getId()); - assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getContextId(), task.getContextId()); + assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.id(), task.getId()); + assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.contextId(), task.getContextId()); assertEquals(TaskState.TASK_STATE_CANCELLED, task.getStatus().getState()); } @@ -145,7 +145,7 @@ public void testOnCancelTaskNotSupported() throws Exception { }; CancelTaskRequest request = CancelTaskRequest.newBuilder() - .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) + .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.cancelTask(request, streamRecorder); @@ -158,7 +158,7 @@ public void testOnCancelTaskNotSupported() throws Exception { public void testOnCancelTaskNotFound() throws Exception { GrpcHandler handler = new TestGrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler, internalExecutor); CancelTaskRequest request = CancelTaskRequest.newBuilder() - .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) + .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.cancelTask(request, streamRecorder); @@ -212,7 +212,7 @@ public void testOnMessageError() throws Exception { @Test public void testSetPushNotificationConfigSuccess() throws Exception { GrpcHandler handler = new TestGrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler, internalExecutor); - String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + "config456"; + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id() + "/pushNotificationConfigs/" + "config456"; StreamRecorder streamRecorder = createTaskPushNotificationConfigRequest(handler, NAME); Assertions.assertNull(streamRecorder.getError()); @@ -235,7 +235,7 @@ public void testGetPushNotificationConfigSuccess() throws Exception { eventQueue.enqueueEvent(context.getTask() != null ? context.getTask() : context.getMessage()); }; - String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + "config456"; + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id() + "/pushNotificationConfigs/" + "config456"; // first set the task push notification config StreamRecorder streamRecorder = createTaskPushNotificationConfigRequest(handler, NAME); @@ -260,7 +260,7 @@ public void testGetPushNotificationConfigSuccess() throws Exception { public void testPushNotificationsNotSupportedError() throws Exception { AgentCard card = AbstractA2ARequestHandlerTest.createAgentCard(true, false, true); GrpcHandler handler = new TestGrpcHandler(card, requestHandler, internalExecutor); - String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(); + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id(); StreamRecorder streamRecorder = createTaskPushNotificationConfigRequest(handler, NAME); assertGrpcError(streamRecorder, Status.Code.UNIMPLEMENTED); } @@ -272,7 +272,7 @@ public void testOnGetPushNotificationNoPushNotifierConfig() throws Exception { new DefaultRequestHandler(executor, taskStore, queueManager, null, null, internalExecutor); AgentCard card = AbstractA2ARequestHandlerTest.createAgentCard(false, true, false); GrpcHandler handler = new TestGrpcHandler(card, requestHandler, internalExecutor); - String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(); + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id(); StreamRecorder streamRecorder = getTaskPushNotificationConfigRequest(handler, NAME); assertGrpcError(streamRecorder, Status.Code.UNIMPLEMENTED); } @@ -284,7 +284,7 @@ public void testOnSetPushNotificationNoPushNotifierConfig() throws Exception { executor, taskStore, queueManager, null, null, internalExecutor); AgentCard card = AbstractA2ARequestHandlerTest.createAgentCard(false, true, false); GrpcHandler handler = new TestGrpcHandler(card, requestHandler, internalExecutor); - String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(); + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id(); StreamRecorder streamRecorder = createTaskPushNotificationConfigRequest(handler, NAME); assertGrpcError(streamRecorder, Status.Code.UNIMPLEMENTED); } @@ -348,8 +348,8 @@ public void onCompleted() { Task taskResponse = response.getTask(); Task expected = Task.newBuilder() - .setId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) - .setContextId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getContextId()) + .setId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()) + .setContextId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.contextId()) .addAllHistory(List.of(GRPC_MESSAGE)) .setStatus(TaskStatus.newBuilder().setStateValue(TaskState.TASK_STATE_SUBMITTED_VALUE)) .build(); @@ -371,16 +371,16 @@ public void testOnMessageStreamNewMessageExistingTaskSuccessMocks() throws Excep // This is used to send events from a mock List events = List.of( TaskArtifactUpdateEvent.builder() - .taskId(task.getId()) - .contextId(task.getContextId()) + .taskId(task.id()) + .contextId(task.contextId()) .artifact(Artifact.builder() .artifactId("11") .parts(new TextPart("text")) .build()) .build(), TaskStatusUpdateEvent.builder() - .taskId(task.getId()) - .contextId(task.getContextId()) + .taskId(task.id()) + .contextId(task.contextId()) .status(new io.a2a.spec.TaskStatus(io.a2a.spec.TaskState.WORKING)) .build()); @@ -397,15 +397,15 @@ public void testOnMessageStreamNewMessageExistingTaskSuccessMocks() throws Excep StreamResponse first = result.get(0); Assertions.assertTrue(first.hasArtifactUpdate()); io.a2a.grpc.TaskArtifactUpdateEvent taskArtifactUpdateEvent = first.getArtifactUpdate(); - assertEquals(task.getId(), taskArtifactUpdateEvent.getTaskId()); - assertEquals(task.getContextId(), taskArtifactUpdateEvent.getContextId()); + assertEquals(task.id(), taskArtifactUpdateEvent.getTaskId()); + assertEquals(task.contextId(), taskArtifactUpdateEvent.getContextId()); assertEquals("11", taskArtifactUpdateEvent.getArtifact().getArtifactId()); assertEquals("text", taskArtifactUpdateEvent.getArtifact().getParts(0).getText()); StreamResponse second = result.get(1); Assertions.assertTrue(second.hasStatusUpdate()); io.a2a.grpc.TaskStatusUpdateEvent taskStatusUpdateEvent = second.getStatusUpdate(); - assertEquals(task.getId(), taskStatusUpdateEvent.getTaskId()); - assertEquals(task.getContextId(), taskStatusUpdateEvent.getContextId()); + assertEquals(task.id(), taskStatusUpdateEvent.getTaskId()); + assertEquals(task.contextId(), taskStatusUpdateEvent.getContextId()); assertEquals(TaskState.TASK_STATE_WORKING, taskStatusUpdateEvent.getStatus().getState()); } @@ -415,16 +415,16 @@ public void testOnMessageStreamNewMessageSendPushNotificationSuccess() throws Ex List events = List.of( AbstractA2ARequestHandlerTest.MINIMAL_TASK, TaskArtifactUpdateEvent.builder() - .taskId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) - .contextId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getContextId()) + .taskId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()) + .contextId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.contextId()) .artifact(Artifact.builder() .artifactId("11") .parts(new TextPart("text")) .build()) .build(), TaskStatusUpdateEvent.builder() - .taskId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) - .contextId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getContextId()) + .taskId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()) + .contextId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.contextId()) .status(new io.a2a.spec.TaskStatus(io.a2a.spec.TaskState.COMPLETED)) .build()); @@ -436,7 +436,7 @@ public void testOnMessageStreamNewMessageSendPushNotificationSuccess() throws Ex } }; - String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(); + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id(); StreamRecorder pushStreamRecorder = createTaskPushNotificationConfigRequest(handler, NAME); Assertions.assertNull(pushStreamRecorder.getError()); @@ -467,33 +467,33 @@ public void onCompleted() { Assertions.assertEquals(3, httpClient.tasks.size()); io.a2a.spec.Task curr = httpClient.tasks.get(0); - 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()); + Assertions.assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.id(), curr.id()); + Assertions.assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.contextId(), curr.contextId()); + Assertions.assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.status().state(), curr.status().state()); + Assertions.assertEquals(0, curr.artifacts() == null ? 0 : curr.artifacts().size()); curr = httpClient.tasks.get(1); - 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()); + Assertions.assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.id(), curr.id()); + Assertions.assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.contextId(), curr.contextId()); + Assertions.assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.status().state(), curr.status().state()); + Assertions.assertEquals(1, curr.artifacts().size()); + Assertions.assertEquals(1, curr.artifacts().get(0).parts().size()); + Assertions.assertEquals("text", ((TextPart)curr.artifacts().get(0).parts().get(0)).text()); curr = httpClient.tasks.get(2); - 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()); + Assertions.assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.id(), curr.id()); + Assertions.assertEquals(AbstractA2ARequestHandlerTest.MINIMAL_TASK.contextId(), curr.contextId()); + Assertions.assertEquals(io.a2a.spec.TaskState.COMPLETED, curr.status().state()); + Assertions.assertEquals(1, curr.artifacts().size()); + Assertions.assertEquals(1, curr.artifacts().get(0).parts().size()); + Assertions.assertEquals("text", ((TextPart)curr.artifacts().get(0).parts().get(0)).text()); } @Test public void testOnResubscribeNoExistingTaskError() throws Exception { GrpcHandler handler = new TestGrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler, internalExecutor); SubscribeToTaskRequest request = SubscribeToTaskRequest.newBuilder() - .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) + .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.subscribeToTask(request, streamRecorder); @@ -505,7 +505,7 @@ public void testOnResubscribeNoExistingTaskError() throws Exception { public void testOnResubscribeExistingTaskSuccess() throws Exception { GrpcHandler handler = new TestGrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler, internalExecutor); taskStore.save(AbstractA2ARequestHandlerTest.MINIMAL_TASK); - queueManager.createOrTap(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()); + queueManager.createOrTap(AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()); agentExecutorExecute = (context, eventQueue) -> { eventQueue.enqueueEvent(context.getMessage()); @@ -513,7 +513,7 @@ public void testOnResubscribeExistingTaskSuccess() throws Exception { StreamRecorder streamRecorder = StreamRecorder.create(); SubscribeToTaskRequest request = SubscribeToTaskRequest.newBuilder() - .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) + .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()) .build(); handler.subscribeToTask(request, streamRecorder); @@ -540,26 +540,26 @@ public void testOnResubscribeExistingTaskSuccess() throws Exception { public void testOnResubscribeExistingTaskSuccessMocks() throws Exception { GrpcHandler handler = new TestGrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler, internalExecutor); taskStore.save(AbstractA2ARequestHandlerTest.MINIMAL_TASK); - queueManager.createOrTap(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()); + queueManager.createOrTap(AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()); List events = List.of( TaskArtifactUpdateEvent.builder() - .taskId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) - .contextId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getContextId()) + .taskId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()) + .contextId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.contextId()) .artifact(Artifact.builder() .artifactId("11") .parts(new TextPart("text")) .build()) .build(), TaskStatusUpdateEvent.builder() - .taskId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) - .contextId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.getContextId()) + .taskId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()) + .contextId(AbstractA2ARequestHandlerTest.MINIMAL_TASK.contextId()) .status(new io.a2a.spec.TaskStatus(io.a2a.spec.TaskState.WORKING)) .build()); StreamRecorder streamRecorder = StreamRecorder.create(); SubscribeToTaskRequest request = SubscribeToTaskRequest.newBuilder() - .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) + .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()) .build(); try (MockedConstruction mocked = Mockito.mockConstruction( EventConsumer.class, @@ -594,7 +594,7 @@ public void testStreamingNotSupportedErrorOnResubscribeToTask() throws Exception AgentCard card = AbstractA2ARequestHandlerTest.createAgentCard(false, true, true); GrpcHandler handler = new TestGrpcHandler(card, requestHandler, internalExecutor); SubscribeToTaskRequest request = SubscribeToTaskRequest.newBuilder() - .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) + .setName("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.subscribeToTask(request, streamRecorder); @@ -619,12 +619,12 @@ public void testListPushNotificationConfig() throws Exception { eventQueue.enqueueEvent(context.getTask() != null ? context.getTask() : context.getMessage()); }; - String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(); + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id(); StreamRecorder pushRecorder = createTaskPushNotificationConfigRequest(handler, NAME); Assertions.assertNull(pushRecorder.getError()); ListTaskPushNotificationConfigRequest request = ListTaskPushNotificationConfigRequest.newBuilder() - .setParent("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) + .setParent("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.listTaskPushNotificationConfig(request, streamRecorder); @@ -646,7 +646,7 @@ public void testListPushNotificationConfigNotSupported() throws Exception { }; ListTaskPushNotificationConfigRequest request = ListTaskPushNotificationConfigRequest.newBuilder() - .setParent("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) + .setParent("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.listTaskPushNotificationConfig(request, streamRecorder); @@ -664,7 +664,7 @@ public void testListPushNotificationConfigNoPushConfigStore() { }; ListTaskPushNotificationConfigRequest request = ListTaskPushNotificationConfigRequest.newBuilder() - .setParent("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) + .setParent("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.listTaskPushNotificationConfig(request, streamRecorder); @@ -679,7 +679,7 @@ public void testListPushNotificationConfigTaskNotFound() { }; ListTaskPushNotificationConfigRequest request = ListTaskPushNotificationConfigRequest.newBuilder() - .setParent("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId()) + .setParent("tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); handler.listTaskPushNotificationConfig(request, streamRecorder); @@ -694,7 +694,7 @@ public void testDeletePushNotificationConfig() throws Exception { eventQueue.enqueueEvent(context.getTask() != null ? context.getTask() : context.getMessage()); }; - String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(); + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id(); StreamRecorder pushRecorder = createTaskPushNotificationConfigRequest(handler, NAME); Assertions.assertNull(pushRecorder.getError()); @@ -717,7 +717,7 @@ public void testDeletePushNotificationConfigNotSupported() throws Exception { eventQueue.enqueueEvent(context.getTask() != null ? context.getTask() : context.getMessage()); }; - String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(); + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id(); DeleteTaskPushNotificationConfigRequest request = DeleteTaskPushNotificationConfigRequest.newBuilder() .setName(NAME) .build(); @@ -731,7 +731,7 @@ public void testDeletePushNotificationConfigNoPushConfigStore() { DefaultRequestHandler requestHandler = DefaultRequestHandler.create( executor, taskStore, queueManager, null, null, internalExecutor); GrpcHandler handler = new TestGrpcHandler(AbstractA2ARequestHandlerTest.CARD, requestHandler, internalExecutor); - String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.getId(); + String NAME = "tasks/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id() + "/pushNotificationConfigs/" + AbstractA2ARequestHandlerTest.MINIMAL_TASK.id(); DeleteTaskPushNotificationConfigRequest request = DeleteTaskPushNotificationConfigRequest.newBuilder() .setName(NAME) .build(); @@ -831,7 +831,7 @@ private StreamRecorder createTaskPushNotificationCon SetTaskPushNotificationConfigRequest setRequest = SetTaskPushNotificationConfigRequest.newBuilder() .setConfig(taskPushNotificationConfig) .setConfigId("config456") - .setParent("tasks/" + MINIMAL_TASK.getId()) + .setParent("tasks/" + MINIMAL_TASK.id()) .build(); StreamRecorder streamRecorder = StreamRecorder.create(); diff --git a/transport/jsonrpc/src/test/java/io/a2a/transport/jsonrpc/handler/JSONRPCHandlerTest.java b/transport/jsonrpc/src/test/java/io/a2a/transport/jsonrpc/handler/JSONRPCHandlerTest.java index 08e2ffec9..b2f447d4b 100644 --- a/transport/jsonrpc/src/test/java/io/a2a/transport/jsonrpc/handler/JSONRPCHandlerTest.java +++ b/transport/jsonrpc/src/test/java/io/a2a/transport/jsonrpc/handler/JSONRPCHandlerTest.java @@ -83,7 +83,7 @@ public class JSONRPCHandlerTest extends AbstractA2ARequestHandlerTest { public void testOnGetTaskSuccess() throws Exception { JSONRPCHandler handler = new JSONRPCHandler(CARD, requestHandler, internalExecutor); taskStore.save(MINIMAL_TASK); - GetTaskRequest request = new GetTaskRequest("1", new TaskQueryParams(MINIMAL_TASK.getId())); + GetTaskRequest request = new GetTaskRequest("1", new TaskQueryParams(MINIMAL_TASK.id())); GetTaskResponse response = handler.onGetTask(request, callContext); assertEquals(request.getId(), response.getId()); Assertions.assertSame(MINIMAL_TASK, response.getResult()); @@ -93,7 +93,7 @@ public void testOnGetTaskSuccess() throws Exception { @Test public void testOnGetTaskNotFound() throws Exception { JSONRPCHandler handler = new JSONRPCHandler(CARD, requestHandler, internalExecutor); - GetTaskRequest request = new GetTaskRequest("1", new TaskQueryParams(MINIMAL_TASK.getId())); + GetTaskRequest request = new GetTaskRequest("1", new TaskQueryParams(MINIMAL_TASK.id())); GetTaskResponse response = handler.onGetTask(request, callContext); assertEquals(request.getId(), response.getId()); assertInstanceOf(TaskNotFoundError.class, response.getError()); @@ -114,15 +114,15 @@ public void testOnCancelTaskSuccess() throws Exception { taskUpdater.cancel(); }; - CancelTaskRequest request = new CancelTaskRequest("111", new TaskIdParams(MINIMAL_TASK.getId())); + CancelTaskRequest request = new CancelTaskRequest("111", new TaskIdParams(MINIMAL_TASK.id())); CancelTaskResponse response = handler.onCancelTask(request, callContext); assertNull(response.getError()); 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()); + assertEquals(MINIMAL_TASK.id(), task.id()); + assertEquals(MINIMAL_TASK.contextId(), task.contextId()); + assertEquals(TaskState.CANCELED, task.status().state()); } @Test @@ -134,7 +134,7 @@ public void testOnCancelTaskNotSupported() { throw new UnsupportedOperationError(); }; - CancelTaskRequest request = new CancelTaskRequest("1", new TaskIdParams(MINIMAL_TASK.getId())); + CancelTaskRequest request = new CancelTaskRequest("1", new TaskIdParams(MINIMAL_TASK.id())); CancelTaskResponse response = handler.onCancelTask(request, callContext); assertEquals(request.getId(), response.getId()); assertNull(response.getResult()); @@ -144,7 +144,7 @@ public void testOnCancelTaskNotSupported() { @Test public void testOnCancelTaskNotFound() { JSONRPCHandler handler = new JSONRPCHandler(CARD, requestHandler, internalExecutor); - CancelTaskRequest request = new CancelTaskRequest("1", new TaskIdParams(MINIMAL_TASK.getId())); + CancelTaskRequest request = new CancelTaskRequest("1", new TaskIdParams(MINIMAL_TASK.id())); CancelTaskResponse response = handler.onCancelTask(request, callContext); assertEquals(request.getId(), response.getId()); assertNull(response.getResult()); @@ -158,8 +158,8 @@ public void testOnMessageNewMessageSuccess() { eventQueue.enqueueEvent(context.getMessage()); }; Message message = Message.builder(MESSAGE) - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .build(); SendMessageRequest request = new SendMessageRequest("1", new MessageSendParams(message, null, null)); SendMessageResponse response = handler.onMessageSend(request, callContext); @@ -178,8 +178,8 @@ public void testOnMessageNewMessageSuccessMocks() { JSONRPCHandler handler = new JSONRPCHandler(CARD, requestHandler, internalExecutor); Message message = Message.builder(MESSAGE) - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .build(); SendMessageRequest request = new SendMessageRequest("1", new MessageSendParams(message, null, null)); @@ -204,8 +204,8 @@ public void testOnMessageNewMessageWithExistingTaskSuccess() { eventQueue.enqueueEvent(context.getMessage()); }; Message message = Message.builder(MESSAGE) - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .build(); SendMessageRequest request = new SendMessageRequest("1", new MessageSendParams(message, null, null)); SendMessageResponse response = handler.onMessageSend(request, callContext); @@ -225,8 +225,8 @@ public void testOnMessageNewMessageWithExistingTaskSuccessMocks() { taskStore.save(MINIMAL_TASK); Message message = Message.builder(MESSAGE) - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .build(); SendMessageRequest request = new SendMessageRequest("1", new MessageSendParams(message, null, null)); SendMessageResponse response; @@ -251,8 +251,8 @@ public void testOnMessageError() { eventQueue.enqueueEvent(new UnsupportedOperationError()); }; Message message = Message.builder(MESSAGE) - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .build(); SendMessageRequest request = new SendMessageRequest( "1", new MessageSendParams(message, null, null)); @@ -265,8 +265,8 @@ public void testOnMessageError() { public void testOnMessageErrorMocks() { JSONRPCHandler handler = new JSONRPCHandler(CARD, requestHandler, internalExecutor); Message message = Message.builder(MESSAGE) - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .build(); SendMessageRequest request = new SendMessageRequest( "1", new MessageSendParams(message, null, null)); @@ -291,8 +291,8 @@ public void testOnMessageStreamNewMessageSuccess() throws InterruptedException { }; Message message = Message.builder(MESSAGE) - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .build(); SendStreamingMessageRequest request = new SendStreamingMessageRequest( @@ -350,8 +350,8 @@ public void testOnMessageStreamNewMessageMultipleEventsSuccess() throws Interrup .build(); TaskArtifactUpdateEvent artifactEvent = TaskArtifactUpdateEvent.builder() - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .artifact(Artifact.builder() .artifactId("artifact-1") .parts(new TextPart("Generated artifact content")) @@ -359,8 +359,8 @@ public void testOnMessageStreamNewMessageMultipleEventsSuccess() throws Interrup .build(); TaskStatusUpdateEvent statusEvent = TaskStatusUpdateEvent.builder() - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .status(new TaskStatus(TaskState.COMPLETED)) .build(); @@ -375,8 +375,8 @@ public void testOnMessageStreamNewMessageMultipleEventsSuccess() throws Interrup }; Message message = Message.builder(MESSAGE) - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .build(); SendStreamingMessageRequest request = new SendStreamingMessageRequest( @@ -431,21 +431,21 @@ public void onComplete() { // Verify the first event is the task Task receivedTask = assertInstanceOf(Task.class, results.get(0), "First event should be a Task"); - assertEquals(MINIMAL_TASK.getId(), receivedTask.getId()); - assertEquals(MINIMAL_TASK.getContextId(), receivedTask.getContextId()); - assertEquals(TaskState.WORKING, receivedTask.getStatus().state()); + assertEquals(MINIMAL_TASK.id(), receivedTask.id()); + assertEquals(MINIMAL_TASK.contextId(), receivedTask.contextId()); + assertEquals(TaskState.WORKING, receivedTask.status().state()); // Verify the second event is the artifact update TaskArtifactUpdateEvent receivedArtifact = assertInstanceOf(TaskArtifactUpdateEvent.class, results.get(1), "Second event should be a TaskArtifactUpdateEvent"); - assertEquals(MINIMAL_TASK.getId(), receivedArtifact.getTaskId()); - assertEquals("artifact-1", receivedArtifact.getArtifact().artifactId()); + assertEquals(MINIMAL_TASK.id(), receivedArtifact.taskId()); + assertEquals("artifact-1", receivedArtifact.artifact().artifactId()); // Verify the third event is the status update TaskStatusUpdateEvent receivedStatus = assertInstanceOf(TaskStatusUpdateEvent.class, results.get(2), "Third event should be a TaskStatusUpdateEvent"); - assertEquals(MINIMAL_TASK.getId(), receivedStatus.getTaskId()); - assertEquals(TaskState.COMPLETED, receivedStatus.getStatus().state()); + assertEquals(MINIMAL_TASK.id(), receivedStatus.taskId()); + assertEquals(TaskState.COMPLETED, receivedStatus.status().state()); } @Test @@ -456,22 +456,22 @@ public void testOnMessageStreamNewMessageSuccessMocks() { List events = List.of( MINIMAL_TASK, TaskArtifactUpdateEvent.builder() - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .artifact(Artifact.builder() .artifactId("art1") .parts(new TextPart("text")) .build()) .build(), TaskStatusUpdateEvent.builder() - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .status(new TaskStatus(TaskState.COMPLETED)) .build()); Message message = Message.builder(MESSAGE) - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .build(); SendStreamingMessageRequest request = new SendStreamingMessageRequest( @@ -531,8 +531,8 @@ public void testOnMessageStreamNewMessageExistingTaskSuccess() throws Exception taskStore.save(task); Message message = Message.builder(MESSAGE) - .taskId(task.getId()) - .contextId(task.getContextId()) + .taskId(task.id()) + .contextId(task.contextId()) .build(); SendStreamingMessageRequest request = new SendStreamingMessageRequest( @@ -585,10 +585,10 @@ public void onComplete() { StreamingEventKind receivedType = results.get(0); 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()); + assertEquals(expected.id(), received.id()); + assertEquals(expected.contextId(), received.contextId()); + assertEquals(expected.status(), received.status()); + assertEquals(expected.history(), received.history()); } @Test @@ -603,22 +603,22 @@ public void testOnMessageStreamNewMessageExistingTaskSuccessMocks() { // This is used to send events from a mock List events = List.of( TaskArtifactUpdateEvent.builder() - .taskId(task.getId()) - .contextId(task.getContextId()) + .taskId(task.id()) + .contextId(task.contextId()) .artifact(Artifact.builder() .artifactId("11") .parts(new TextPart("text")) .build()) .build(), TaskStatusUpdateEvent.builder() - .taskId(task.getId()) - .contextId(task.getContextId()) + .taskId(task.id()) + .contextId(task.contextId()) .status(new TaskStatus(TaskState.WORKING)) .build()); Message message = Message.builder(MESSAGE) - .taskId(task.getId()) - .contextId(task.getContextId()) + .taskId(task.id()) + .contextId(task.contextId()) .build(); SendStreamingMessageRequest request = new SendStreamingMessageRequest( @@ -676,14 +676,14 @@ public void testSetPushNotificationConfigSuccess() { TaskPushNotificationConfig taskPushConfig = new TaskPushNotificationConfig( - MINIMAL_TASK.getId(), + MINIMAL_TASK.id(), PushNotificationConfig.builder().url("http://example.com") .id("c295ea44-7543-4f78-b524-7a38915ad6e4").build(), "tenant"); SetTaskPushNotificationConfigRequest request = new SetTaskPushNotificationConfigRequest("1", taskPushConfig); SetTaskPushNotificationConfigResponse response = handler.setPushNotificationConfig(request, callContext); TaskPushNotificationConfig taskPushConfigResult - = new TaskPushNotificationConfig( MINIMAL_TASK.getId(), + = new TaskPushNotificationConfig( MINIMAL_TASK.id(), PushNotificationConfig.builder().url("http://example.com") .id("c295ea44-7543-4f78-b524-7a38915ad6e4").build(), "tenant"); @@ -701,17 +701,17 @@ public void testGetPushNotificationConfigSuccess() { TaskPushNotificationConfig taskPushConfig = new TaskPushNotificationConfig( - MINIMAL_TASK.getId(), PushNotificationConfig.builder() + MINIMAL_TASK.id(), PushNotificationConfig.builder() .id("c295ea44-7543-4f78-b524-7a38915ad6e4").url("http://example.com").build(), "tenant"); SetTaskPushNotificationConfigRequest request = new SetTaskPushNotificationConfigRequest("1", taskPushConfig); handler.setPushNotificationConfig(request, callContext); GetTaskPushNotificationConfigRequest getRequest - = new GetTaskPushNotificationConfigRequest("111", new GetTaskPushNotificationConfigParams(MINIMAL_TASK.getId())); + = new GetTaskPushNotificationConfigRequest("111", new GetTaskPushNotificationConfigParams(MINIMAL_TASK.id())); GetTaskPushNotificationConfigResponse getResponse = handler.getPushNotificationConfig(getRequest, callContext); - TaskPushNotificationConfig expectedConfig = new TaskPushNotificationConfig(MINIMAL_TASK.getId(), + TaskPushNotificationConfig expectedConfig = new TaskPushNotificationConfig(MINIMAL_TASK.id(), PushNotificationConfig.builder().id("c295ea44-7543-4f78-b524-7a38915ad6e4").url("http://example.com").build(), ""); assertEquals(expectedConfig, getResponse.getResult()); @@ -725,16 +725,16 @@ public void testOnMessageStreamNewMessageSendPushNotificationSuccess() throws Ex List events = List.of( MINIMAL_TASK, TaskArtifactUpdateEvent.builder() - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .artifact(Artifact.builder() .artifactId("11") .parts(new TextPart("text")) .build()) .build(), TaskStatusUpdateEvent.builder() - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .status(new TaskStatus(TaskState.COMPLETED)) .build()); @@ -746,7 +746,7 @@ public void testOnMessageStreamNewMessageSendPushNotificationSuccess() throws Ex }; TaskPushNotificationConfig config = new TaskPushNotificationConfig( - MINIMAL_TASK.getId(), + MINIMAL_TASK.id(), PushNotificationConfig.builder().id("c295ea44-7543-4f78-b524-7a38915ad6e4").url("http://example.com").build(), "tenant"); SetTaskPushNotificationConfigRequest stpnRequest = new SetTaskPushNotificationConfigRequest("1", config); @@ -754,7 +754,7 @@ public void testOnMessageStreamNewMessageSendPushNotificationSuccess() throws Ex assertNull(stpnResponse.getError()); Message msg = Message.builder(MESSAGE) - .taskId(MINIMAL_TASK.getId()) + .taskId(MINIMAL_TASK.id()) .build(); SendStreamingMessageRequest request = new SendStreamingMessageRequest("1", new MessageSendParams(msg, null, null)); Flow.Publisher response = handler.onMessageSendStream(request, callContext); @@ -799,33 +799,33 @@ public void onComplete() { 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()); + assertEquals(MINIMAL_TASK.id(), curr.id()); + assertEquals(MINIMAL_TASK.contextId(), curr.contextId()); + assertEquals(MINIMAL_TASK.status().state(), curr.status().state()); + assertEquals(0, curr.artifacts() == null ? 0 : curr.artifacts().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()); + assertEquals(MINIMAL_TASK.id(), curr.id()); + assertEquals(MINIMAL_TASK.contextId(), curr.contextId()); + assertEquals(MINIMAL_TASK.status().state(), curr.status().state()); + assertEquals(1, curr.artifacts().size()); + assertEquals(1, curr.artifacts().get(0).parts().size()); + assertEquals("text", ((TextPart) curr.artifacts().get(0).parts().get(0)).text()); 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()); + assertEquals(MINIMAL_TASK.id(), curr.id()); + assertEquals(MINIMAL_TASK.contextId(), curr.contextId()); + assertEquals(TaskState.COMPLETED, curr.status().state()); + assertEquals(1, curr.artifacts().size()); + assertEquals(1, curr.artifacts().get(0).parts().size()); + assertEquals("text", ((TextPart) curr.artifacts().get(0).parts().get(0)).text()); } @Test public void testOnResubscribeExistingTaskSuccess() { JSONRPCHandler handler = new JSONRPCHandler(CARD, requestHandler, internalExecutor); taskStore.save(MINIMAL_TASK); - queueManager.createOrTap(MINIMAL_TASK.getId()); + queueManager.createOrTap(MINIMAL_TASK.id()); agentExecutorExecute = (context, eventQueue) -> { // The only thing hitting the agent is the onMessageSend() and we should use the message @@ -833,13 +833,13 @@ public void testOnResubscribeExistingTaskSuccess() { //eventQueue.enqueueEvent(context.getTask() != null ? context.getTask() : context.getMessage()); }; - SubscribeToTaskRequest request = new SubscribeToTaskRequest("1", new TaskIdParams(MINIMAL_TASK.getId())); + SubscribeToTaskRequest request = new SubscribeToTaskRequest("1", new TaskIdParams(MINIMAL_TASK.id())); Flow.Publisher response = handler.onSubscribeToTask(request, callContext); // We need to send some events in order for those to end up in the queue Message message = Message.builder() - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .role(Message.Role.AGENT) .parts(new TextPart("text")) .build(); @@ -892,24 +892,24 @@ public void onComplete() { public void testOnResubscribeExistingTaskSuccessMocks() throws Exception { JSONRPCHandler handler = new JSONRPCHandler(CARD, requestHandler, internalExecutor); taskStore.save(MINIMAL_TASK); - queueManager.createOrTap(MINIMAL_TASK.getId()); + queueManager.createOrTap(MINIMAL_TASK.id()); List events = List.of( TaskArtifactUpdateEvent.builder() - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .artifact(Artifact.builder() .artifactId("11") .parts(new TextPart("text")) .build()) .build(), TaskStatusUpdateEvent.builder() - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .status(new TaskStatus(TaskState.WORKING)) .build()); - SubscribeToTaskRequest request = new SubscribeToTaskRequest("1", new TaskIdParams(MINIMAL_TASK.getId())); + SubscribeToTaskRequest request = new SubscribeToTaskRequest("1", new TaskIdParams(MINIMAL_TASK.id())); Flow.Publisher response; try (MockedConstruction mocked = Mockito.mockConstruction( EventConsumer.class, @@ -965,7 +965,7 @@ public void onComplete() { public void testOnResubscribeNoExistingTaskError() { JSONRPCHandler handler = new JSONRPCHandler(CARD, requestHandler, internalExecutor); - SubscribeToTaskRequest request = new SubscribeToTaskRequest("1", new TaskIdParams(MINIMAL_TASK.getId())); + SubscribeToTaskRequest request = new SubscribeToTaskRequest("1", new TaskIdParams(MINIMAL_TASK.id())); Flow.Publisher response = handler.onSubscribeToTask(request, callContext); List results = new ArrayList<>(); @@ -1060,7 +1060,7 @@ public void testStreamingNotSupportedErrorOnResubscribeToTask() { AgentCard card = createAgentCard(false, true, true); JSONRPCHandler handler = new JSONRPCHandler(card, requestHandler, internalExecutor); - SubscribeToTaskRequest request = new SubscribeToTaskRequest("1", new TaskIdParams(MINIMAL_TASK.getId())); + SubscribeToTaskRequest request = new SubscribeToTaskRequest("1", new TaskIdParams(MINIMAL_TASK.id())); Flow.Publisher response = handler.onSubscribeToTask(request, callContext); List results = new ArrayList<>(); @@ -1109,7 +1109,7 @@ public void testPushNotificationsNotSupportedError() { TaskPushNotificationConfig config = new TaskPushNotificationConfig( - MINIMAL_TASK.getId(), + MINIMAL_TASK.id(), PushNotificationConfig.builder() .id("c295ea44-7543-4f78-b524-7a38915ad6e4") .url("http://example.com") @@ -1133,7 +1133,7 @@ public void testOnGetPushNotificationNoPushNotifierConfig() { taskStore.save(MINIMAL_TASK); GetTaskPushNotificationConfigRequest request - = new GetTaskPushNotificationConfigRequest("id", new GetTaskPushNotificationConfigParams(MINIMAL_TASK.getId())); + = new GetTaskPushNotificationConfigRequest("id", new GetTaskPushNotificationConfigParams(MINIMAL_TASK.id())); GetTaskPushNotificationConfigResponse response = handler.getPushNotificationConfig(request, callContext); Assertions.assertNotNull(response.getError()); @@ -1153,7 +1153,7 @@ public void testOnSetPushNotificationNoPushNotifierConfig() { TaskPushNotificationConfig config = new TaskPushNotificationConfig( - MINIMAL_TASK.getId(), + MINIMAL_TASK.id(), PushNotificationConfig.builder() .id("c295ea44-7543-4f78-b524-7a38915ad6e4") .url("http://example.com") @@ -1244,8 +1244,8 @@ public void testOnMessageSendErrorHandling() { taskStore.save(MINIMAL_TASK); Message message = Message.builder(MESSAGE) - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .build(); SendMessageRequest request = new SendMessageRequest("1", new MessageSendParams(message, null, null)); @@ -1344,19 +1344,19 @@ public void testListPushNotificationConfig() { TaskPushNotificationConfig taskPushConfig = new TaskPushNotificationConfig( - MINIMAL_TASK.getId(), PushNotificationConfig.builder() + MINIMAL_TASK.id(), PushNotificationConfig.builder() .url("http://example.com") - .id(MINIMAL_TASK.getId()) + .id(MINIMAL_TASK.id()) .build(), "tenant"); SetTaskPushNotificationConfigRequest request = new SetTaskPushNotificationConfigRequest("1", taskPushConfig); handler.setPushNotificationConfig(request, callContext); TaskPushNotificationConfig result = new TaskPushNotificationConfig( - MINIMAL_TASK.getId(), PushNotificationConfig.builder() + MINIMAL_TASK.id(), PushNotificationConfig.builder() .url("http://example.com") - .id(MINIMAL_TASK.getId()) + .id(MINIMAL_TASK.id()) .build(), ""); ListTaskPushNotificationConfigRequest listRequest - = new ListTaskPushNotificationConfigRequest("111", new ListTaskPushNotificationConfigParams(MINIMAL_TASK.getId())); + = new ListTaskPushNotificationConfigRequest("111", new ListTaskPushNotificationConfigParams(MINIMAL_TASK.id())); ListTaskPushNotificationConfigResponse listResponse = handler.listPushNotificationConfig(listRequest, callContext); assertEquals("111", listResponse.getId()); @@ -1375,15 +1375,15 @@ public void testListPushNotificationConfigNotSupported() { TaskPushNotificationConfig taskPushConfig = new TaskPushNotificationConfig( - MINIMAL_TASK.getId(), PushNotificationConfig.builder() + MINIMAL_TASK.id(), PushNotificationConfig.builder() .url("http://example.com") - .id(MINIMAL_TASK.getId()) + .id(MINIMAL_TASK.id()) .build(), "tenant"); SetTaskPushNotificationConfigRequest request = new SetTaskPushNotificationConfigRequest("1", taskPushConfig); handler.setPushNotificationConfig(request, callContext); ListTaskPushNotificationConfigRequest listRequest - = new ListTaskPushNotificationConfigRequest("111", new ListTaskPushNotificationConfigParams(MINIMAL_TASK.getId())); + = new ListTaskPushNotificationConfigRequest("111", new ListTaskPushNotificationConfigParams(MINIMAL_TASK.id())); ListTaskPushNotificationConfigResponse listResponse = handler.listPushNotificationConfig(listRequest, callContext); @@ -1403,7 +1403,7 @@ public void testListPushNotificationConfigNoPushConfigStore() { }; ListTaskPushNotificationConfigRequest listRequest - = new ListTaskPushNotificationConfigRequest("111", new ListTaskPushNotificationConfigParams(MINIMAL_TASK.getId())); + = new ListTaskPushNotificationConfigRequest("111", new ListTaskPushNotificationConfigParams(MINIMAL_TASK.id())); ListTaskPushNotificationConfigResponse listResponse = handler.listPushNotificationConfig(listRequest, callContext); @@ -1420,7 +1420,7 @@ public void testListPushNotificationConfigTaskNotFound() { }; ListTaskPushNotificationConfigRequest listRequest - = new ListTaskPushNotificationConfigRequest("111", new ListTaskPushNotificationConfigParams(MINIMAL_TASK.getId())); + = new ListTaskPushNotificationConfigRequest("111", new ListTaskPushNotificationConfigParams(MINIMAL_TASK.id())); ListTaskPushNotificationConfigResponse listResponse = handler.listPushNotificationConfig(listRequest, callContext); @@ -1439,15 +1439,15 @@ public void testDeletePushNotificationConfig() { TaskPushNotificationConfig taskPushConfig = new TaskPushNotificationConfig( - MINIMAL_TASK.getId(), PushNotificationConfig.builder() + MINIMAL_TASK.id(), PushNotificationConfig.builder() .url("http://example.com") - .id(MINIMAL_TASK.getId()) + .id(MINIMAL_TASK.id()) .build(), "tenant"); SetTaskPushNotificationConfigRequest request = new SetTaskPushNotificationConfigRequest("1", taskPushConfig); handler.setPushNotificationConfig(request, callContext); DeleteTaskPushNotificationConfigRequest deleteRequest - = new DeleteTaskPushNotificationConfigRequest("111", new DeleteTaskPushNotificationConfigParams(MINIMAL_TASK.getId(), MINIMAL_TASK.getId())); + = new DeleteTaskPushNotificationConfigRequest("111", new DeleteTaskPushNotificationConfigParams(MINIMAL_TASK.id(), MINIMAL_TASK.id())); DeleteTaskPushNotificationConfigResponse deleteResponse = handler.deletePushNotificationConfig(deleteRequest, callContext); @@ -1467,15 +1467,15 @@ public void testDeletePushNotificationConfigNotSupported() { TaskPushNotificationConfig taskPushConfig = new TaskPushNotificationConfig( - MINIMAL_TASK.getId(), PushNotificationConfig.builder() + MINIMAL_TASK.id(), PushNotificationConfig.builder() .url("http://example.com") - .id(MINIMAL_TASK.getId()) + .id(MINIMAL_TASK.id()) .build(), "tenant"); SetTaskPushNotificationConfigRequest request = new SetTaskPushNotificationConfigRequest("1", taskPushConfig); handler.setPushNotificationConfig(request, callContext); DeleteTaskPushNotificationConfigRequest deleteRequest - = new DeleteTaskPushNotificationConfigRequest("111", new DeleteTaskPushNotificationConfigParams(MINIMAL_TASK.getId(), MINIMAL_TASK.getId())); + = new DeleteTaskPushNotificationConfigRequest("111", new DeleteTaskPushNotificationConfigParams(MINIMAL_TASK.id(), MINIMAL_TASK.id())); DeleteTaskPushNotificationConfigResponse deleteResponse = handler.deletePushNotificationConfig(deleteRequest, callContext); @@ -1496,15 +1496,15 @@ public void testDeletePushNotificationConfigNoPushConfigStore() { TaskPushNotificationConfig taskPushConfig = new TaskPushNotificationConfig( - MINIMAL_TASK.getId(), PushNotificationConfig.builder() + MINIMAL_TASK.id(), PushNotificationConfig.builder() .url("http://example.com") - .id(MINIMAL_TASK.getId()) + .id(MINIMAL_TASK.id()) .build(), "tenant"); SetTaskPushNotificationConfigRequest request = new SetTaskPushNotificationConfigRequest("1", taskPushConfig); handler.setPushNotificationConfig(request, callContext); DeleteTaskPushNotificationConfigRequest deleteRequest - = new DeleteTaskPushNotificationConfigRequest("111", new DeleteTaskPushNotificationConfigParams(MINIMAL_TASK.getId(), MINIMAL_TASK.getId())); + = new DeleteTaskPushNotificationConfigRequest("111", new DeleteTaskPushNotificationConfigParams(MINIMAL_TASK.id(), MINIMAL_TASK.id())); DeleteTaskPushNotificationConfigResponse deleteResponse = handler.deletePushNotificationConfig(deleteRequest, callContext); @@ -1544,8 +1544,8 @@ public void testStreamingDoesNotBlockMainThread() throws Exception { }; Message message = Message.builder(MESSAGE) - .taskId(MINIMAL_TASK.getId()) - .contextId(MINIMAL_TASK.getContextId()) + .taskId(MINIMAL_TASK.id()) + .contextId(MINIMAL_TASK.contextId()) .build(); SendStreamingMessageRequest request = new SendStreamingMessageRequest("1", new MessageSendParams(message, null, null)); diff --git a/transport/rest/src/test/java/io/a2a/transport/rest/handler/RestHandlerTest.java b/transport/rest/src/test/java/io/a2a/transport/rest/handler/RestHandlerTest.java index fd6ceaf8e..d4b326f17 100644 --- a/transport/rest/src/test/java/io/a2a/transport/rest/handler/RestHandlerTest.java +++ b/transport/rest/src/test/java/io/a2a/transport/rest/handler/RestHandlerTest.java @@ -26,17 +26,17 @@ public void testGetTaskSuccess() { RestHandler handler = new RestHandler(CARD, requestHandler, internalExecutor); taskStore.save(MINIMAL_TASK); - RestHandler.HTTPRestResponse response = handler.getTask(MINIMAL_TASK.getId(), 0, "", callContext); + RestHandler.HTTPRestResponse response = handler.getTask(MINIMAL_TASK.id(), 0, "", callContext); Assertions.assertEquals(200, response.getStatusCode()); Assertions.assertEquals("application/json", response.getContentType()); - Assertions.assertTrue(response.getBody().contains(MINIMAL_TASK.getId())); + Assertions.assertTrue(response.getBody().contains(MINIMAL_TASK.id())); - response = handler.getTask(MINIMAL_TASK.getId(),2 , "",callContext); + response = handler.getTask(MINIMAL_TASK.id(),2 , "",callContext); Assertions.assertEquals(200, response.getStatusCode()); Assertions.assertEquals("application/json", response.getContentType()); - Assertions.assertTrue(response.getBody().contains(MINIMAL_TASK.getId())); + Assertions.assertTrue(response.getBody().contains(MINIMAL_TASK.id())); } @Test @@ -142,11 +142,11 @@ public void testCancelTaskSuccess() { taskUpdater.cancel(); }; - RestHandler.HTTPRestResponse response = handler.cancelTask(MINIMAL_TASK.getId(), "", callContext); + RestHandler.HTTPRestResponse response = handler.cancelTask(MINIMAL_TASK.id(), "", callContext); Assertions.assertEquals(200, response.getStatusCode()); Assertions.assertEquals("application/json", response.getContentType()); - Assertions.assertTrue(response.getBody().contains(MINIMAL_TASK.getId())); + Assertions.assertTrue(response.getBody().contains(MINIMAL_TASK.id())); } @Test @@ -230,9 +230,9 @@ public void testPushNotificationConfigSuccess() { } } } - }""".formatted(MINIMAL_TASK.getId(), MINIMAL_TASK.getId()); + }""".formatted(MINIMAL_TASK.id(), MINIMAL_TASK.id()); - RestHandler.HTTPRestResponse response = handler.setTaskPushNotificationConfiguration( MINIMAL_TASK.getId(), requestBody, "", callContext); + RestHandler.HTTPRestResponse response = handler.setTaskPushNotificationConfiguration( MINIMAL_TASK.id(), requestBody, "", callContext); Assertions.assertEquals(201, response.getStatusCode(), response.toString()); Assertions.assertEquals("application/json", response.getContentType()); @@ -251,9 +251,9 @@ public void testPushNotificationConfigNotSupported() { "url": "http://example.com" } } - """.formatted(MINIMAL_TASK.getId()); + """.formatted(MINIMAL_TASK.id()); - RestHandler.HTTPRestResponse response = handler.setTaskPushNotificationConfiguration(MINIMAL_TASK.getId(), requestBody, "", callContext); + RestHandler.HTTPRestResponse response = handler.setTaskPushNotificationConfiguration(MINIMAL_TASK.id(), requestBody, "", callContext); Assertions.assertEquals(501, response.getStatusCode()); Assertions.assertTrue(response.getBody().contains("PushNotificationNotSupportedError")); @@ -278,12 +278,12 @@ public void testGetPushNotificationConfig() { } } } - }""".formatted(MINIMAL_TASK.getId(), MINIMAL_TASK.getId()); - RestHandler.HTTPRestResponse response = handler.setTaskPushNotificationConfiguration(MINIMAL_TASK.getId(), createRequestBody, "", callContext); + }""".formatted(MINIMAL_TASK.id(), MINIMAL_TASK.id()); + RestHandler.HTTPRestResponse response = handler.setTaskPushNotificationConfiguration(MINIMAL_TASK.id(), createRequestBody, "", callContext); Assertions.assertEquals(201, response.getStatusCode(), response.toString()); Assertions.assertEquals("application/json", response.getContentType()); // Now get it - response = handler.getTaskPushNotificationConfiguration(MINIMAL_TASK.getId(), "default-config-id", "", callContext); + response = handler.getTaskPushNotificationConfiguration(MINIMAL_TASK.id(), "default-config-id", "", callContext); Assertions.assertEquals(200, response.getStatusCode(), response.toString()); Assertions.assertEquals("application/json", response.getContentType()); } @@ -292,7 +292,7 @@ public void testGetPushNotificationConfig() { public void testDeletePushNotificationConfig() { RestHandler handler = new RestHandler(CARD, requestHandler, internalExecutor); taskStore.save(MINIMAL_TASK); - RestHandler.HTTPRestResponse response = handler.deleteTaskPushNotificationConfiguration(MINIMAL_TASK.getId(), "default-config-id", "", callContext); + RestHandler.HTTPRestResponse response = handler.deleteTaskPushNotificationConfiguration(MINIMAL_TASK.id(), "default-config-id", "", callContext); Assertions.assertEquals(204, response.getStatusCode()); } @@ -301,7 +301,7 @@ public void testListPushNotificationConfigs() { RestHandler handler = new RestHandler(CARD, requestHandler, internalExecutor); taskStore.save(MINIMAL_TASK); - RestHandler.HTTPRestResponse response = handler.listTaskPushNotificationConfigurations(MINIMAL_TASK.getId(), "", callContext); + RestHandler.HTTPRestResponse response = handler.listTaskPushNotificationConfigurations(MINIMAL_TASK.id(), "", callContext); Assertions.assertEquals(200, response.getStatusCode()); Assertions.assertEquals("application/json", response.getContentType());