Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;
import org.jspecify.annotations.Nullable;

/**
* Base class for dynamically discovering and verifying all classes in a BOM can be loaded.
Expand Down Expand Up @@ -180,7 +181,7 @@ private boolean isForbidden(String relativePath) {
return forbiddenPaths.stream().anyMatch(relativePath::startsWith);
}

private static String extractClassName(Path javaFile) throws IOException {
private static @Nullable String extractClassName(Path javaFile) throws IOException {
// Extract simple class name from filename
String fileName = javaFile.getFileName().toString();
if (!fileName.endsWith(".java")) {
Expand All @@ -198,11 +199,9 @@ private static String extractClassName(Path javaFile) throws IOException {
.findFirst()
.orElse(null);
}

if (packageName != null) {
return packageName + "." + simpleClassName;
}

return null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
@NullMarked
package io.a2a.bom.test;

import org.jspecify.annotations.NullMarked;

5 changes: 5 additions & 0 deletions common/src/main/java/io/a2a/common/package-info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
@NullMarked
package io.a2a.common;

import org.jspecify.annotations.NullMarked;

5 changes: 5 additions & 0 deletions common/src/main/java/io/a2a/util/package-info.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
@NullMarked
package io.a2a.util;

import org.jspecify.annotations.NullMarked;

4 changes: 3 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
<error-prone.version>2.45.0</error-prone.version>
<nullaway.version>0.12.14</nullaway.version>
<error-prone.flag>-XDaddTypeAnnotationsToSymbol=true</error-prone.flag>
<nullaway.args>-Xplugin:ErrorProne -XepDisableAllChecks -Xep:NullAway:ERROR -Xep:RequireExplicitNullMarking:WARN -XepOpt:NullAway:ExhaustiveOverride=true -XepOpt:NullAway:OnlyNullMarked=true -XepOpt:NullAway:JSpecifyMode=true -XepExcludedPaths:.*/src/test/.* -XepDisableWarningsInGeneratedCode</nullaway.args>

<!-- Redirect test output to file -->
<maven.test.redirectTestOutputToFile>true</maven.test.redirectTestOutputToFile>
Expand Down Expand Up @@ -342,7 +343,7 @@
<arg>--should-stop=ifError=FLOW</arg>
<arg>-parameters</arg>
<arg>${error-prone.flag}</arg>
<arg>-Xplugin:ErrorProne -XepDisableAllChecks -Xep:NullAway:ERROR -XepOpt:NullAway:OnlyNullMarked=true -XepOpt:NullAway:JSpecifyMode=true -XepExcludedPaths:.*/src/test/.* -XepDisableWarningsInGeneratedCode</arg>
<arg>${nullaway.args}</arg>
</compilerArgs>
<annotationProcessorPaths>
<path>
Expand Down Expand Up @@ -554,6 +555,7 @@
<error-prone.version>2.42.0</error-prone.version>
<nullaway.version>0.12.10</nullaway.version>
<error-prone.flag></error-prone.flag>
<nullaway.args>-Xplugin:ErrorProne -XepDisableAllChecks -Xep:NullAway:ERROR -XepOpt:NullAway:OnlyNullMarked=true -XepOpt:NullAway:JSpecifyMode=true -XepExcludedPaths:.*/src/test/.* -XepDisableWarningsInGeneratedCode</nullaway.args>
<quarkus.jvm.args></quarkus.jvm.args>
</properties>
</profile>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -369,12 +369,11 @@ public boolean isAuthenticated() {
}

