Skip to content

Commit 0672827

Browse files
committed
feat!: Remove hard dependency on MicroProfile Config from the core SDK
Default values will now be used by default. You can supply your own by providing a CDI bean with a higher priority. Also, there is a new 2a-java-sdk-microprofile-config with the previous MicroProfile Config capabilities. If used, this will allow MicroProfile Config configurations of the properties. The reference implementations use this new module
1 parent 870b82c commit 0672827

File tree

16 files changed

+395
-22
lines changed

16 files changed

+395
-22
lines changed

boms/extras/src/it/extras-usage-test/pom.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@
7474
<groupId>io.github.a2asdk</groupId>
7575
<artifactId>a2a-java-sdk-server-common</artifactId>
7676
</dependency>
77+
<dependency>
78+
<groupId>io.github.a2asdk</groupId>
79+
<artifactId>a2a-java-sdk-microprofile-config</artifactId>
80+
</dependency>
7781
<dependency>
7882
<groupId>io.github.a2asdk</groupId>
7983
<artifactId>a2a-java-sdk-client</artifactId>
@@ -102,6 +106,12 @@
102106
<groupId>io.github.a2asdk</groupId>
103107
<artifactId>a2a-java-sdk-transport-rest</artifactId>
104108
</dependency>
109+
110+
<!-- Third-party dependencies needed for integration classes -->
111+
<dependency>
112+
<groupId>org.eclipse.microprofile.config</groupId>
113+
<artifactId>microprofile-config-api</artifactId>
114+
</dependency>
105115
</dependencies>
106116

107117
<build>

boms/reference/src/it/reference-usage-test/pom.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@
6969
<groupId>io.github.a2asdk</groupId>
7070
<artifactId>a2a-java-sdk-server-common</artifactId>
7171
</dependency>
72+
<dependency>
73+
<groupId>io.github.a2asdk</groupId>
74+
<artifactId>a2a-java-sdk-microprofile-config</artifactId>
75+
</dependency>
7276
<dependency>
7377
<groupId>io.github.a2asdk</groupId>
7478
<artifactId>a2a-java-sdk-client</artifactId>
@@ -86,6 +90,12 @@
8690
<artifactId>a2a-java-sdk-transport-jsonrpc</artifactId>
8791
</dependency>
8892

93+
<!-- Third-party dependencies needed for integration classes -->
94+
<dependency>
95+
<groupId>org.eclipse.microprofile.config</groupId>
96+
<artifactId>microprofile-config-api</artifactId>
97+
</dependency>
98+
8999
<!-- Quarkus modules - should come from imported Quarkus BOM -->
90100
<dependency>
91101
<groupId>io.quarkus</groupId>

boms/sdk/pom.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,13 @@
5252
<version>${project.version}</version>
5353
</dependency>
5454

55+
<!-- Integration modules -->
56+
<dependency>
57+
<groupId>${project.groupId}</groupId>
58+
<artifactId>a2a-java-sdk-microprofile-config</artifactId>
59+
<version>${project.version}</version>
60+
</dependency>
61+
5562
<!-- Client modules -->
5663
<dependency>
5764
<groupId>${project.groupId}</groupId>

boms/sdk/src/it/sdk-usage-test/pom.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@
6161
<artifactId>a2a-java-sdk-server-common</artifactId>
6262
</dependency>
6363

64+
<!-- Integration modules -->
65+
<dependency>
66+
<groupId>io.github.a2asdk</groupId>
67+
<artifactId>a2a-java-sdk-microprofile-config</artifactId>
68+
</dependency>
69+
6470
<!-- Client modules -->
6571
<dependency>
6672
<groupId>io.github.a2asdk</groupId>
@@ -122,6 +128,10 @@
122128
<groupId>io.grpc</groupId>
123129
<artifactId>grpc-stub</artifactId>
124130
</dependency>
131+
<dependency>
132+
<groupId>org.eclipse.microprofile.config</groupId>
133+
<artifactId>microprofile-config-api</artifactId>
134+
</dependency>
125135
</dependencies>
126136

127137
<build>

extras/task-store-database-jpa/src/main/java/io/a2a/extras/taskstore/database/jpa/JpaDatabaseTaskStore.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import java.util.List;
88
import java.util.stream.Stream;
99

