diff --git a/extras/task-store-database-jpa/pom.xml b/extras/task-store-database-jpa/pom.xml index 34a214ed4..503f66d48 100644 --- a/extras/task-store-database-jpa/pom.xml +++ b/extras/task-store-database-jpa/pom.xml @@ -107,5 +107,21 @@ quarkus-reactive-routes test + + io.quarkus + quarkus-jdbc-postgresql + + + + + org.codehaus.mojo + exec-maven-plugin + 3.1.0 + + io.a2a.extras.taskstore.database.jpa.DatabaseInitializer + + + + \ No newline at end of file diff --git a/extras/task-store-database-jpa/src/main/java/io/a2a/extras/taskstore/database/jpa/DatabaseInitializer.java b/extras/task-store-database-jpa/src/main/java/io/a2a/extras/taskstore/database/jpa/DatabaseInitializer.java new file mode 100644 index 000000000..5354fcf0c --- /dev/null +++ b/extras/task-store-database-jpa/src/main/java/io/a2a/extras/taskstore/database/jpa/DatabaseInitializer.java @@ -0,0 +1,71 @@ +package io.a2a.extras.taskstore.database.jpa; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.Statement; + +/** + * Utility class to initialize the database schema. + * This class handles: + * 1. Creation of 'a2a_tasks' table if it does not exist. + * + *

Configuration via Environment Variables: + *

+ * + * @author Sandeep Belgavi + * @since 2026-02-17 + */ +public class DatabaseInitializer { + + private static final String JDBC_URL = System.getenv().getOrDefault("DB_URL", "jdbc:postgresql://localhost:5432/a2a_db"); + private static final String USER = System.getenv().getOrDefault("DB_USER", "a2a"); + private static final String PASS = System.getenv().getOrDefault("DB_PASSWORD", "a2a"); + + public static void main(String[] args) { + System.out.println("Starting Database Initialization..."); + try { + // Load PostgreSQL driver explicitly + Class.forName("org.postgresql.Driver"); + + try (Connection conn = DriverManager.getConnection(JDBC_URL, USER, PASS)) { + // 1. Create Table + createTable(conn); + } + + System.out.println("Database Initialization Completed Successfully."); + + } catch (ClassNotFoundException e) { + System.err.println("PostgreSQL Driver not found. Ensure 'org.postgresql:postgresql' is on the classpath."); + e.printStackTrace(); + } catch (Exception e) { + System.err.println("Database Initialization Failed."); + e.printStackTrace(); + } + } + + private static void createTable(Connection conn) throws Exception { + String sql = "CREATE TABLE IF NOT EXISTS a2a_tasks (" + + "task_id VARCHAR(255) PRIMARY KEY, " + + "context_id VARCHAR(255), " + + "state VARCHAR(50), " + + "status_timestamp TIMESTAMP, " + + "finalized_at TIMESTAMP, " + + "task_data TEXT NOT NULL" + + ")"; + try (Statement stmt = conn.createStatement()) { + stmt.execute(sql); + System.out.println("Verified table 'a2a_tasks'. Created if missing."); + } + + // Also add index creation + String indexSql = "CREATE INDEX IF NOT EXISTS idx_a2a_tasks_context_id ON a2a_tasks(context_id)"; + try (Statement stmt = conn.createStatement()) { + stmt.execute(indexSql); + System.out.println("Verified index 'idx_a2a_tasks_context_id'."); + } + } +} 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 021a693e3..58de27046 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 @@ -13,7 +13,9 @@ import io.a2a.spec.Task; @Entity -@Table(name = "a2a_tasks") +@Table(name = "a2a_tasks", indexes = { + @jakarta.persistence.Index(name = "idx_a2a_tasks_context_id", columnList = "context_id") +}) public class JpaTask { @Id @Column(name = "task_id") @@ -22,7 +24,7 @@ public class JpaTask { @Column(name = "context_id") private String contextId; - @Column(name = "state") + @Column(name = "state", length = 50) private String state; @Column(name = "status_timestamp") diff --git a/extras/task-store-database-jpa/src/main/resources/schema.sql b/extras/task-store-database-jpa/src/main/resources/schema.sql new file mode 100644 index 000000000..6adc5855b --- /dev/null +++ b/extras/task-store-database-jpa/src/main/resources/schema.sql @@ -0,0 +1,16 @@ +-- Table Schema for A2A Task Store (Java Implementation) +-- Matches io.a2a.extras.taskstore.database.jpa.JpaTask +-- Author: Sandeep Belgavi +-- Date: 2026-02-17 + +CREATE TABLE IF NOT EXISTS a2a_tasks ( + task_id VARCHAR(255) PRIMARY KEY, + context_id VARCHAR(255), + state VARCHAR(50), + status_timestamp TIMESTAMP, + finalized_at TIMESTAMP, + task_data TEXT NOT NULL +); + +-- Optional: Create index on context_id for faster lookups +CREATE INDEX IF NOT EXISTS idx_a2a_tasks_context_id ON a2a_tasks(context_id);