Skip to content

Commit f820ca2

Browse files
committed
Fixing NullSpecify
Signed-off-by: Emmanuel Hugonnet <[email protected]>
1 parent 058d607 commit f820ca2

File tree

6 files changed

+37
-9
lines changed

6 files changed

+37
-9
lines changed

client/transport/jsonrpc/src/test/java/io/a2a/client/transport/jsonrpc/JsonMessages.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ public class JsonMessages {
186186
static final String SEND_MESSAGE_TEST_RESPONSE = """
187187
{
188188
"jsonrpc":"2.0",
189+
"id": "cd4c76de-d54c-436c-8b9f-4c2703648d64",
189190
"result":{
190191
"task":{
191192
"id":"de38c76d-d54c-436c-8b9f-4c2703648d64",
@@ -293,6 +294,7 @@ public class JsonMessages {
293294
static final String SEND_MESSAGE_ERROR_TEST_RESPONSE = """
294295
{
295296
"jsonrpc": "2.0",
297+
"id": "cd4c76de-d54c-436c-8b9f-4c2703648d64",
296298
"error": {
297299
"code": -32702,
298300
"message": "Invalid parameters",
@@ -314,6 +316,7 @@ public class JsonMessages {
314316
static final String GET_TASK_TEST_RESPONSE = """
315317
{
316318
"jsonrpc":"2.0",
319+
"id": "cd4c76de-d54c-436c-8b9f-4c2703648d64",
317320
"result":{
318321
"id":"de38c76d-d54c-436c-8b9f-4c2703648d64",
319322
"contextId":"c295ea44-7543-4f78-b524-7a38915ad6e4",
@@ -373,6 +376,7 @@ public class JsonMessages {
373376
static final String CANCEL_TASK_TEST_RESPONSE = """
374377
{
375378
"jsonrpc":"2.0",
379+
"id": "cd4c76de-d54c-436c-8b9f-4c2703648d64",
376380
"result":{
377381
"id":"de38c76d-d54c-436c-8b9f-4c2703648d64",
378382
"contextId":"c295ea44-7543-4f78-b524-7a38915ad6e4",
@@ -398,6 +402,7 @@ public class JsonMessages {
398402
static final String GET_TASK_PUSH_NOTIFICATION_CONFIG_TEST_RESPONSE = """
399403
{
400404
"jsonrpc": "2.0",
405+
"id": "cd4c76de-d54c-436c-8b9f-4c2703648d64",
401406
"result": {
402407
"name": "tasks/de38c76d-d54c-436c-8b9f-4c2703648d64/pushNotificationConfigs/c295ea44-7543-4f78-b524-7a38915ad6e4",
403408
"pushNotificationConfig": {
@@ -434,6 +439,7 @@ public class JsonMessages {
434439
static final String SET_TASK_PUSH_NOTIFICATION_CONFIG_TEST_RESPONSE = """
435440
{
436441
"jsonrpc": "2.0",
442+
"id": "cd4c76de-d54c-436c-8b9f-4c2703648d64",
437443
"result": {
438444
"name":"tasks/de38c76d-d54c-436c-8b9f-4c2703648d64/pushNotificationConfigs/c295ea44-7543-4f78-b524-7a38915ad6e4",
439445
"pushNotificationConfig": {
@@ -485,6 +491,7 @@ public class JsonMessages {
485491
static final String SEND_MESSAGE_WITH_FILE_PART_TEST_RESPONSE = """
486492
{
487493
"jsonrpc":"2.0",
494+
"id": "cd4c76de-d54c-436c-8b9f-4c2703648d64",
488495
"result":{
489496
"task":{
490497
"id":"de38c76d-d54c-436c-8b9f-4c2703648d64",
@@ -553,6 +560,7 @@ public class JsonMessages {
553560
static final String SEND_MESSAGE_WITH_DATA_PART_TEST_RESPONSE = """
554561
{
555562
"jsonrpc":"2.0",
563+
"id": "cd4c76de-d54c-436c-8b9f-4c2703648d64",
556564
"result":{
557565
"task":{
558566
"id":"de38c76d-d54c-436c-8b9f-4c2703648d64",
@@ -627,6 +635,7 @@ public class JsonMessages {
627635
static final String SEND_MESSAGE_WITH_MIXED_PARTS_TEST_RESPONSE = """
628636
{
629637
"jsonrpc":"2.0",
638+
"id": "cd4c76de-d54c-436c-8b9f-4c2703648d64",
630639
"result":{
631640
"task":{
632641
"id":"de38c76d-d54c-436c-8b9f-4c2703648d64",

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272

7373
<!-- Redirect test output to file -->
7474
<maven.test.redirectTestOutputToFile>true</maven.test.redirectTestOutputToFile>
75+
<quarkus.jvm.args>--add-opens=java.base/java.lang=ALL-UNNAMED</quarkus.jvm.args>
7576

7677
<!-- release properties -->
7778
<release.auto.publish>false</release.auto.publish>
@@ -390,6 +391,9 @@
390391
<artifactId>quarkus-maven-plugin</artifactId>
391392
<extensions>true</extensions>
392393
<version>${quarkus.platform.version}</version>
394+
<configuration>
395+
<jvmArgs>${quarkus.jvm.args}</jvmArgs>
396+
</configuration>
393397
</plugin>
394398
<plugin>
395399
<groupId>org.sonatype.central</groupId>
@@ -535,6 +539,7 @@
535539
<error-prone.version>2.42.0</error-prone.version>
536540
<nullaway.version>0.12.10</nullaway.version>
537541
<error-prone.flag></error-prone.flag>
542+
<quarkus.jvm.args></quarkus.jvm.args>
538543
</properties>
539544
</profile>
540545
</profiles>

reference/jsonrpc/src/main/java/io/a2a/server/apps/quarkus/A2AServerRoutes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ public void invokeJSONRPCHandler(@Body String body, RoutingContext rc) {
145145

146146
private JSONRPCErrorResponse handleError(JsonProcessingException exception) {
147147
Object id = null;
148-
JSONRPCError jsonRpcError = null;
148+
JSONRPCError jsonRpcError;
149149
if (exception.getCause() instanceof JsonParseException) {
150150
jsonRpcError = new JSONParseError();
151151
} else if (exception instanceof JsonEOFException) {

reference/jsonrpc/src/test/java/io/a2a/server/apps/quarkus/A2AServerRoutesTest.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import static org.mockito.Mockito.when;
1111

1212
import java.util.Collections;
13-
import java.util.List;
1413
import java.util.concurrent.Executor;
1514
import java.util.concurrent.Flow;
1615

@@ -32,7 +31,6 @@
3231
import io.a2a.spec.GetTaskRequest;
3332
import io.a2a.spec.PushNotificationConfig;
3433
import io.a2a.spec.GetTaskResponse;
35-
import io.a2a.spec.ListTaskPushNotificationConfigParams;
3634
import io.a2a.spec.ListTaskPushNotificationConfigRequest;
3735
import io.a2a.spec.ListTaskPushNotificationConfigResponse;
3836
import io.a2a.spec.SendMessageRequest;
@@ -111,6 +109,7 @@ public void testSendMessage_MethodNameSetInContext() {
111109
String jsonRpcRequest = """
112110
{
113111
"jsonrpc": "2.0",
112+
"id": "cd4c76de-d54c-436c-8b9f-4c2703648d64",
114113
"method": "SendMessage",
115114
"params": {
116115
"message": {
@@ -160,6 +159,7 @@ public void testSendStreamingMessage_MethodNameSetInContext() {
160159
String jsonRpcRequest = """
161160
{
162161
"jsonrpc": "2.0",
162+
"id": "cd4c76de-d54c-436c-8b9f-4c2703648d64",
163163
"method": "SendStreamingMessage",
164164
"params": {
165165
"message": {
@@ -205,6 +205,7 @@ public void testGetTask_MethodNameSetInContext() {
205205
String jsonRpcRequest = """
206206
{
207207
"jsonrpc": "2.0",
208+
"id": "cd4c76de-d54c-436c-8b9f-4c2703648d64",
208209
"method": "GetTask",
209210
"params": {
210211
"name": "tasks/de38c76d-d54c-436c-8b9f-4c2703648d64",
@@ -241,6 +242,7 @@ public void testCancelTask_MethodNameSetInContext() {
241242
String jsonRpcRequest = """
242243
{
243244
"jsonrpc": "2.0",
245+
"id": "cd4c76de-d54c-436c-8b9f-4c2703648d64",
244246
"method": "CancelTask",
245247
"params": {
246248
"name": "tasks/de38c76d-d54c-436c-8b9f-4c2703648d64"
@@ -276,6 +278,7 @@ public void testTaskResubscription_MethodNameSetInContext() {
276278
String jsonRpcRequest = """
277279
{
278280
"jsonrpc": "2.0",
281+
"id": "cd4c76de-d54c-436c-8b9f-4c2703648d64",
279282
"method": "SubscribeToTask",
280283
"params": {
281284
"name": "tasks/de38c76d-d54c-436c-8b9f-4c2703648d64"
@@ -307,6 +310,7 @@ public void testSetTaskPushNotificationConfig_MethodNameSetInContext() {
307310
String jsonRpcRequest = """
308311
{
309312
"jsonrpc": "2.0",
313+
"id": "cd4c76de-d54c-436c-8b9f-4c2703648d64",
310314
"method": "SetTaskPushNotificationConfig",
311315
"params": {
312316
"parent": "tasks/de38c76d-d54c-436c-8b9f-4c2703648d64",
@@ -356,6 +360,7 @@ public void testGetTaskPushNotificationConfig_MethodNameSetInContext() {
356360
String jsonRpcRequest = """
357361
{
358362
"jsonrpc": "2.0",
363+
"id": "cd4c76de-d54c-436c-8b9f-4c2703648d64",
359364
"method": "GetTaskPushNotificationConfig",
360365
"params": {
361366
"name": "tasks/de38c76d-d54c-436c-8b9f-4c2703648d64/pushNotificationConfigs/config-456"
@@ -394,6 +399,7 @@ public void testListTaskPushNotificationConfig_MethodNameSetInContext() {
394399
String jsonRpcRequest = """
395400
{
396401
"jsonrpc": "2.0",
402+
"id": "cd4c76de-d54c-436c-8b9f-4c2703648d64",
397403
"method": "ListTaskPushNotificationConfig",
398404
"params": {
399405
"parent": "tasks/de38c76d-d54c-436c-8b9f-4c2703648d64"
@@ -432,6 +438,7 @@ public void testDeleteTaskPushNotificationConfig_MethodNameSetInContext() {
432438
String jsonRpcRequest = """
433439
{
434440
"jsonrpc": "2.0",
441+
"id": "cd4c76de-d54c-436c-8b9f-4c2703648d64",
435442
"method": "DeleteTaskPushNotificationConfig",
436443
"params": {
437444
"name": "tasks/de38c76d-d54c-436c-8b9f-4c2703648d64/pushNotificationConfigs/config-456"
@@ -460,7 +467,7 @@ public void testDeleteTaskPushNotificationConfig_MethodNameSetInContext() {
460467
@Test
461468
public void testGetAuthenticatedExtendedCard_MethodNameSetInContext() {
462469
// Arrange
463-
String jsonRpcRequest = "{\"jsonrpc\":\"2.0\",\"method\":\"" + GetAuthenticatedExtendedCardRequest.METHOD
470+
String jsonRpcRequest = "{\"jsonrpc\":\"2.0\",\"id\":\"5\",\"method\":\"" + GetAuthenticatedExtendedCardRequest.METHOD
464471
+ "\",\"id\":1}";
465472
when(mockRequestBody.asString()).thenReturn(jsonRpcRequest);
466473

spec-grpc/src/main/java/io/a2a/grpc/utils/JSONRPCUtils.java

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import java.util.UUID;
5656
import java.util.logging.Level;
5757
import java.util.logging.Logger;
58+
import org.jspecify.annotations.Nullable;
5859

5960
public class JSONRPCUtils {
6061

@@ -309,7 +310,8 @@ protected static String getAndValidateJsonrpc(JsonObject jsonRpc) throws JsonMap
309310
return jsonRpc.get("jsonrpc").getAsString();
310311
}
311312

312-
protected static Object getIdIfPossible(JsonObject jsonRpc) {
313+
protected static @Nullable
314+
Object getIdIfPossible(JsonObject jsonRpc) {
313315
try {
314316
return getAndValidateId(jsonRpc);
315317
} catch (JsonProcessingException e) {
@@ -331,10 +333,13 @@ protected static Object getAndValidateId(JsonObject jsonRpc) throws JsonProcessi
331333
throw new JsonMappingException(null, "Invalid id");
332334
}
333335
}
336+
if (id == null) {
337+
throw new JsonMappingException(null, "Invalid id");
338+
}
334339
return id;
335340
}
336341

337-
public static String toJsonRPCRequest(String requestId, String method, com.google.protobuf.MessageOrBuilder builder) {
342+
public static String toJsonRPCRequest(@Nullable String requestId, String method, com.google.protobuf.@Nullable MessageOrBuilder payload) {
338343
try (StringWriter result = new StringWriter(); JsonWriter output = GSON.newJsonWriter(result)) {
339344
output.beginObject();
340345
output.name("jsonrpc").value("2.0");
@@ -346,8 +351,10 @@ public static String toJsonRPCRequest(String requestId, String method, com.googl
346351
if (method != null) {
347352
output.name("method").value(method);
348353
}
349-
String resultValue = JsonFormat.printer().omittingInsignificantWhitespace().print(builder);
350-
output.name("params").jsonValue(resultValue);
354+
if (payload != null) {
355+
String resultValue = JsonFormat.printer().omittingInsignificantWhitespace().print(payload);
356+
output.name("params").jsonValue(resultValue);
357+
}
351358
output.endObject();
352359
return result.toString();
353360
} catch (IOException ex) {

tests/server-common/src/test/java/io/a2a/server/apps/common/AbstractA2AServerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1416,7 +1416,7 @@ public void testInvalidJSONRPCRequestNonExistentMethod() {
14161416
"JSONRPC-specific test");
14171417

14181418
String invalidRequest = """
1419-
{"jsonrpc": "2.0", "method" : "nonexistent/method", "params": {}}
1419+
{"jsonrpc": "2.0", "id":"5", "method" : "nonexistent/method", "params": {}}
14201420
""";
14211421
JSONRPCErrorResponse response = given()
14221422
.contentType(MediaType.APPLICATION_JSON)

0 commit comments

Comments
 (0)