@Override
public @Nullable
String getUsername() {
if (rc.user() != null) {
public String getUsername() {
if (rc.user() != null && rc.user().subject() != null) {
return rc.user().subject();
}
return null;
return "";
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import java.util.UUID;
import java.util.stream.Collectors;

import org.jspecify.annotations.Nullable;

import io.a2a.server.ServerCallContext;
import io.a2a.spec.InvalidParamsError;
import io.a2a.spec.Message;
Expand All @@ -17,20 +19,20 @@

public class RequestContext {

private MessageSendParams params;
private String taskId;
private String contextId;
private Task task;
private @Nullable MessageSendParams params;
private @Nullable String taskId;
private @Nullable String contextId;
private @Nullable Task task;
private List<Task> relatedTasks;
private final ServerCallContext callContext;
private final @Nullable ServerCallContext callContext;

public RequestContext(
MessageSendParams params,
String taskId,
String contextId,
Task task,
List<Task> relatedTasks,
ServerCallContext callContext) throws InvalidParamsError {
@Nullable MessageSendParams params,
@Nullable String taskId,
@Nullable String contextId,
@Nullable Task task,
@Nullable List<Task> relatedTasks,
@Nullable ServerCallContext callContext) throws InvalidParamsError {
this.params = params;
this.taskId = taskId;
this.contextId = contextId;
Expand All @@ -53,35 +55,35 @@ public RequestContext(
}
}

public MessageSendParams getParams() {
public @Nullable MessageSendParams getParams() {
return params;
}

public String getTaskId() {
public @Nullable String getTaskId() {
return taskId;
}

public String getContextId() {
public @Nullable String getContextId() {
return contextId;
}

public Task getTask() {
public @Nullable Task getTask() {
return task;
}

public List<Task> getRelatedTasks() {
return Collections.unmodifiableList(relatedTasks);
}

public Message getMessage() {
public @Nullable Message getMessage() {
return params != null ? params.message() : null;
}

public MessageSendConfiguration getConfiguration() {
public @Nullable MessageSendConfiguration getConfiguration() {
return params != null ? params.configuration() : null;
}

public ServerCallContext getCallContext() {
public @Nullable ServerCallContext getCallContext() {
return callContext;
}

Expand Down Expand Up @@ -137,64 +139,64 @@ private List<String> getTextParts(List<Part<?>> parts) {
}

public static class Builder {
private MessageSendParams params;
private String taskId;
private String contextId;
private Task task;
private List<Task> relatedTasks;
private ServerCallContext serverCallContext;

public Builder setParams(MessageSendParams params) {
private @Nullable MessageSendParams params;
private @Nullable String taskId;
private @Nullable String contextId;
private @Nullable Task task;
private @Nullable List<Task> relatedTasks;
private @Nullable ServerCallContext serverCallContext;

public Builder setParams(@Nullable MessageSendParams params) {
this.params = params;
return this;
}

public Builder setTaskId(String taskId) {
public Builder setTaskId(@Nullable String taskId) {
this.taskId = taskId;
return this;
}

public Builder setContextId(String contextId) {
public Builder setContextId(@Nullable String contextId) {
this.contextId = contextId;
return this;
}

public Builder setTask(Task task) {
public Builder setTask(@Nullable Task task) {
this.task = task;
return this;
}

public Builder setRelatedTasks(List<Task> relatedTasks) {
public Builder setRelatedTasks(@Nullable List<Task> relatedTasks) {
this.relatedTasks = relatedTasks;
return this;
}

public Builder setServerCallContext(ServerCallContext serverCallContext) {
public Builder setServerCallContext(@Nullable ServerCallContext serverCallContext) {
this.serverCallContext = serverCallContext;
return this;
}

public MessageSendParams getParams() {
public @Nullable MessageSendParams getParams() {
return params;
}

public String getTaskId() {
public @Nullable String getTaskId() {
return taskId;
}

public String getContextId() {
public @Nullable String getContextId() {
return contextId;
}

public Task getTask() {
public @Nullable Task getTask() {
return task;
}

public List<Task> getRelatedTasks() {
public @Nullable List<Task> getRelatedTasks() {
return relatedTasks;
}

public ServerCallContext getServerCallContext() {
public @Nullable ServerCallContext getServerCallContext() {
return serverCallContext;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NullMarked
package io.a2a.server.agentexecution;

import org.jspecify.annotations.NullMarked;
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NullMarked
package io.a2a.server.auth;

import org.jspecify.annotations.NullMarked;
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
@NullMarked
package io.a2a.server.config;

import org.jspecify.annotations.NullMarked;
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

import org.jspecify.annotations.Nullable;

public abstract class EnhancedRunnable implements Runnable {
private volatile Throwable error;
private volatile @Nullable Throwable error;
private final List<DoneCallback> doneCallbacks = new CopyOnWriteArrayList<>();

public Throwable getError() {
public @Nullable Throwable getError() {
return error;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import java.util.concurrent.Flow;

import org.jspecify.annotations.Nullable;

import io.a2a.spec.A2AServerException;
import io.a2a.spec.Event;
import io.a2a.spec.Message;
Expand All @@ -16,7 +18,7 @@
public class EventConsumer {
private static final Logger LOGGER = LoggerFactory.getLogger(EventConsumer.class);
private final EventQueue queue;
private Throwable error;
private volatile @Nullable Throwable error;

private static final String ERROR_MSG = "Agent did not return any response";
private static final int NO_WAIT = -1;
Expand Down
18 changes: 10 additions & 8 deletions server-common/src/main/java/io/a2a/server/events/EventQueue.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;

import org.jspecify.annotations.Nullable;

import io.a2a.server.tasks.TaskStateProvider;
import io.a2a.spec.Event;
import org.slf4j.Logger;
Expand Down Expand Up @@ -49,10 +51,10 @@ static EventQueueBuilder builder() {

public static class EventQueueBuilder {
private int queueSize = DEFAULT_QUEUE_SIZE;
private EventEnqueueHook hook;
private String taskId;
private @Nullable EventEnqueueHook hook;
private @Nullable String taskId;
private List<Runnable> onCloseCallbacks = new java.util.ArrayList<>();
private TaskStateProvider taskStateProvider;
private @Nullable TaskStateProvider taskStateProvider;

public EventQueueBuilder queueSize(int queueSize) {
this.queueSize = queueSize;
Expand Down Expand Up @@ -132,7 +134,7 @@ public void enqueueItem(EventQueueItem item) {
* @return the EventQueueItem, or null if timeout occurs
* @throws EventQueueClosedException if the queue is closed and empty
*/
public EventQueueItem dequeueEventItem(int waitMilliSeconds) throws EventQueueClosedException {
public @Nullable EventQueueItem dequeueEventItem(int waitMilliSeconds) throws EventQueueClosedException {
if (closed && queue.isEmpty()) {
LOGGER.debug("Queue is closed, and empty. Sending termination message. {}", this);
throw new EventQueueClosedException();
Expand Down Expand Up @@ -218,10 +220,10 @@ static class MainQueue extends EventQueue {
private final List<ChildQueue> children = new CopyOnWriteArrayList<>();
private final CountDownLatch pollingStartedLatch = new CountDownLatch(1);
private final AtomicBoolean pollingStarted = new AtomicBoolean(false);
private final EventEnqueueHook enqueueHook;
private final String taskId;
private final @Nullable EventEnqueueHook enqueueHook;
private final @Nullable String taskId;
private final List<Runnable> onCloseCallbacks;
private final TaskStateProvider taskStateProvider;
private final @Nullable TaskStateProvider taskStateProvider;

MainQueue() {
super();
Expand Down Expand Up @@ -255,7 +257,7 @@ static class MainQueue extends EventQueue {
this.taskStateProvider = null;
}

MainQueue(int queueSize, EventEnqueueHook hook, String taskId, List<Runnable> onCloseCallbacks, TaskStateProvider taskStateProvider) {
MainQueue(int queueSize, @Nullable EventEnqueueHook hook, @Nullable String taskId, List<Runnable> onCloseCallbacks, @Nullable TaskStateProvider taskStateProvider) {
super(queueSize);
this.enqueueHook = hook;
this.taskId = taskId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;

import org.jspecify.annotations.Nullable;

import io.a2a.server.tasks.TaskStateProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -39,12 +41,12 @@ public void add(String taskId, EventQueue queue) {
}

@Override
public EventQueue get(String taskId) {
public @Nullable EventQueue get(String taskId) {
return queues.get(taskId);
}

@Override
public EventQueue tap(String taskId) {
public @Nullable EventQueue tap(String taskId) {
EventQueue queue = queues.get(taskId);
return queue == null ? null : queue.tap();
}
Expand Down Expand Up @@ -92,6 +94,9 @@ public EventQueue createOrTap(String taskId) {
}

EventQueue main = existing == null ? newQueue : existing;
if (main == null) {
throw new IllegalStateException("Failed to create or retrieve queue for task " + taskId);
}
EventQueue result = main.tap(); // Always return ChildQueue

if (existing == null) {
Expand Down
Loading