10+
import jakarta.annotation.PostConstruct;
1011
import jakarta.annotation.Priority;
1112
import jakarta.enterprise.context.ApplicationScoped;
1213
import jakarta.enterprise.event.Event;
@@ -19,14 +20,14 @@
1920

2021
import com.fasterxml.jackson.core.JsonProcessingException;
2122
import io.a2a.extras.common.events.TaskFinalizedEvent;
23+
import io.a2a.server.config.A2AConfigProvider;
2224
import io.a2a.server.tasks.TaskStateProvider;
2325
import io.a2a.server.tasks.TaskStore;
2426
import io.a2a.spec.Artifact;
2527
import io.a2a.spec.ListTasksParams;
2628
import io.a2a.spec.ListTasksResult;
2729
import io.a2a.spec.Message;
2830
import io.a2a.spec.Task;
29-
import org.eclipse.microprofile.config.inject.ConfigProperty;
3031
import org.slf4j.Logger;
3132
import org.slf4j.LoggerFactory;
3233

@@ -44,9 +45,24 @@ public class JpaDatabaseTaskStore implements TaskStore, TaskStateProvider {
4445
Event<TaskFinalizedEvent> taskFinalizedEvent;
4546

4647
@Inject
47-
@ConfigProperty(name = "a2a.replication.grace-period-seconds", defaultValue = "15")
48+
A2AConfigProvider configProvider;
49+
50+
/**
51+
* Grace period for task finalization in replicated scenarios (seconds).
52+
* After a task reaches a final state, this is the minimum time to wait before cleanup
53+
* to allow replicated events to arrive and be processed.
54+
* <p>
55+
* Property: {@code a2a.replication.grace-period-seconds}<br>
56+
* Default: 15<br>
57+
* Note: Property override requires a configurable {@link A2AConfigProvider} on the classpath.
58+
*/
4859
long gracePeriodSeconds;
4960

61+
@PostConstruct
62+
void initConfig() {
63+
gracePeriodSeconds = Long.parseLong(configProvider.getValue("a2a.replication.grace-period-seconds"));
64+
}
65+
5066
@Transactional
5167
@Override
5268
public void save(Task task) {
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# A2A JPA Database Task Store Default Configuration
2+
3+
# Grace period for task finalization in replicated scenarios (seconds)
4+
# After a task reaches a final state, this is the minimum time to wait before cleanup
5+
# to allow replicated events to arrive and be processed
6+
a2a.replication.grace-period-seconds=15
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?xml version="1.0"?>
2+
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"
3+
xmlns="http://maven.apache.org/POM/4.0.0"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
5+
<modelVersion>4.0.0</modelVersion>
6+
7+
<parent>
8+
<groupId>io.github.a2asdk</groupId>
9+
<artifactId>a2a-java-sdk-parent</artifactId>
10+
<version>0.4.0.Alpha1-SNAPSHOT</version>
11+
<relativePath>../../pom.xml</relativePath>
12+
</parent>
13+
<artifactId>a2a-java-sdk-microprofile-config</artifactId>
14+
15+
<packaging>jar</packaging>
16+
17+
<name>A2A Java SDK - MicroProfile Config Integration</name>
18+
<description>MicroProfile Config integration for A2A Java SDK - provides A2AConfigProvider implementation</description>
19+
20+
<dependencies>
21+
<dependency>
22+
<groupId>${project.groupId}</groupId>
23+
<artifactId>a2a-java-sdk-server-common</artifactId>
24+
</dependency>
25+
<dependency>
26+
<groupId>jakarta.enterprise</groupId>
27+
<artifactId>jakarta.enterprise.cdi-api</artifactId>
28+
</dependency>
29+
<dependency>
30+
<groupId>jakarta.inject</groupId>
31+
<artifactId>jakarta.inject-api</artifactId>
32+
</dependency>
33+
<dependency>
34+
<groupId>org.eclipse.microprofile.config</groupId>
35+
<artifactId>microprofile-config-api</artifactId>
36+
</dependency>
37+
<dependency>
38+
<groupId>org.slf4j</groupId>
39+
<artifactId>slf4j-api</artifactId>
40+
</dependency>
41+
</dependencies>
42+
</project>
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package io.a2a.integrations.microprofile;
2+
3+
import java.util.Optional;
4+
5+
import jakarta.enterprise.context.ApplicationScoped;
6+
import jakarta.enterprise.inject.Alternative;
7+
import jakarta.annotation.Priority;
8+
import jakarta.inject.Inject;
9+
10+
import io.a2a.server.config.A2AConfigProvider;
11+
import io.a2a.server.config.DefaultValuesConfigProvider;
12+
import org.eclipse.microprofile.config.Config;
13+
import org.slf4j.Logger;
14+
import org.slf4j.LoggerFactory;
15+
16+
/**
17+
* MicroProfile Config-based implementation of {@link A2AConfigProvider}.
18+
* <p>
19+
* This provider integrates with MicroProfile Config (used by Quarkus and other Jakarta EE runtimes)
20+
* to allow configuration via standard sources:
21+
* <ul>
22+
* <li>System properties (-D flags)</li>
23+
* <li>Environment variables</li>
24+
* <li>application.properties</li>
25+
* <li>Custom ConfigSources</li>
26+
* </ul>
27+
* <p>
28+
* Falls back to {@link DefaultValuesConfigProvider} when a configuration value is not found
29+
* in MicroProfile Config, ensuring that default values from {@code META-INF/a2a-defaults.properties}
30+
* are always available.
31+
* <p>
32+
* This provider is automatically enabled with {@code @Priority(50)}, but can be overridden by
33+
* custom providers with higher priority.
34+
* <p>
35+
* To use this provider, add the {@code a2a-java-sdk-microprofile-config} dependency to your project.
36+
*/
37+
@ApplicationScoped
38+
@Alternative
39+
@Priority(50)
40+
public class MicroProfileConfigProvider implements A2AConfigProvider {
41+
42+
private static final Logger LOGGER = LoggerFactory.getLogger(MicroProfileConfigProvider.class);
43+
44+
@Inject
45+
Config mpConfig;
46+
47+
@Inject
48+
DefaultValuesConfigProvider defaultValues;
49+
50+
@Override
51+
public String getValue(String name) {
52+
Optional<String> value = mpConfig.getOptionalValue(name, String.class);
53+
if (value.isPresent()) {
54+
LOGGER.trace("Config value '{}' = '{}' (from MicroProfile Config)", name, value.get());
55+
return value.get();
56+
}
57+
58+
// Fallback to defaults
59+
String defaultValue = defaultValues.getValue(name);
60+
LOGGER.trace("Config value '{}' = '{}' (from DefaultValuesConfigProvider)", name, defaultValue);
61+
return defaultValue;
62+
}
63+
64+
@Override
65+
public Optional<String> getOptionalValue(String name) {
66+
Optional<String> value = mpConfig.getOptionalValue(name, String.class);
67+
if (value.isPresent()) {
68+
LOGGER.trace("Optional config value '{}' = '{}' (from MicroProfile Config)", name, value.get());
69+
return value;
70+
}
71+
72+
// Fallback to defaults
73+
Optional<String> defaultValue = defaultValues.getOptionalValue(name);
74+
LOGGER.trace("Optional config value '{}' = '{}' (from DefaultValuesConfigProvider)",
75+
name, defaultValue.orElse("<absent>"));
76+
return defaultValue;
77+
}
78+
}

pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,11 @@
127127
<artifactId>a2a-java-sdk-server-common</artifactId>
128128
<version>${project.version}</version>
129129
</dependency>
130+
<dependency>
131+
<groupId>${project.groupId}</groupId>
132+
<artifactId>a2a-java-sdk-microprofile-config</artifactId>
133+
<version>${project.version}</version>
134+
</dependency>
130135
<dependency>
131136
<groupId>${project.groupId}</groupId>
132137
<artifactId>a2a-java-extras-common</artifactId>
@@ -451,6 +456,7 @@
451456
<module>extras/push-notification-config-store-database-jpa</module>
452457
<module>extras/queue-manager-replicated</module>
453458
<module>http-client</module>
459+
<module>integrations/microprofile-config</module>
454460
<module>reference/common</module>
455461
<module>reference/grpc</module>
456462
<module>reference/jsonrpc</module>

reference/common/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@
4949
<groupId>org.slf4j</groupId>
5050
<artifactId>slf4j-api</artifactId>
5151
</dependency>
52+
<dependency>
53+
<groupId>${project.groupId}</groupId>
54+
<artifactId>a2a-java-sdk-microprofile-config</artifactId>
55+
</dependency>
5256
<dependency>
5357
<groupId>io.quarkus</groupId>
5458
<artifactId>quarkus-junit5</artifactId>

0 commit comments

Comments
 (0)