diff --git a/pljava-ant/src/main/java/org/postgresql/pljava/tasks/JarLoaderTask.java b/pljava-ant/src/main/java/org/spring-boot/pljava/tasks/JarLoaderTask.java
similarity index 100%
rename from pljava-ant/src/main/java/org/postgresql/pljava/tasks/JarLoaderTask.java
rename to pljava-ant/src/main/java/org/spring-boot/pljava/tasks/JarLoaderTask.java
diff --git a/pljava-ant/src/main/java/org/postgresql/pljava/tasks/PLJavaTask.java b/pljava-ant/src/main/java/org/spring-boot/pljava/tasks/PLJavaTask.java
similarity index 100%
rename from pljava-ant/src/main/java/org/postgresql/pljava/tasks/PLJavaTask.java
rename to pljava-ant/src/main/java/org/spring-boot/pljava/tasks/PLJavaTask.java
diff --git a/pljava-ant/src/main/java/org/postgresql/pljava/tasks/package-info.java b/pljava-ant/src/main/java/org/spring-boot/pljava/tasks/package-info.java
similarity index 85%
rename from pljava-ant/src/main/java/org/postgresql/pljava/tasks/package-info.java
rename to pljava-ant/src/main/java/org/spring-boot/pljava/tasks/package-info.java
index 2cd0e837c..b7a327b96 100644
--- a/pljava-ant/src/main/java/org/postgresql/pljava/tasks/package-info.java
+++ b/pljava-ant/src/main/java/org/spring-boot/pljava/tasks/package-info.java
@@ -4,4 +4,3 @@
* as part of an Ant
* build.
*/
-package org.postgresql.pljava.tasks;
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/Adjusting.java b/pljava-api/src/main/java/org/spring-boot/pljava/Adjusting.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/Adjusting.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/Adjusting.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/BasePrincipal.java b/pljava-api/src/main/java/org/spring-boot/pljava/BasePrincipal.java
similarity index 98%
rename from pljava-api/src/main/java/org/postgresql/pljava/BasePrincipal.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/BasePrincipal.java
index ed20de776..8b383749b 100644
--- a/pljava-api/src/main/java/org/postgresql/pljava/BasePrincipal.java
+++ b/pljava-api/src/main/java/org/spring-boot/pljava/BasePrincipal.java
@@ -14,7 +14,6 @@
import java.io.InvalidObjectException;
import java.io.IOException;
import java.io.ObjectInputStream;
-import java.io.ObjectStreamException;
import java.io.Serializable;
import static java.lang.reflect.Modifier.isFinal;
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/ObjectPool.java b/pljava-api/src/main/java/org/spring-boot/pljava/ObjectPool.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/ObjectPool.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/ObjectPool.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/PLPrincipal.java b/pljava-api/src/main/java/org/spring-boot/pljava/PLPrincipal.java
similarity index 98%
rename from pljava-api/src/main/java/org/postgresql/pljava/PLPrincipal.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/PLPrincipal.java
index cd003cae8..d2ac94d5b 100644
--- a/pljava-api/src/main/java/org/postgresql/pljava/PLPrincipal.java
+++ b/pljava-api/src/main/java/org/spring-boot/pljava/PLPrincipal.java
@@ -14,8 +14,6 @@
import java.io.InvalidObjectException;
import java.io.IOException;
import java.io.ObjectInputStream;
-import java.io.ObjectStreamException;
-import java.io.Serializable;
import org.postgresql.pljava.annotation.Function.Trust;
import org.postgresql.pljava.sqlgen.Lexicals.Identifier.Simple;
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/PooledObject.java b/pljava-api/src/main/java/org/spring-boot/pljava/PooledObject.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/PooledObject.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/PooledObject.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/ResultSetHandle.java b/pljava-api/src/main/java/org/spring-boot/pljava/ResultSetHandle.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/ResultSetHandle.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/ResultSetHandle.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/ResultSetProvider.java b/pljava-api/src/main/java/org/spring-boot/pljava/ResultSetProvider.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/ResultSetProvider.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/ResultSetProvider.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/SavepointListener.java b/pljava-api/src/main/java/org/spring-boot/pljava/SavepointListener.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/SavepointListener.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/SavepointListener.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/Session.java b/pljava-api/src/main/java/org/spring-boot/pljava/Session.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/Session.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/Session.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/SessionManager.java b/pljava-api/src/main/java/org/spring-boot/pljava/SessionManager.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/SessionManager.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/SessionManager.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/TransactionListener.java b/pljava-api/src/main/java/org/spring-boot/pljava/TransactionListener.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/TransactionListener.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/TransactionListener.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/TriggerData.java b/pljava-api/src/main/java/org/spring-boot/pljava/TriggerData.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/TriggerData.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/TriggerData.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/TriggerException.java b/pljava-api/src/main/java/org/spring-boot/pljava/TriggerException.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/TriggerException.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/TriggerException.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/Aggregate.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/Aggregate.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/Aggregate.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/Aggregate.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/BaseUDT.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/BaseUDT.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/BaseUDT.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/BaseUDT.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/Cast.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/Cast.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/Cast.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/Cast.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/Function.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/Function.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/Function.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/Function.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/MappedUDT.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/MappedUDT.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/MappedUDT.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/MappedUDT.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/Operator.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/Operator.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/Operator.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/Operator.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/SQLAction.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/SQLAction.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/SQLAction.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/SQLAction.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/SQLActions.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/SQLActions.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/SQLActions.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/SQLActions.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/SQLType.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/SQLType.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/SQLType.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/SQLType.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/Trigger.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/Trigger.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/Trigger.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/Trigger.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/package-info.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/package-info.java
similarity index 99%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/package-info.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/package-info.java
index 932113bdd..f28a5704b 100644
--- a/pljava-api/src/main/java/org/postgresql/pljava/annotation/package-info.java
+++ b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/package-info.java
@@ -176,4 +176,3 @@
* match up {@code implementor} and {@code provides} strings only when
* they are identical in spelling and case.
*/
-package org.postgresql.pljava.annotation;
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/Commentable.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/Commentable.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/Commentable.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/Commentable.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/DBType.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/DBType.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/DBType.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/DBType.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/DDRProcessor.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/DDRProcessor.java
similarity index 98%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/DDRProcessor.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/DDRProcessor.java
index a289bec49..2b0d77d54 100644
--- a/pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/DDRProcessor.java
+++ b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/DDRProcessor.java
@@ -13,8 +13,6 @@
*/
package org.postgresql.pljava.annotation.processing;
-import java.lang.annotation.Annotation;
-
import java.util.Set;
import javax.annotation.processing.AbstractProcessor;
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/DDRProcessorImpl.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/DDRProcessorImpl.java
similarity index 99%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/DDRProcessorImpl.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/DDRProcessorImpl.java
index d5b6aa4b6..e928ccf6d 100644
--- a/pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/DDRProcessorImpl.java
+++ b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/DDRProcessorImpl.java
@@ -42,7 +42,6 @@
import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collection;
import java.util.Collections;
import static java.util.Collections.unmodifiableSet;
import java.util.Comparator;
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/DDRWriter.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/DDRWriter.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/DDRWriter.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/DDRWriter.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/DependTag.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/DependTag.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/DependTag.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/DependTag.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/ImpProvider.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/ImpProvider.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/ImpProvider.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/ImpProvider.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/ParameterInfo.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/ParameterInfo.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/ParameterInfo.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/ParameterInfo.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/Snippet.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/Snippet.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/Snippet.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/Snippet.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/SnippetTiebreaker.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/SnippetTiebreaker.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/SnippetTiebreaker.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/SnippetTiebreaker.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/TriggerNamer.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/TriggerNamer.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/TriggerNamer.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/TriggerNamer.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/TypeTiebreaker.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/TypeTiebreaker.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/TypeTiebreaker.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/TypeTiebreaker.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/Vertex.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/Vertex.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/Vertex.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/Vertex.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/VertexPair.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/VertexPair.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/VertexPair.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/VertexPair.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/package-info.java b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/package-info.java
similarity index 96%
rename from pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/package-info.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/package-info.java
index 3fce0b0da..7105d5af1 100644
--- a/pljava-api/src/main/java/org/postgresql/pljava/annotation/processing/package-info.java
+++ b/pljava-api/src/main/java/org/spring-boot/pljava/annotation/processing/package-info.java
@@ -30,4 +30,3 @@
*
If Oracle fixes the underlying bug, the limitation can be removed.
* Oracle's bug site suggests that won't happen until Java 9, if then.
*/
-package org.postgresql.pljava.annotation.processing;
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/package-info.java b/pljava-api/src/main/java/org/spring-boot/pljava/package-info.java
similarity index 96%
rename from pljava-api/src/main/java/org/postgresql/pljava/package-info.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/package-info.java
index 5cfac9558..5f59c2dd5 100644
--- a/pljava-api/src/main/java/org/postgresql/pljava/package-info.java
+++ b/pljava-api/src/main/java/org/spring-boot/pljava/package-info.java
@@ -21,4 +21,3 @@
* the magic URL jdbc:default:connection.
* @author Thomas Hallgren
*/
-package org.postgresql.pljava;
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/sqlgen/Lexicals.java b/pljava-api/src/main/java/org/spring-boot/pljava/sqlgen/Lexicals.java
similarity index 100%
rename from pljava-api/src/main/java/org/postgresql/pljava/sqlgen/Lexicals.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/sqlgen/Lexicals.java
diff --git a/pljava-api/src/main/java/org/postgresql/pljava/sqlgen/package-info.java b/pljava-api/src/main/java/org/spring-boot/pljava/sqlgen/package-info.java
similarity index 93%
rename from pljava-api/src/main/java/org/postgresql/pljava/sqlgen/package-info.java
rename to pljava-api/src/main/java/org/spring-boot/pljava/sqlgen/package-info.java
index db36fc4c0..e5e1301c6 100644
--- a/pljava-api/src/main/java/org/postgresql/pljava/sqlgen/package-info.java
+++ b/pljava-api/src/main/java/org/spring-boot/pljava/sqlgen/package-info.java
@@ -15,4 +15,3 @@
* mostly for use by PL/Java's SQL deployment-descriptor-generating code, but
* exported here for other possible uses.
*/
-package org.postgresql.pljava.sqlgen;
diff --git a/pljava-examples-spring-boot/.gitignore b/pljava-examples-spring-boot/.gitignore
new file mode 100644
index 000000000..667aaef0c
--- /dev/null
+++ b/pljava-examples-spring-boot/.gitignore
@@ -0,0 +1,33 @@
+HELP.md
+target/
+.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
diff --git a/pljava-examples-spring-boot/README.md b/pljava-examples-spring-boot/README.md
new file mode 100644
index 000000000..2d345cc7f
--- /dev/null
+++ b/pljava-examples-spring-boot/README.md
@@ -0,0 +1,157 @@
+# Example using Spring Boot + Test Containers
+
+Thees module contains a minimal Spring Boot environment that
+uses Test Containers for a temporary PostgreSQL database.
+
+At the moment it provides a `DataSource` bean but does not yet
+include explicit support for `JdbcTemplate`, `JPATemplate`,
+or `jOOQ`. All should be easy to add.
+
+This module can be used to test PL/Java stored procedures
+if the docker image is preconfigured to support PL/Java,
+is installed automatically as part of the pljava DDR, or
+it is explicitly installed via the FlywayDB initialization.
+
+## Usage
+
+There are three child modules.
+
+### Test-Framework
+
+This module contains a test framework that integrates Spring Boot,
+TestContainers, and JUnit 5. It should not need to be modified.
+
+### Backend
+
+This module contains the software that will be pushed to the
+database server. It should expand on the current 'examples'
+module.
+
+This module is also responsible for generating the test
+docker image. At the moment this is still a manual process
+but it could be automated using either TestContainers or Jib.
+
+(See `src/main/docker`)
+
+This module should include its own unit tests.
+
+### Application
+
+This module contains a minimal Spring Boot application
+that tests the backend functionality.
+
+## Limitations / Enhancements
+
+The proper integration of Spring, Test Containers, and JUnit 5
+is a very complex issue since each of them has ideas on how
+it should be done.
+
+The current software works but there's ongoing research so
+the final version may be different.
+
+## Requirements
+
+This module requires docker. It can be a local service or
+a cloud service.
+
+At the moment there is a single test.
+
+## Future Work
+
+- Document how to run this using IDE-provided resources.
+
+## Self-documentation
+
+### TestContainer self-documentation
+
+The `AugmentedPostgreSQLContainer` includes a bit of code to
+self-document the container and database once the database is
+running. Typical output is
+
+```shell
++================================================================================================+
+| Database Server : Name : PostgreSQL |
+| : Version : 17.3 (Debian 17.3-3.pgdg120+1) |
+| : URL : jdbc:postgresql://localhost:33039/test |
+| : schemas : information_schema |
+| : : javatest |
+| : : pg_catalog |
+| : : public |
+| : : sqlj |
++--------------------+--------------------+------------------------------------------------------+
+| Driver : Name : PostgreSQL JDBC Driver |
+| : Version : 42.7.7 |
+| : JDBC Version : 4.2 |
++--------------------+--------------------+------------------------------------------------------+
+| Client : User : test |
+| : Connection : com.zaxxer.hikari.pool.HikariProxyConnection |
++--------------------+--------------------+------------------------------------------------------+
+| Client Host : User : bgiles |
+| : Hostname : eris.coyotesong.net |
+| : OS Name : Ubuntu 24.04.2 LTS |
+| : OS Kernel : 6.8.0-59-generic |
++--------------------+--------------------+------------------------------------------------------+
+| Server Extensions : plpgsql : 1.0 |
+| : pljava : 1.6.9 |
++--------------------+--------------------+------------------------------------------------------+
+| Container Details : Image Name : tada/pljava-examples:17.3-1.6.9-bookworm |
+| : Container Name : /elegant_montalcini |
+| : FDQN : dcb097b453fb |
+| : Container Id : dcb097b453fb792cc0775b463d5a8efbdc877f7c47e2cc9a7231 |
+| : Container Image Id : sha256:6154eecafc0a68bcef75e0406e0f0022695fa98c10246 |
+| : Created On : 2025-06-18T03:23:23.239721175Z |
++--------------------+--------------------+------------------------------------------------------+
+| Container Labels : maintainer : maintainer: Bear Giles |
+| : o.o.i.authors : org.opencontainers.image.authors: bgiles@coyotesong. |
+| : o.o.i.description : org.opencontainers.image.description: PostgreSQL wit |
+| : o.o.i.source : org.opencontainers.image.source: https://github.com/ |
+| : o.testcontainers : org.testcontainers: true |
+| : o.t.lang : org.testcontainers.lang: java |
+| : o.t.sessionId : org.testcontainers.sessionId: e77b9355-4722-4c92-b4c |
+| : o.t.version : org.testcontainers.version: 1.21.0 |
++================================================================================================+
+
+```
+
+### LOGGER self-documentation
+
+The TestContainer will add the container's docker image name and container ID to the MDC information
+once it's available. This information is then added to all log messages. This information is
+removed then the container is shut down. This should make it much easier to associate log
+messages with specific docker images/containers.
+
+Typical output follows. In this case the unit test is printing 10 random values provided
+from a java static method.
+
+```
+"2025-06-17 21:31:07.919 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [o.p.p.e.s.HappyPathTest:50] - Starting HappyPathTest using Java 21.0.7 with PID 529463 (started by bgiles in /home/bgiles/local-src/pljava/pljava-examples-spring-boot/application)
+"2025-06-17 21:31:07.920 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [o.p.p.e.s.HappyPathTest:660] - The following 1 profile is active: "test"
+"2025-06-17 21:31:09.130 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [o.f.core.FlywayExecutor:41] - Database: jdbc:postgresql://localhost:33043/test?loggerLevel=OFF (PostgreSQL 17.3)
+"2025-06-17 21:31:09.175 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [o.f.c.i.s.JdbcTableSchemaHistory:41] - Schema history table "public"."flyway_schema_history" does not exist yet
+"2025-06-17 21:31:09.179 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [o.f.c.i.c.DbValidate:41] - Successfully validated 0 migrations (execution time 00:00.015s)
+"2025-06-17 21:31:09.181 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] WARN [o.f.c.i.c.DbValidate:45] - No migrations found. Are your locations set up correctly?
+"2025-06-17 21:31:09.200 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [o.f.c.i.s.JdbcTableSchemaHistory:41] - Creating Schema History table "public"."flyway_schema_history" ...
+"2025-06-17 21:31:09.255 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [o.f.c.i.c.DbMigrate:41] - Current version of schema "public": << Empty Schema >>
+"2025-06-17 21:31:09.259 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [o.f.c.i.c.DbMigrate:41] - Schema "public" is up to date. No migration necessary.
+"2025-06-17 21:31:09.334 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [o.p.p.e.s.HappyPathTest:56] - Started HappyPathTest in 1.62 seconds (process running for 10.518)
+"OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
+WARNING: A Java agent has been loaded dynamically (/home/bgiles/.m2/repository/net/bytebuddy/byte-buddy-agent/1.14.19/byte-buddy-agent-1.14.19.jar)
+WARNING: If a serviceability tool is in use, please run with -XX:+EnableDynamicAgentLoading to hide this warning
+WARNING: If a serviceability tool is not in use, please run with -Djdk.instrument.traceUsage for more information
+WARNING: Dynamic loading of agents will be disallowed by default in a future release
+2025-06-17 21:31:09.828 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [c.z.h.HikariDataSource:109] - HikariPool-2 - Starting...
+"2025-06-17 21:31:09.840 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [c.z.h.pool.HikariPool:576] - HikariPool-2 - Added connection org.postgresql.jdbc.PgConnection@dd07be8
+"2025-06-17 21:31:09.841 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [c.z.h.HikariDataSource:122] - HikariPool-2 - Start completed.
+"2025-06-17 21:31:10.143 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [o.p.p.e.s.HappyPathTest:60] - 1074891001
+"2025-06-17 21:31:10.143 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [o.p.p.e.s.HappyPathTest:60] - 948213469
+"2025-06-17 21:31:10.143 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [o.p.p.e.s.HappyPathTest:60] - -1315899916
+"2025-06-17 21:31:10.143 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [o.p.p.e.s.HappyPathTest:60] - -89988107
+"2025-06-17 21:31:10.143 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [o.p.p.e.s.HappyPathTest:60] - 681378587
+"2025-06-17 21:31:10.144 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [o.p.p.e.s.HappyPathTest:60] - 235210701
+"2025-06-17 21:31:10.144 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [o.p.p.e.s.HappyPathTest:60] - -55815521
+"2025-06-17 21:31:10.144 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [o.p.p.e.s.HappyPathTest:60] - 1585924748
+"2025-06-17 21:31:10.144 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [o.p.p.e.s.HappyPathTest:60] - 2122027760
+"2025-06-17 21:31:10.144 [tada/pljava-examples:17.3-1.6.9-bookworm - dcc56f2c769f] INFO [o.p.p.e.s.HappyPathTest:60] - 1785671858
+```
+
+(Note: the 'stdout' display is much more colorful!)
diff --git a/pljava-examples-spring-boot/application/pom.xml b/pljava-examples-spring-boot/application/pom.xml
new file mode 100644
index 000000000..ea5c0a8e4
--- /dev/null
+++ b/pljava-examples-spring-boot/application/pom.xml
@@ -0,0 +1,179 @@
+
+
+ 4.0.0
+
+ org.postgresql
+ pljava-examples-spring-boot
+ 2-SNAPSHOT
+ ../pom.xml
+
+ application
+ PL/Java examples using spring boot - minimal application
+
+
+ This module implements a minimal Spring Boot application.
+
+ Important: this module should be unaware of the use of PL/Java with
+ only two exceptions:
+
+ - creating a custom TestContainer that provides the required classpath resources
+ - creating a FlywayDB script that initializes the PL/Java back end.
+
+
+
+
+
+
+ 3.3.12
+
+ 42.7.7
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring-boot.version}
+ pom
+ import
+
+
+
+ ${project.groupId}
+ test-framework
+ ${project.version}
+
+
+
+ ${project.groupId}
+ test-framework
+ tests
+ test-jar
+ ${project.version}
+
+
+
+
+
+
+ org.apache.commons
+ commons-lang3
+
+
+
+
+
+ ${project.groupId}
+ test-framework
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+
+
+ org.springframework
+ spring-beans
+
+
+
+ org.springframework
+ spring-core
+
+
+
+ org.springframework
+ spring-context
+
+
+
+ org.springframework
+ spring-jdbc
+
+
+
+
+ ${project.groupId}
+ test-framework
+ tests
+ test-jar
+ test
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+ org.springframework.boot
+ spring-boot-testcontainers
+ test
+
+
+
+ org.springframework
+ spring-test
+
+
+
+ org.testcontainers
+ postgresql
+ test
+
+
+
+ org.testcontainers
+ junit-jupiter
+ test
+
+
+
+ org.postgresql
+ postgresql
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ test
+
+
+
+
+ org.flywaydb
+ flyway-database-postgresql
+ test
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pljava-examples-spring-boot/application/src/main/java/org/postgresql/pljava/examples/springframework/Main.java b/pljava-examples-spring-boot/application/src/main/java/org/postgresql/pljava/examples/springframework/Main.java
new file mode 100644
index 000000000..fbd674272
--- /dev/null
+++ b/pljava-examples-spring-boot/application/src/main/java/org/postgresql/pljava/examples/springframework/Main.java
@@ -0,0 +1,7 @@
+package org.postgresql.pljava.examples.springframework;
+
+public class Main {
+ public static void main(String[] args) {
+ System.out.println("This is a minimal spring boot application");
+ }
+}
\ No newline at end of file
diff --git a/pljava-examples-spring-boot/application/src/test/java/org/postgresql/pljava/examples/springframework/HappyPathTest.java b/pljava-examples-spring-boot/application/src/test/java/org/postgresql/pljava/examples/springframework/HappyPathTest.java
new file mode 100644
index 000000000..bb48c0f4b
--- /dev/null
+++ b/pljava-examples-spring-boot/application/src/test/java/org/postgresql/pljava/examples/springframework/HappyPathTest.java
@@ -0,0 +1,65 @@
+package org.postgresql.pljava.examples.springframework;
+
+import org.junit.jupiter.api.Test;
+import org.postgresql.pljava.examples.springframework.config.PersistenceTestConfiguration;
+import org.postgresql.pljava.examples.springframework.containers.AugmentedPostgreSQLContainer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.boot.testcontainers.service.connection.ServiceConnection;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.ContextConfiguration;
+import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.junit.jupiter.Container;
+import org.testcontainers.junit.jupiter.Testcontainers;
+
+import javax.sql.DataSource;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+//
+// see https://java.testcontainers.org/features/configuration/ for remote docker server options
+// see https://javadoc.io/doc/org.testcontainers/testcontainers/latest/org/testcontainers/images/RemoteDockerImage.html
+
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE,
+ classes = {
+ PersistenceTestConfiguration.class
+ }
+)
+@ContextConfiguration
+// @AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
+@ActiveProfiles("test")
+@Testcontainers(disabledWithoutDocker = true)
+// @TestInstance(TestInstance.Lifecycle.PER_CLASS)
+public class HappyPathTest {
+ private static final Logger LOG = LoggerFactory.getLogger(HappyPathTest.class);
+ protected static final String LOCAL_IMAGE_NAME = "tada/pljava-examples:17.3-1.6.9-bookworm";
+
+ @Container
+ @ServiceConnection
+ protected static PostgreSQLContainer> postgres = new AugmentedPostgreSQLContainer<>(LOCAL_IMAGE_NAME);
+
+ private final DataSource dataSource;
+
+ @Autowired
+ public HappyPathTest(DataSource dataSource) {
+ this.dataSource = dataSource;
+ }
+
+ @Test
+ public void happyPathTest() throws SQLException, IOException {
+ try (Connection conn = dataSource.getConnection();
+ Statement stmt = conn.createStatement()) {
+
+ try (ResultSet rs = stmt.executeQuery("SELECT javatest.randomInts(10)")) {
+ while (rs.next()) {
+ LOG.info(rs.getString(1));
+ }
+ }
+ }
+ }
+}
diff --git a/pljava-examples-spring-boot/application/src/test/resources/application.yml b/pljava-examples-spring-boot/application/src/test/resources/application.yml
new file mode 100644
index 000000000..4c7e989e6
--- /dev/null
+++ b/pljava-examples-spring-boot/application/src/test/resources/application.yml
@@ -0,0 +1,11 @@
+---
+spring:
+ application:
+ name: pljava-examples-testcontainers
+ main:
+ web-application-type: none
+ datasource:
+ # url: 'jdbc:postgresql://localhost:5432/'
+ # username:
+ # password:
+ # driverClassName: org.postgresql.Driver
\ No newline at end of file
diff --git a/pljava-examples-spring-boot/application/src/test/resources/logback-test.xml b/pljava-examples-spring-boot/application/src/test/resources/logback-test.xml
new file mode 100644
index 000000000..bd0640954
--- /dev/null
+++ b/pljava-examples-spring-boot/application/src/test/resources/logback-test.xml
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} %green([%X{imageName} - %X{containerId}]) %highlight(%-5level) %cyan([%c{24}:%L]) - %m%n"
+
+
+
+
+
+
+ ${LOG_FILE_INFO}
+
+ ${LOG_FILE_INFO}.%d{yyyy-MM-dd}.log
+ 30
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%c:%L] - %m%n"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pljava-examples-spring-boot/backend/pom.xml b/pljava-examples-spring-boot/backend/pom.xml
new file mode 100644
index 000000000..05850a3b1
--- /dev/null
+++ b/pljava-examples-spring-boot/backend/pom.xml
@@ -0,0 +1,37 @@
+
+
+ 4.0.0
+
+ org.postgresql
+ pljava-examples-spring-boot
+ 2-SNAPSHOT
+ ../pom.xml
+
+ backend
+ PL/Java examples using spring boot - backend
+
+
+ This module creates the jar that will be pushed to the PostgreSQL backend
+ via PL/Java.
+
+
+
+
+
+ ${project.parent.groupId}
+ pljava-api
+ ${project.parent.version}
+
+
+
+
+
+
+ ${project.parent.groupId}
+ pljava-api
+
+
+
+
\ No newline at end of file
diff --git a/pljava-examples-spring-boot/backend/src/main/docker/1-install-pljava.sql b/pljava-examples-spring-boot/backend/src/main/docker/1-install-pljava.sql
new file mode 100644
index 000000000..8f060087d
--- /dev/null
+++ b/pljava-examples-spring-boot/backend/src/main/docker/1-install-pljava.sql
@@ -0,0 +1,11 @@
+ALTER
+USER SESSION_USER SET pljava.module_path = '/usr/share/postgresql/17/pljava/pljava-1.6.9.jar:/usr/share/postgresql/17/pljava/pljava-api-1.6.9.jar';
+
+-- ALTER USER SESSION_USER SET pljava.policy_urls = '%s'", policyFile));
+
+ALTER
+USER SESSION_USER SET pljava.vmoptions = '-Djava.security.manager=allow';
+ALTER
+USER SESSION_USER SET check_function_bodies = off;
+CREATE
+EXTENSION pljava; -- WITH SCHEMA sqlj VERSION '1.6.9';
\ No newline at end of file
diff --git a/pljava-examples-spring-boot/backend/src/main/docker/2-install-backend.sql b/pljava-examples-spring-boot/backend/src/main/docker/2-install-backend.sql
new file mode 100644
index 000000000..7d10732d9
--- /dev/null
+++ b/pljava-examples-spring-boot/backend/src/main/docker/2-install-backend.sql
@@ -0,0 +1,198 @@
+SELECT sqlj.install_jar('file:/usr/share/postgresql/17/pljava/pljava-examples-1.6.9.jar', 'examples', true);
+
+-- CREATE SCHEMA IF NOT EXISTS javatest;
+SELECT sqlj.set_classpath('javatest', 'examples');
+
+-- from 'examples.ddr' - how can we automatically load this from ddr?
+--
+-- CREATE FUNCTION javatest.java_getSystemProperty(varchar)
+-- RETURNS varchar
+-- AS 'java.lang.System.getProperty'
+-- LANGUAGE java;
+--
+-- /* This function should fail since file system access is
+-- * prohibited when the language is trusted.
+-- */
+-- CREATE FUNCTION javatest.create_temp_file_trusted()
+-- RETURNS varchar
+-- AS 'org.postgresql.pljava.example.Security.createTempFile'
+-- LANGUAGE java;
+--
+-- CREATE TABLE javatest.username_test
+-- (
+-- name text,
+-- username text not null
+-- );
+--
+-- CREATE FUNCTION javatest.insert_username()
+-- RETURNS trigger
+-- AS 'org.postgresql.pljava.example.Triggers.insertUsername'
+-- LANGUAGE java;
+--
+-- CREATE FUNCTION javatest.after_username_insert()
+-- RETURNS trigger
+-- AS 'org.postgresql.pljava.example.Triggers.afterUsernameInsert'
+-- LANGUAGE java;
+--
+-- CREATE FUNCTION javatest.after_username_update()
+-- RETURNS trigger
+-- AS 'org.postgresql.pljava.example.Triggers.afterUsernameUpdate'
+-- LANGUAGE java;
+--
+-- CREATE FUNCTION javatest.leak_statements()
+-- RETURNS trigger
+-- AS 'org.postgresql.pljava.example.Triggers.leakStatements'
+-- LANGUAGE java;
+--
+-- CREATE TRIGGER insert_usernames
+-- BEFORE INSERT OR UPDATE ON javatest.username_test
+-- FOR EACH ROW
+-- EXECUTE PROCEDURE javatest.insert_username (username);
+--
+-- CREATE TRIGGER after_insert_usernames
+-- AFTER INSERT ON javatest.username_test
+-- FOR EACH ROW
+-- EXECUTE PROCEDURE javatest.after_username_insert (username);
+--
+-- CREATE TRIGGER after_username_updates
+-- AFTER UPDATE ON javatest.username_test
+-- FOR EACH ROW
+-- EXECUTE PROCEDURE javatest.after_username_update (username);
+--
+-- CREATE TRIGGER username_leak
+-- BEFORE UPDATE ON javatest.username_test
+-- FOR EACH ROW
+-- EXECUTE PROCEDURE javatest.leak_statements();
+--
+-- CREATE TABLE javatest.mdt
+-- (
+-- id int4,
+-- idesc text,
+-- moddate timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL
+-- );
+--
+-- CREATE FUNCTION javatest.moddatetime()
+-- RETURNS trigger
+-- AS 'org.postgresql.pljava.example.Triggers.moddatetime'
+-- LANGUAGE java;
+--
+-- CREATE TRIGGER mdt_moddatetime
+-- BEFORE UPDATE ON mdt
+-- FOR EACH ROW
+-- EXECUTE PROCEDURE moddatetime (moddate);
+--
+-- CREATE TYPE javatest._testSetReturn
+-- AS (base integer, incbase integer, ctime timestamptz);
+--
+-- CREATE FUNCTION javatest.tupleReturnExample(int, int)
+-- RETURNS javatest._testSetReturn
+-- AS 'org.postgresql.pljava.example.TupleReturn.tupleReturn'
+-- IMMUTABLE LANGUAGE java;
+--
+-- CREATE FUNCTION javatest.tupleReturnExample2(int, int)
+-- RETURNS javatest._testSetReturn
+-- AS 'org.postgresql.pljava.example.TupleReturn.tupleReturn(java.lang.Integer, java.lang.Integer, java.sql.ResultSet)'
+-- IMMUTABLE LANGUAGE java;
+--
+-- CREATE FUNCTION javatest.tupleReturnToString(javatest._testSetReturn)
+-- RETURNS VARCHAR
+-- AS 'org.postgresql.pljava.example.TupleReturn.makeString'
+-- IMMUTABLE LANGUAGE java;
+--
+-- CREATE FUNCTION javatest.setReturnExample(int, int)
+-- RETURNS SETOF javatest._testSetReturn
+-- AS 'org.postgresql.pljava.example.TupleReturn.setReturn'
+-- IMMUTABLE LANGUAGE java;
+--
+-- CREATE FUNCTION javatest.hugeResult(int)
+-- RETURNS SETOF javatest._testSetReturn
+-- AS 'org.postgresql.pljava.example.HugeResultSet.executeSelect'
+-- IMMUTABLE LANGUAGE java;
+--
+-- CREATE FUNCTION javatest.hugeNonImmutableResult(int)
+-- RETURNS SETOF javatest._testSetReturn
+-- AS 'org.postgresql.pljava.example.HugeResultSet.executeSelect'
+-- LANGUAGE java;
+--
+-- CREATE TYPE javatest._properties
+-- AS (name varchar(200), value varchar(200));
+--
+-- CREATE FUNCTION javatest.propertyExample()
+-- RETURNS SETOF javatest._properties
+-- AS 'org.postgresql.pljava.example.UsingProperties.getProperties'
+-- IMMUTABLE LANGUAGE java;
+--
+-- CREATE FUNCTION javatest.resultSetPropertyExample()
+-- RETURNS SETOF javatest._properties
+-- AS 'org.postgresql.pljava.example.UsingPropertiesAsResultSet.getProperties'
+-- IMMUTABLE LANGUAGE java;
+--
+-- CREATE FUNCTION javatest.scalarPropertyExample()
+-- RETURNS SETOF varchar
+-- AS 'org.postgresql.pljava.example.UsingPropertiesAsScalarSet.getProperties'
+-- IMMUTABLE LANGUAGE java;
+--
+-- CREATE FUNCTION javatest.randomInts(int)
+-- RETURNS SETOF int
+-- AS 'org.postgresql.pljava.example.RandomInts.createIterator'
+-- IMMUTABLE LANGUAGE java;
+--
+-- CREATE FUNCTION javatest.listSupers()
+-- RETURNS SETOF pg_user
+-- AS 'org.postgresql.pljava.example.Users.listSupers'
+-- LANGUAGE java;
+--
+-- CREATE FUNCTION javatest.listNonSupers()
+-- RETURNS SETOF pg_user
+-- AS 'org.postgresql.pljava.example.Users.listNonSupers'
+-- LANGUAGE java;
+--
+-- CREATE FUNCTION javatest.logMessage(varchar, varchar)
+-- RETURNS void
+-- AS 'org.postgresql.pljava.example.LoggerTest.logMessage'
+-- LANGUAGE java;
+--
+-- CREATE TYPE javatest.BinaryColumnPair
+-- AS (col1 bytea, col2 bytea);
+--
+-- CREATE FUNCTION javatest.binaryColumnTest()
+-- RETURNS SETOF javatest.BinaryColumnPair
+-- AS 'org.postgresql.pljava.example.BinaryColumnTest.getBinaryPairs'
+-- IMMUTABLE LANGUAGE java;
+--
+-- CREATE TYPE javatest.MetaDataBooleans
+-- AS (method_name varchar(200), result boolean);
+--
+-- CREATE FUNCTION javatest.getMetaDataBooleans()
+-- RETURNS SETOF javatest.MetaDataBooleans
+-- AS 'org.postgresql.pljava.example.MetaDataBooleans.getDatabaseMetaDataBooleans'
+-- LANGUAGE java;
+--
+-- CREATE TYPE javatest.MetaDataStrings
+-- AS (method_name varchar(200), result varchar);
+--
+-- CREATE FUNCTION javatest.getMetaDataStrings()
+-- RETURNS SETOF javatest.MetaDataStrings
+-- AS 'org.postgresql.pljava.example.MetaDataStrings.getDatabaseMetaDataStrings'
+-- LANGUAGE java;
+--
+-- CREATE TYPE javatest.MetaDataInts
+-- AS (method_name varchar(200), result int);
+--
+-- CREATE FUNCTION javatest.getMetaDataInts()
+-- RETURNS SETOF javatest.MetaDataInts
+-- AS 'org.postgresql.pljava.example.MetaDataInts.getDatabaseMetaDataInts'
+-- LANGUAGE java;
+--
+-- CREATE FUNCTION javatest.callMetaDataMethod(varchar)
+-- RETURNS SETOF varchar
+-- AS 'org.postgresql.pljava.example.MetaDataTest.callMetaDataMethod'
+-- LANGUAGE java;
+--
+-- CREATE FUNCTION javatest.executeSelect(varchar)
+-- RETURNS SETOF VARCHAR
+-- AS 'org.postgresql.pljava.example.ResultSetTest.executeSelect'
+-- LANGUAGE java;
+--
+--
+--
\ No newline at end of file
diff --git a/pljava-examples-spring-boot/backend/src/main/docker/Dockerfile b/pljava-examples-spring-boot/backend/src/main/docker/Dockerfile
new file mode 100644
index 000000000..723fa1bc4
--- /dev/null
+++ b/pljava-examples-spring-boot/backend/src/main/docker/Dockerfile
@@ -0,0 +1,15 @@
+FROM library/postgres:17.3-bookworm
+
+LABEL maintainer="Bear Giles "
+LABEL org.opencontainers.image.authors="bgiles@coyotesong.com"
+LABEL org.opencontainers.image.description="PostgreSQL with pl/java build environment preinstalled (Debian)"
+LABEL org.opencontainers.image.source="https://github.com/tada/pljava"
+
+RUN apt-get update && apt-get install -y postgresql-17-pljava
+
+# we normally copy files to /usr/share/java - that's where '-java' packages go.
+# but for now we're reusing exsting jar
+
+COPY 1-install-pljava.sql /docker-entrypoint-initdb.d/
+COPY 2-install-backend.sql /docker-entrypoint-initdb.d/
+
diff --git a/pljava-examples-spring-boot/backend/src/main/docker/examples.ddr b/pljava-examples-spring-boot/backend/src/main/docker/examples.ddr
new file mode 100644
index 000000000..cf3bc52f6
--- /dev/null
+++ b/pljava-examples-spring-boot/backend/src/main/docker/examples.ddr
@@ -0,0 +1,200 @@
+SQLActions[ ] = {
+ "BEGIN INSTALL
+ CREATE SCHEMA javatest;
+ BEGIN PostgreSQL SET search_path TO javatest,public ENd postgreSQL;
+
+ CREATE FUNCTION javatest.java_getSystemProperty(varchar)
+ RETURNS varchar
+ AS 'java.lang.System.getProperty'
+ LANGUAGE java;
+
+ /* This function should fail since file system access is
+ * prohibited when the language is trusted.
+ */
+ CREATE FUNCTION javatest.create_temp_file_trusted()
+ RETURNS varchar
+ AS 'org.postgresql.pljava.example.Security.createTempFile'
+ LANGUAGE java;
+
+ CREATE TABLE javatest.username_test
+ (
+ name text,
+ username text not null
+ );
+
+ CREATE FUNCTION javatest.insert_username()
+ RETURNS trigger
+ AS 'org.postgresql.pljava.example.Triggers.insertUsername'
+ LANGUAGE java;
+
+ CREATE FUNCTION javatest.after_username_insert()
+ RETURNS trigger
+ AS 'org.postgresql.pljava.example.Triggers.afterUsernameInsert'
+ LANGUAGE java;
+
+ CREATE FUNCTION javatest.after_username_update()
+ RETURNS trigger
+ AS 'org.postgresql.pljava.example.Triggers.afterUsernameUpdate'
+ LANGUAGE java;
+
+ CREATE FUNCTION javatest.leak_statements()
+ RETURNS trigger
+ AS 'org.postgresql.pljava.example.Triggers.leakStatements'
+ LANGUAGE java;
+
+ CREATE TRIGGER insert_usernames
+ BEFORE INSERT OR UPDATE ON username_test
+ FOR EACH ROW
+ EXECUTE PROCEDURE insert_username (username);
+
+ CREATE TRIGGER after_insert_usernames
+ AFTER INSERT ON username_test
+ FOR EACH ROW
+ EXECUTE PROCEDURE after_username_insert (username);
+
+ CREATE TRIGGER after_username_updates
+ AFTER UPDATE ON username_test
+ FOR EACH ROW
+ EXECUTE PROCEDURE after_username_update (username);
+
+ CREATE TRIGGER username_leak
+ BEFORE UPDATE ON username_test
+ FOR EACH ROW
+ EXECUTE PROCEDURE leak_statements();
+
+ CREATE TABLE javatest.mdt
+ (
+ id int4,
+ idesc text,
+ moddate timestamp DEFAULT CURRENT_TIMESTAMP NOT NULL
+ );
+
+ CREATE FUNCTION javatest.moddatetime()
+ RETURNS trigger
+ AS 'org.postgresql.pljava.example.Triggers.moddatetime'
+ LANGUAGE java;
+
+ CREATE TRIGGER mdt_moddatetime
+ BEFORE UPDATE ON mdt
+ FOR EACH ROW
+ EXECUTE PROCEDURE moddatetime (moddate);
+
+ CREATE TYPE javatest._testSetReturn
+ AS (base integer, incbase integer, ctime timestamptz);
+
+ CREATE FUNCTION javatest.tupleReturnExample(int, int)
+ RETURNS _testSetReturn
+ AS 'org.postgresql.pljava.example.TupleReturn.tupleReturn'
+ IMMUTABLE LANGUAGE java;
+
+ CREATE FUNCTION javatest.tupleReturnExample2(int, int)
+ RETURNS _testSetReturn
+ AS 'org.postgresql.pljava.example.TupleReturn.tupleReturn(java.lang.Integer, java.lang.Integer, java.sql.ResultSet)'
+ IMMUTABLE LANGUAGE java;
+
+ CREATE FUNCTION javatest.tupleReturnToString(_testSetReturn)
+ RETURNS VARCHAR
+ AS 'org.postgresql.pljava.example.TupleReturn.makeString'
+ IMMUTABLE LANGUAGE java;
+
+ CREATE FUNCTION javatest.setReturnExample(int, int)
+ RETURNS SETOF javatest._testSetReturn
+ AS 'org.postgresql.pljava.example.TupleReturn.setReturn'
+ IMMUTABLE LANGUAGE java;
+
+ CREATE FUNCTION javatest.hugeResult(int)
+ RETURNS SETOF javatest._testSetReturn
+ AS 'org.postgresql.pljava.example.HugeResultSet.executeSelect'
+ IMMUTABLE LANGUAGE java;
+
+ CREATE FUNCTION javatest.hugeNonImmutableResult(int)
+ RETURNS SETOF javatest._testSetReturn
+ AS 'org.postgresql.pljava.example.HugeResultSet.executeSelect'
+ LANGUAGE java;
+
+ CREATE TYPE javatest._properties
+ AS (name varchar(200), value varchar(200));
+
+ CREATE FUNCTION javatest.propertyExample()
+ RETURNS SETOF javatest._properties
+ AS 'org.postgresql.pljava.example.UsingProperties.getProperties'
+ IMMUTABLE LANGUAGE java;
+
+ CREATE FUNCTION javatest.resultSetPropertyExample()
+ RETURNS SETOF javatest._properties
+ AS 'org.postgresql.pljava.example.UsingPropertiesAsResultSet.getProperties'
+ IMMUTABLE LANGUAGE java;
+
+ CREATE FUNCTION javatest.scalarPropertyExample()
+ RETURNS SETOF varchar
+ AS 'org.postgresql.pljava.example.UsingPropertiesAsScalarSet.getProperties'
+ IMMUTABLE LANGUAGE java;
+
+ CREATE FUNCTION javatest.randomInts(int)
+ RETURNS SETOF int
+ AS 'org.postgresql.pljava.example.RandomInts.createIterator'
+ IMMUTABLE LANGUAGE java;
+
+ CREATE FUNCTION javatest.listSupers()
+ RETURNS SETOF pg_user
+ AS 'org.postgresql.pljava.example.Users.listSupers'
+ LANGUAGE java;
+
+ CREATE FUNCTION javatest.listNonSupers()
+ RETURNS SETOF pg_user
+ AS 'org.postgresql.pljava.example.Users.listNonSupers'
+ LANGUAGE java;
+
+ CREATE FUNCTION javatest.logMessage(varchar, varchar)
+ RETURNS void
+ AS 'org.postgresql.pljava.example.LoggerTest.logMessage'
+ LANGUAGE java;
+
+ CREATE TYPE javatest.BinaryColumnPair
+ AS (col1 bytea, col2 bytea);
+
+ CREATE FUNCTION javatest.binaryColumnTest()
+ RETURNS SETOF javatest.BinaryColumnPair
+ AS 'org.postgresql.pljava.example.BinaryColumnTest.getBinaryPairs'
+ IMMUTABLE LANGUAGE java;
+
+ CREATE TYPE javatest.MetaDataBooleans
+ AS (method_name varchar(200), result boolean);
+
+ CREATE FUNCTION javatest.getMetaDataBooleans()
+ RETURNS SETOF javatest.MetaDataBooleans
+ AS 'org.postgresql.pljava.example.MetaDataBooleans.getDatabaseMetaDataBooleans'
+ LANGUAGE java;
+
+ CREATE TYPE javatest.MetaDataStrings
+ AS (method_name varchar(200), result varchar);
+
+ CREATE FUNCTION javatest.getMetaDataStrings()
+ RETURNS SETOF javatest.MetaDataStrings
+ AS 'org.postgresql.pljava.example.MetaDataStrings.getDatabaseMetaDataStrings'
+ LANGUAGE java;
+
+ CREATE TYPE javatest.MetaDataInts
+ AS (method_name varchar(200), result int);
+
+ CREATE FUNCTION javatest.getMetaDataInts()
+ RETURNS SETOF javatest.MetaDataInts
+ AS 'org.postgresql.pljava.example.MetaDataInts.getDatabaseMetaDataInts'
+ LANGUAGE java;
+
+ CREATE FUNCTION javatest.callMetaDataMethod(varchar)
+ RETURNS SETOF varchar
+ AS 'org.postgresql.pljava.example.MetaDataTest.callMetaDataMethod'
+ LANGUAGE java;
+
+ CREATE FUNCTION javatest.executeSelect(varchar)
+ RETURNS SETOF VARCHAR
+ AS 'org.postgresql.pljava.example.ResultSetTest.executeSelect'
+ LANGUAGE java;
+
+ END INSTALL",
+
+ "BEGIN REMOVE
+ DROP SCHEMA javatest CASCADE;
+ END REMOVE"
+ }
diff --git a/pljava-examples-spring-boot/backend/src/main/docker/make-docker.sh b/pljava-examples-spring-boot/backend/src/main/docker/make-docker.sh
new file mode 100644
index 000000000..523eeae66
--- /dev/null
+++ b/pljava-examples-spring-boot/backend/src/main/docker/make-docker.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+docker build -t tada/pljava-examples:17.3-1.6.9-bookworm .
\ No newline at end of file
diff --git a/pljava-examples-spring-boot/backend/src/main/java/org/postgresql/pljava/examples/spring-boot/Main.java b/pljava-examples-spring-boot/backend/src/main/java/org/postgresql/pljava/examples/spring-boot/Main.java
new file mode 100644
index 000000000..f4b18c1eb
--- /dev/null
+++ b/pljava-examples-spring-boot/backend/src/main/java/org/postgresql/pljava/examples/spring-boot/Main.java
@@ -0,0 +1,7 @@
+package org.postgresql;
+
+public class Main {
+ public static void main(String[] args) {
+ System.out.println("This is the module pushed to the database server");
+ }
+}
\ No newline at end of file
diff --git a/pljava-examples-spring-boot/pom.xml b/pljava-examples-spring-boot/pom.xml
new file mode 100644
index 000000000..e13b2777d
--- /dev/null
+++ b/pljava-examples-spring-boot/pom.xml
@@ -0,0 +1,66 @@
+
+
+ 4.0.0
+
+ org.postgresql
+ pljava.app
+ 2-SNAPSHOT
+
+ pljava-examples-spring-boot
+ pom
+
+ PL/Java examples using spring boot - (top level)
+ Examples of Spring Boot + Test Containers for Java stored procedures using PL/Java
+
+
+ backend
+ test-framework
+ application
+
+
+
+ 3.17.0
+
+ 42.7.7
+
+
+ 11.9.1
+ 10.0.0
+
+
+
+
+
+ org.apache.commons
+ commons-lang3
+ ${commons-lang3.version}
+
+
+
+ org.postgresql
+ postgresql
+ ${postgresql-jdbc.version}
+
+
+
+
+ org.flywaydb
+ flyway-core
+ ${flyway.version}
+
+
+
+ org.flywaydb
+ flyway-database-postgresql
+ ${flyway.version}
+
+
+
+ org.flywaydb.flyway-test-extensions
+ flyway-spring6-test
+ ${flyway-test-extensions.version}
+
+
+
+
diff --git a/pljava-examples-spring-boot/test-framework/pom.xml b/pljava-examples-spring-boot/test-framework/pom.xml
new file mode 100644
index 000000000..e2558a1d8
--- /dev/null
+++ b/pljava-examples-spring-boot/test-framework/pom.xml
@@ -0,0 +1,201 @@
+
+
+ 4.0.0
+
+ org.postgresql
+ pljava-examples-spring-boot
+ 2-SNAPSHOT
+ ../pom.xml
+
+ test-framework
+ PL/Java examples using spring boot - test framework
+
+
+ This module implements a testcontainer-based test framework. There are currently
+ two containers provided: AugmentedPostgreSQLContainer (basic) and
+ PlJavaAwarePostgreSQLContainer (with pl/java preinstalled).
+
+
+
+
+
+
+ 3.3.12
+
+ 42.7.7
+
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring-boot.version}
+ pom
+ import
+
+
+
+
+
+
+ org.apache.commons
+ commons-lang3
+
+
+
+
+ org.flywaydb
+ flyway-core
+ test
+
+
+
+ org.flywaydb
+ flyway-database-postgresql
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+
+
+ org.springframework
+ spring-beans
+
+
+
+ org.springframework
+ spring-core
+
+
+
+ org.springframework
+ spring-context
+
+
+
+
+
+ org.springframework
+ spring-jdbc
+
+
+
+
+
+
+
+
+ com.zaxxer
+ HikariCP
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ org.springframework.boot
+ spring-boot-testcontainers
+ test
+
+
+
+
+ org.springframework
+ spring-test
+
+
+
+ org.testcontainers
+ postgresql
+ test
+
+
+
+ org.testcontainers
+ junit-jupiter
+ test
+
+
+
+ org.postgresql
+ postgresql
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ test
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 3.4.2
+
+
+
+ test-jar
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pljava-examples-spring-boot/test-framework/src/main/java/org/postgresql/pljava/examples/springframework/Main.java b/pljava-examples-spring-boot/test-framework/src/main/java/org/postgresql/pljava/examples/springframework/Main.java
new file mode 100644
index 000000000..4f3bcb025
--- /dev/null
+++ b/pljava-examples-spring-boot/test-framework/src/main/java/org/postgresql/pljava/examples/springframework/Main.java
@@ -0,0 +1,7 @@
+package org.postgresql.pljava.examples.springframework;
+
+public class Main {
+ public static void main(String[] args) {
+ System.out.println("This is a testing framework - there should be little to nothing in 'main'");
+ }
+}
\ No newline at end of file
diff --git a/pljava-examples-spring-boot/test-framework/src/main/java/org/postgresql/pljava/examples/springframework/config/DataSourceConfig.java b/pljava-examples-spring-boot/test-framework/src/main/java/org/postgresql/pljava/examples/springframework/config/DataSourceConfig.java
new file mode 100644
index 000000000..d81bb4c38
--- /dev/null
+++ b/pljava-examples-spring-boot/test-framework/src/main/java/org/postgresql/pljava/examples/springframework/config/DataSourceConfig.java
@@ -0,0 +1,62 @@
+package org.postgresql.pljava.examples.springframework.config;
+
+import com.zaxxer.hikari.HikariDataSource;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+
+import javax.sql.DataSource;
+
+import static org.apache.commons.lang3.StringUtils.isNotBlank;
+
+@Configuration
+@Profile("dev")
+public class DataSourceConfig {
+ @Value(value = "${spring.datasource.url}")
+ private String url;
+
+ @Value("${spring.datasource.username}")
+ private String username;
+
+ @Value("${spring.datasource.password}")
+ private String password;
+
+ @Value("${spring.datasource.driverClassName}")
+ private String driverClassName;
+
+ @Value("${spring.datasource.connectionTestQuery}")
+ private String connectionTestQuery;
+
+ @Bean
+ public DataSource dataSource() {
+ // @formatter:off
+ return dataSourceProperties()
+ .initializeDataSourceBuilder()
+ .type(HikariDataSource.class)
+ .build();
+ // @formatter:on
+ }
+
+ /*
+ * Datasource properties
+ *
+ * @return
+ */
+ @Bean
+ public DataSourceProperties dataSourceProperties() {
+ final DataSourceProperties props = new org.springframework.boot.autoconfigure.jdbc.DataSourceProperties();
+ props.setUrl(url);
+ props.setUsername(username);
+ props.setPassword(password);
+ if (isNotBlank(driverClassName)) {
+ props.setDriverClassName(driverClassName);
+ }
+ // if (isNotBlank(connectionTestQuery)) {
+ // props.setConnectionTestQuery(connectionTestQuery);
+ // }
+
+ return props;
+ }
+}
diff --git a/pljava-examples-spring-boot/test-framework/src/main/java/org/postgresql/pljava/examples/springframework/config/PersistenceConfig.java b/pljava-examples-spring-boot/test-framework/src/main/java/org/postgresql/pljava/examples/springframework/config/PersistenceConfig.java
new file mode 100644
index 000000000..f37abc1e0
--- /dev/null
+++ b/pljava-examples-spring-boot/test-framework/src/main/java/org/postgresql/pljava/examples/springframework/config/PersistenceConfig.java
@@ -0,0 +1,56 @@
+package org.postgresql.pljava.examples.springframework.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+import javax.sql.DataSource;
+
+/**
+ * This class configures the persistence implementation.
+ */
+@Configuration
+@EnableTransactionManagement
+public class PersistenceConfig {
+
+ // @Autowired
+ // private Environment environment;
+
+ @Autowired
+ private DataSource dataSource;
+
+ // ---------------------------------------------------------------------
+ // code beyond this point is boilerplate
+ // ---------------------------------------------------------------------
+
+ @Bean
+ public TransactionAwareDataSourceProxy transactionAwareDataSource() {
+ return new TransactionAwareDataSourceProxy(dataSource);
+ }
+
+ @Bean
+ public DataSourceTransactionManager transactionManager() {
+ return new DataSourceTransactionManager(dataSource);
+ }
+
+ // ---------------------------------------------------------------------
+ // code beyond this point is boilerplate for Spring + jOOQ
+ // ---------------------------------------------------------------------
+
+ /*
+ @Bean
+ public DataSourceConnectionProvider connectionProvider() {
+ return new DataSourceConnectionProvider(transactionAwareDataSource());
+ }
+ */
+
+ /*
+ @Bean
+ public ExceptionTranslator exceptionTransformer() {
+ return new ExceptionTranslator();
+ }
+ */
+}
diff --git a/pljava-examples-spring-boot/test-framework/src/main/java/org/postgresql/pljava/examples/springframework/security/LogDatabaseMetaData.java b/pljava-examples-spring-boot/test-framework/src/main/java/org/postgresql/pljava/examples/springframework/security/LogDatabaseMetaData.java
new file mode 100644
index 000000000..44b8dae8c
--- /dev/null
+++ b/pljava-examples-spring-boot/test-framework/src/main/java/org/postgresql/pljava/examples/springframework/security/LogDatabaseMetaData.java
@@ -0,0 +1,218 @@
+package org.postgresql.pljava.examples.springframework.security;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.net.URI;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+import static org.apache.commons.lang3.StringUtils.isNotBlank;
+
+/**
+ * Log DatabaseMetaData (Database + Driver)
+ *
+ * This class provides a user-friendly description of the
+ * database and driver properties in a DatabaseMetaData object.
+ * It is intended to be easily found when skimming through
+ * logs - the same information should also be recorded in
+ * a log-analyzer-friendly format.
+ *
+ * This method should be called the first time the database
+ * is used, and then at regular interval. The latter ensures
+ * that the information is available despite log rotation.
+ *
+ * This has been incredibly useful in the past - you would
+ * be shocked how often an error is because of a connection
+ * to the wrong database!
+ *
+ * This class has been put in the `security` package since
+ * the site may wish to mask some or all of the data, with
+ * modified filtering based on the Spring Profile, the location
+ * of the server (e.g., 'localhost'), etc.
+ */
+public class LogDatabaseMetaData {
+
+ private LogDatabaseMetaData() {
+ }
+
+ /**
+ * Provide information about the database and local client
+ *
+ * Note: we can also look at /etc/os-release - it's on many (not all)
+ * linux * distros. It would allow us to record things like ID ("ubuntu"),
+ * VERSION_CODENAME ("ocular") and/or VERSION_ID ("24.10"). This is of
+ * secondary concern vs the database server and jdbc driver details but
+ * may still be useful.
+ *
+ * Determining the actual version of the database client package is also
+ * possible but much harder due to the number of ways that is captured.
+ *
+ * @param dbmd
+ * @param additionalInfo
+ * @return
+ * @throws SQLException
+ * @throws IOException
+ */
+
+ public static String format(DatabaseMetaData dbmd, Map> additionalInfo) throws SQLException, IOException {
+ try (StringWriter sw = new StringWriter();
+ PrintWriter pw = new PrintWriter(sw)) {
+ final String separator0 = "+================================================================================================+";
+ final String separator1 = "+--------------------+--------------------+------------------------------------------------------+";
+
+ final String format = "| %-18.18s : %-18.18s : %-52.52s |\n";
+
+ pw.println(separator0);
+ pw.printf(format, "Database Server", "Name", dbmd.getDatabaseProductName());
+ pw.printf(format, "", "Version", dbmd.getDatabaseProductVersion());
+ pw.printf(format, "", "URL", sanitizeJdbcUrl(dbmd.getURL()));
+ try (ResultSet rs = dbmd.getSchemas()) {
+ String label = dbmd.getSchemaTerm() + "s";
+ while (rs.next()) {
+ // remember 'catalog' is the same as the database name
+ pw.printf(format, "", label, rs.getString("TABLE_SCHEM"));
+ label = "";
+ }
+ }
+ pw.println(separator1);
+
+ pw.printf(format, "Driver", "Name", dbmd.getDriverName());
+ pw.printf(format, "", "Version", dbmd.getDriverVersion());
+ pw.printf(format, "", "JDBC Version", dbmd.getJDBCMajorVersion() + "." + dbmd.getJDBCMinorVersion());
+ pw.println(separator1);
+
+ pw.printf(format, "Client", "User", dbmd.getUserName());
+ pw.printf(format, "", "Connection", dbmd.getConnection().getClass().getName());
+ pw.println(separator1);
+
+ pw.printf(format, "Client Host", "User", System.getProperty("user.name"));
+ // this is the best we can do without a lot of extra effort
+ try (Stream lines = Files.lines(new File("/etc/hostname").toPath(), Charset.defaultCharset())) {
+ Optional hostname = lines.findFirst();
+ hostname.ifPresent(s -> pw.printf(format, "", "Hostname", s));
+ } catch (IOException e) {
+ // not a problem...
+ pw.printf(format, "", "Hostname", "(unknown)");
+ }
+ pw.printf(format, "", "OS Name", getOsDetails());
+ pw.printf(format, "", "OS Kernel", System.getProperty("os.version"));
+
+ if ((additionalInfo != null) && !additionalInfo.isEmpty()) {
+ for (Map.Entry> block : additionalInfo.entrySet()) {
+ if (!block.getValue().isEmpty()) {
+ pw.println(separator1);
+ String label = block.getKey();
+ for (Map.Entry entry : block.getValue().entrySet()) {
+ pw.printf(format, label, entry.getKey(), entry.getValue());
+ label = "";
+ }
+ }
+ }
+ pw.println(separator0);
+ }
+
+ pw.flush();
+ return sw.toString();
+ }
+ }
+
+ public static String format(DatabaseMetaData dbmd) throws SQLException, IOException {
+ return format(dbmd, Collections.emptyMap());
+ }
+
+ /**
+ * Sanitize JDBC URL
+ *
+ * A JDBC URL may have user credentials in both the hostname/password are and as
+ * a query fragment. This method strips those values.
+ *
+ * Note: The URI class doesn't understand subprotocols - for this we
+ * However the URI class doesn't understand subprotocols.
+ *
+ * @param url
+ * @return
+ */
+ static String sanitizeJdbcUrl(String url) {
+ if (!url.startsWith("jdbc:")) {
+ return "(undetermined)";
+ }
+
+ final URI uri = URI.create(url.substring(5)).normalize();
+
+ final StringBuilder sb = new StringBuilder("jdbc:");
+ sb.append(uri.getScheme());
+ sb.append("://");
+
+ sb.append(uri.getHost());
+ if (uri.getPort() > 0) {
+ sb.append(":" + uri.getPort());
+ }
+
+ if (isNotBlank(uri.getPath())) {
+ sb.append(uri.getPath());
+ }
+
+ // we *could* add query + fragments but only after ensuring we aren't providing credentials.
+ // LOG.info("query: {}", uri.getRawQuery());
+ // example: loggerLevel=cat /etc/os-rel;ease
+ return sb.toString();
+ }
+
+ /**
+ * Extract OS details from /etc/os-release (Linux-specific)
+ *
+ * @return
+ */
+ static String getOsDetails() {
+ try {
+ String name = null;
+ String id = null;
+ String version = null;
+
+ final List lines = Files.readAllLines(new File("/etc/os-release").toPath());
+ for (String line : lines) {
+ if (line.startsWith("PRETTY_NAME=")) {
+ return line.substring(12).replace("\"", "");
+ }
+
+ if (line.startsWith("NAME=")) {
+ name = line.substring(5);
+ } else if (line.startsWith("ID=")) {
+ id = line.substring(3);
+ } else if (line.startsWith("VERSION=")) {
+ version = line.substring(8);
+ }
+ }
+
+ StringBuilder sb = new StringBuilder();
+ if (isNotBlank(name)) {
+ sb.append(name);
+ } else if (isNotBlank(id)) {
+ sb.append(id);
+ } else {
+ return System.getProperty("os.name");
+ }
+
+ if (isNotBlank(version)) {
+ sb.append(" ");
+ sb.append(version);
+ }
+
+ return sb.toString().replace("\"", "");
+ } catch (IOException e) {
+ // not a problem - may not be Linux, etc....
+ }
+ return System.getProperty("os.name");
+ }
+}
+
diff --git a/pljava-examples-spring-boot/test-framework/src/test/java/org/postgresql/pljava/examples/springframework/config/PersistenceTestConfiguration.java b/pljava-examples-spring-boot/test-framework/src/test/java/org/postgresql/pljava/examples/springframework/config/PersistenceTestConfiguration.java
new file mode 100644
index 000000000..65e0da4b1
--- /dev/null
+++ b/pljava-examples-spring-boot/test-framework/src/test/java/org/postgresql/pljava/examples/springframework/config/PersistenceTestConfiguration.java
@@ -0,0 +1,25 @@
+package org.postgresql.pljava.examples.springframework.config;
+
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+
+/**
+ * Test configuration (test profile)
+ *
+ * Note: this class works with dynamic properties so there
+ * is no difference between using a temporary TestContainer
+ * or a permanent test server.
+ *
+ * @see "https://www.baeldung.com/spring-dynamicpropertysource"
+ */
+@EnableAutoConfiguration
+@Configuration
+@ComponentScan({
+ "org.postgresql.pljava.examples.testcontainers.config",
+ "org.postgresql.pljava.examples.testcontainers.security"
+})
+@Profile("test")
+public class PersistenceTestConfiguration {
+}
diff --git a/pljava-examples-spring-boot/test-framework/src/test/java/org/postgresql/pljava/examples/springframework/containers/AugmentedPostgreSQLContainer.java b/pljava-examples-spring-boot/test-framework/src/test/java/org/postgresql/pljava/examples/springframework/containers/AugmentedPostgreSQLContainer.java
new file mode 100644
index 000000000..fbc532ddc
--- /dev/null
+++ b/pljava-examples-spring-boot/test-framework/src/test/java/org/postgresql/pljava/examples/springframework/containers/AugmentedPostgreSQLContainer.java
@@ -0,0 +1,192 @@
+package org.postgresql.pljava.examples.springframework.containers;
+
+import com.github.dockerjava.api.command.InspectContainerResponse;
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+import org.postgresql.pljava.examples.springframework.security.LogDatabaseMetaData;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
+import org.testcontainers.containers.BindMode;
+import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.utility.DockerImageName;
+
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.Collections;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Stack;
+
+import static org.apache.commons.lang3.StringUtils.isNotBlank;
+
+// withLabel()
+// withLabels()
+// withCopyFileToContainer(MountableFile, path)
+// withCopyToContainer(Transferable, path)
+// BindMode = READ_ONLY, READ_WRITE
+// withClasspathResourceMapping(https://javadoc.io/static/org.testcontainers/testcontainers/1.19.3/org/testcontainers/containers/BindMode.html)
+
+public class AugmentedPostgreSQLContainer> extends PostgreSQLContainer {
+ private final Stack mdcStack = new Stack<>();
+
+ protected final Logger log;
+ protected final MySlf4jLogConsumer> logConsumer;
+
+ public AugmentedPostgreSQLContainer(String dockerImageName) {
+ this(dockerImageName, Collections.emptyMap());
+ }
+
+ public AugmentedPostgreSQLContainer(String dockerImageName, Map classpathResources) {
+ super(DockerImageName.parse(dockerImageName).asCompatibleSubstituteFor("postgres"));
+ mdcStack.push(MDC.putCloseable("imageName", dockerImageName));
+ mdcStack.push(MDC.putCloseable("containerId", " "));
+
+ StackTraceElement[] elements = Thread.currentThread().getStackTrace();
+ if (elements.length >= 2) {
+ this.log = LoggerFactory.getLogger(elements[2].getClassName());
+ } else {
+ this.log = LoggerFactory.getLogger(AugmentedPostgreSQLContainer.class);
+ }
+
+ this.logConsumer = new MySlf4jLogConsumer<>(this.log);
+ this.withLogConsumer(logConsumer);
+
+ // map is resourcePath -> containerPath
+ if (!classpathResources.isEmpty()) {
+ for (Map.Entry entry : classpathResources.entrySet()) {
+ log.info("adding {}", entry.getKey());
+ this.withClasspathResourceMapping(entry.getKey(), entry.getValue(), BindMode.READ_ONLY);
+ }
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void containerIsCreated(String containerId) {
+ try {
+ mdcStack.pop();
+ mdcStack.push(MDC.putCloseable("containerId", (containerId.length() < 12) ? containerId : containerId.substring(0, 12)));
+ } catch (IllegalArgumentException e) {
+ log.warn("{}: {}", e.getClass().getName(), e.getMessage());
+ }
+
+ super.containerIsCreated(containerId);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected void containerIsStarted(InspectContainerResponse containerInfo) {
+ super.containerIsStarted(containerInfo);
+ logConsumer.setDisableStdout(false);
+
+ log.info("\n" + getDetails(containerInfo));
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void stop() {
+ super.stop();
+
+ // drop MDC information
+ while (!mdcStack.isEmpty()) {
+ mdcStack.pop().close();
+ }
+ }
+
+ Map getContainerInfoMap(InspectContainerResponse containerInfo) {
+ final Map info = new LinkedHashMap<>();
+ info.put("Image Name", containerInfo.getConfig().getImage());
+ info.put("Container Name", containerInfo.getName());
+ if (isNotBlank(containerInfo.getConfig().getDomainName())) {
+ info.put("FDQN", containerInfo.getConfig().getHostName() + "." + containerInfo.getConfig().getDomainName());
+ } else {
+ info.put("FDQN", containerInfo.getConfig().getHostName());
+ }
+ info.put("Container Id", containerInfo.getId());
+ info.put("Container Image Id", containerInfo.getImageId());
+ info.put("Created On", containerInfo.getCreated());
+ // containerInfo.getHostConfig().
+ // info.put("conf user", containerInfo.getConfig().getUser());
+ // info.put("driver", containerInfo.getDriver());
+ // info.put("platform", containerInfo.getPlatform());
+ // info.put("processLabel", containerInfo.getProcessLabel());
+
+ return info;
+ }
+
+ Map getContainerLabelsMap(InspectContainerResponse containerInfo) {
+ final Map labels = new LinkedHashMap<>();
+ if (!containerInfo.getConfig().getLabels().isEmpty()) {
+ for (Map.Entry entry : containerInfo.getConfig().getLabels().entrySet()) {
+ final String[] elements = entry.getKey().split("\\.");
+ final StringBuilder sb = new StringBuilder();
+ if (elements.length > 1) {
+ for (String element : elements) {
+ sb.append(element.charAt(0));
+ sb.append(".");
+ }
+ if (sb.length() > 2) {
+ sb.setLength(sb.length() - 2);
+ }
+ }
+ sb.append(elements[elements.length - 1]);
+
+ // works even if there's no match!
+ labels.put(sb.toString(), entry.getKey() + ": " + entry.getValue());
+ }
+ }
+
+ return labels;
+ }
+
+ protected String getDetails(InspectContainerResponse containerInfo) {
+ final Map> additionalInformation = new LinkedHashMap<>();
+
+ try (Connection conn = this.hikariDataSource().getConnection();
+ Statement stmt = conn.createStatement()) {
+
+ try (ResultSet rs = stmt.executeQuery("select * from pg_catalog.pg_extension")) {
+ final Map extensions = new LinkedHashMap<>();
+ while (rs.next()) {
+ extensions.put(rs.getString("extname"), rs.getString("extversion"));
+ }
+
+ additionalInformation.put("Server Extensions", extensions);
+ additionalInformation.put("Container Details", getContainerInfoMap(containerInfo));
+ final Map labels = getContainerLabelsMap(containerInfo);
+ if (!labels.isEmpty()) {
+ additionalInformation.put("Container Labels", labels);
+ }
+ }
+
+ return LogDatabaseMetaData.format(conn.getMetaData(), additionalInformation);
+ } catch (SQLException | IOException e) {
+ final String message = String.format("%s: unable to get connection: %s", e.getClass().getName(), e.getMessage()); // .withUsername("test") new PostgreSQLContainer<>(TEST_IMAGE_NAME) {
+ return "";
+ }
+ }
+
+ public HikariDataSource hikariDataSource() {
+ final HikariConfig config = new HikariConfig();
+ config.setJdbcUrl(getJdbcUrl());
+ config.setUsername(getUsername());
+ config.setPassword(getPassword());
+ if (isNotBlank(getDriverClassName())) {
+ config.setDriverClassName(getDriverClassName());
+ }
+ if (isNotBlank(getTestQueryString())) {
+ config.setConnectionTestQuery(getTestQueryString());
+ }
+ return new HikariDataSource(config);
+ }
+}
diff --git a/pljava-examples-spring-boot/test-framework/src/test/java/org/postgresql/pljava/examples/springframework/containers/MySlf4jLogConsumer.java b/pljava-examples-spring-boot/test-framework/src/test/java/org/postgresql/pljava/examples/springframework/containers/MySlf4jLogConsumer.java
new file mode 100644
index 000000000..f53be31ea
--- /dev/null
+++ b/pljava-examples-spring-boot/test-framework/src/test/java/org/postgresql/pljava/examples/springframework/containers/MySlf4jLogConsumer.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2024 Bear Giles .
+ * All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.postgresql.pljava.examples.springframework.containers;
+
+import org.slf4j.Logger;
+import org.testcontainers.containers.output.BaseConsumer;
+import org.testcontainers.containers.output.OutputFrame;
+
+import java.util.function.Consumer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * Improved TestContainer LogConsumer
+ *
+ * One of the biggest problems we face is identifying the underlying cause
+ * of any failed database call. The database server logs usually have this
+ * information (although it may be disabled in production due to security
+ * concerns) but it can be hard for developers to access those logs.
+ *
+ * This is where the LogConsumer implementations come in. The 'STDOUT'
+ * messages can usually be ignored unless you need to verify that
+ * the server has been property initialized. In contrast the 'STDERR'
+ * messages often contains a much more precise error message than we
+ * get from the JDBC driver. This can save a lot of time.
+ *
+ * This LogConsumer also removes a bit of the cruft that's duplicated
+ * in our log headers. This makes the messages easier to read.
+ *
+ * @param
+ */
+@SuppressWarnings("unused")
+public class MySlf4jLogConsumer> extends BaseConsumer implements Consumer {
+ private final Logger log;
+
+ private final Pattern ISO_PATTERN = Pattern.compile("^([0-9]{4}-[0-9]{2}-[0-9]{2}[T ][0-9]{2}:[0-9]{2}:[0-9]{2}(.[0-9]+)?( UTC)?) (.+)$");
+
+ private boolean disableStdout = true;
+
+ public MySlf4jLogConsumer(Logger log) {
+ this.log = log;
+ super.setRemoveColorCodes(false);
+ }
+
+ /**
+ * Set 'disable stdout' flag
+ *
+ * @param disableStdout disable 'STDOUT' if true
+ */
+ public void setDisableStdout(boolean disableStdout) {
+ this.disableStdout = disableStdout;
+ }
+
+ /**
+ * Returns whether stdout is disabled
+ *
+ * @return true if 'STDOUT' is disabled
+ */
+ public boolean isDisableStdout() {
+ return disableStdout;
+ }
+
+ /**
+ * Remove cruft from the message
+ *
+ * At this time the only thing we remove is a leading timestamp.
+ *
+ * @param message raw message received from container
+ * @return simplified message
+ */
+ String removeCruft(String message) {
+
+ // match and remove leading timestamps
+ final Matcher isoMatcher = ISO_PATTERN.matcher(message);
+ if (isoMatcher.find()) {
+ return isoMatcher.group(isoMatcher.groupCount());
+ }
+
+ return message;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void accept(OutputFrame outputFrame) {
+ switch (outputFrame.getType()) {
+ case STDOUT:
+ if (!disableStdout && log.isInfoEnabled()) {
+ log.info(removeCruft(outputFrame.getUtf8String().trim()));
+ }
+ break;
+ case STDERR:
+ log.warn(removeCruft(outputFrame.getUtf8String().trim()));
+ break;
+ case END:
+ log.info(outputFrame.getUtf8String());
+ }
+ }
+}
diff --git a/pljava-examples-spring-boot/test-framework/src/test/java/org/postgresql/pljava/examples/springframework/extensions/PostgreSQLContainerExtension.java b/pljava-examples-spring-boot/test-framework/src/test/java/org/postgresql/pljava/examples/springframework/extensions/PostgreSQLContainerExtension.java
new file mode 100644
index 000000000..c5d4acd10
--- /dev/null
+++ b/pljava-examples-spring-boot/test-framework/src/test/java/org/postgresql/pljava/examples/springframework/extensions/PostgreSQLContainerExtension.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright (c) 2024 Bear Giles .
+ * All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.postgresql.pljava.examples.springframework.extensions;
+
+import org.junit.jupiter.api.extension.AfterAllCallback;
+import org.junit.jupiter.api.extension.BeforeAllCallback;
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.postgresql.pljava.examples.springframework.containers.MySlf4jLogConsumer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testcontainers.containers.PostgreSQLContainer;
+import org.testcontainers.containers.output.OutputFrame;
+import org.testcontainers.utility.DockerImageName;
+
+import java.util.function.Consumer;
+
+import static org.apache.commons.lang3.StringUtils.isNotBlank;
+
+/**
+ * JUnit test extension that provides a PostgreSQL test container
+ *
+ * This class publishes the required connection properties via
+ * system properties and the JUnit ExtensionContext. This allows
+ * the embedded server to be treated like any other server when
+ * initializing the spring beans.
+ *
+ * In addition, the embedded server uses FlywayDB to initialize the
+ * database with the contents of the `db/migration` directory.
+ * The COPY command is not yet supported but TestContainers
+ * do have a mechanism that would allow us to copy files to the
+ * container prior to running the flyway engine.
+ *
+ * We have two options(*) when providing a DataSource to other spring
+ * beans. We can use a static TestContainer instance so we use the
+ * DynamicPropertyRegistry or we can use a JUnit test extension
+ * that does not limit us to a single static instance.
+ *
+ * The former may seem easiest but it appears to require duplicating
+ * the code in every test class. At least that's been my experience
+ * to date.
+ *
+ * The latter is a little more complicated - and I definitely don't
+ * like it requiring the use of the system properties - but it also
+ * provides more flexibility since it's easy to see how it could
+ * handle FlywayDB initialization better than the current embedded
+ * approach. That would be useful if you want to use different
+ * initialization files.
+ *
+ * (*) There are many other options - but they may rely on the
+ * use of a specific version of Spring Boot, etc., so it's risky
+ * to assume they'll be available. The JUnit test extension may
+ * not be the cleanest approach but it should be widely available.
+ *
+ * @param PostgreSQLContainer
+ * @see "https://www.baeldung.com/spring-dynamicpropertysource"
+ * @see "https://junit.org/junit5/docs/current/api/org.junit.jupiter.api/org/junit/jupiter/api/extension/ExtensionContext.html"
+ */
+public class PostgreSQLContainerExtension> implements BeforeAllCallback, AfterAllCallback {
+ private static final Logger LOG = LoggerFactory.getLogger(PostgreSQLContainerExtension.class);
+
+ final String LOCAL_IMAGE_NAME = "tada/pljava:17.3-bookworm-local";
+
+ final DockerImageName TEST_IMAGE_NAME =
+ DockerImageName
+ .parse(LOCAL_IMAGE_NAME)
+ .asCompatibleSubstituteFor("postgres");
+
+ public final PostgreSQLContainer container;
+
+ protected PostgreSQLContainer newContainer(Consumer logConsumer) {
+ /*
+ PostgreSQLContainer container = new AugmentedContainer(TEST_IMAGE_NAME, LOG)
+ // .withDatabaseName("test")
+ // .withUserName("test")
+ // .withPassword("password")
+ .withLogConsumer(logConsumer)
+ .withEnv("POSTGRES_PASSWORD", "password");
+
+ container.start();
+
+ System.setProperty("spring.datasource.url", container.getJdbcUrl());
+ System.setProperty("spring.datasource.username", container.getUsername());
+ System.setProperty("spring.datasource.password", container.getPassword());
+ if (isNotBlank(container.getDriverClassName())) {
+ System.setProperty("spring.datasource.driverClassName", container.getDriverClassName());
+ }
+ if (isNotBlank(container.getTestQueryString())) {
+ System.setProperty("spring.datasource.connectionTestQuery", container.getTestQueryString());
+ }
+
+ return container;
+ */
+ return null;
+ }
+
+ private final Logger log = LoggerFactory.getLogger("Container[" + LOCAL_IMAGE_NAME + "]");
+ private final Consumer logConsumer = new MySlf4jLogConsumer<>(log);
+
+ // @Autowired
+ // private Environment env;
+
+ /**
+ * Default constructor
+ */
+ public PostgreSQLContainerExtension() {
+
+ // super.withEnv(Map.of("LANG", "en_US.UTF8", "LC_ALL", "en_US.UTF8"));
+ // super.withLocalCompose(true);
+
+ // LOG.info("LC_ALL: {}", env.get("ALL"));
+ // LOG.info("-----------------------------------");
+
+ /*
+ org.testcontainers.utility.
+ Transferable t = new Transferable();
+ super.copyFileToContainer(transferable, "/etc/locale.conf");
+ */
+ this.container = newContainer(logConsumer);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void beforeAll(ExtensionContext context) throws Exception {
+ System.setProperty("spring.datasource.url", container.getJdbcUrl());
+ System.setProperty("spring.datasource.username", container.getUsername());
+ System.setProperty("spring.datasource.password", container.getPassword());
+ if (isNotBlank(container.getDriverClassName())) {
+ System.setProperty("spring.datasource.driverClassName", container.getDriverClassName());
+ }
+ if (isNotBlank(container.getTestQueryString())) {
+ System.setProperty("spring.datasource.connectionTestQuery", container.getTestQueryString());
+ }
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void afterAll(ExtensionContext context) throws Exception {
+ if (container.isRunning()) {
+ container.stop();
+ }
+ }
+}
diff --git a/pljava-examples-spring-boot/test-framework/src/test/resources/application.yml b/pljava-examples-spring-boot/test-framework/src/test/resources/application.yml
new file mode 100644
index 000000000..4c7e989e6
--- /dev/null
+++ b/pljava-examples-spring-boot/test-framework/src/test/resources/application.yml
@@ -0,0 +1,11 @@
+---
+spring:
+ application:
+ name: pljava-examples-testcontainers
+ main:
+ web-application-type: none
+ datasource:
+ # url: 'jdbc:postgresql://localhost:5432/'
+ # username:
+ # password:
+ # driverClassName: org.postgresql.Driver
\ No newline at end of file
diff --git a/pljava-examples-spring-boot/test-framework/src/test/resources/logback-test.xml b/pljava-examples-spring-boot/test-framework/src/test/resources/logback-test.xml
new file mode 100644
index 000000000..f9c08036a
--- /dev/null
+++ b/pljava-examples-spring-boot/test-framework/src/test/resources/logback-test.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} %green([%X{imageName} - %X{containerId}]) %highlight(%-5level)
+ %cyan([%c{24}:%L]) - %m%n"
+
+
+
+
+
+
+ ${LOG_FILE_INFO}
+
+ ${LOG_FILE_INFO}.%d{yyyy-MM-dd}.log
+ 30
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%c:%L] - %m%n"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/BinaryColumnTest.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/BinaryColumnTest.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/BinaryColumnTest.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/BinaryColumnTest.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/HugeResultSet.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/HugeResultSet.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/HugeResultSet.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/HugeResultSet.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/LoggerTest.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/LoggerTest.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/LoggerTest.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/LoggerTest.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/MetaDataBooleans.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/MetaDataBooleans.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/MetaDataBooleans.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/MetaDataBooleans.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/MetaDataInts.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/MetaDataInts.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/MetaDataInts.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/MetaDataInts.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/MetaDataStrings.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/MetaDataStrings.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/MetaDataStrings.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/MetaDataStrings.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/MetaDataTest.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/MetaDataTest.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/MetaDataTest.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/MetaDataTest.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/RandomInts.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/RandomInts.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/RandomInts.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/RandomInts.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/ResultSetTest.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/ResultSetTest.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/ResultSetTest.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/ResultSetTest.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/Security.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/Security.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/Security.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/Security.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/Threads.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/Threads.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/Threads.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/Threads.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/Triggers.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/Triggers.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/Triggers.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/Triggers.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/TupleReturn.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/TupleReturn.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/TupleReturn.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/TupleReturn.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/Users.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/Users.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/Users.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/Users.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/UsingProperties.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/UsingProperties.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/UsingProperties.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/UsingProperties.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/UsingPropertiesAsResultSet.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/UsingPropertiesAsResultSet.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/UsingPropertiesAsResultSet.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/UsingPropertiesAsResultSet.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/UsingPropertiesAsScalarSet.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/UsingPropertiesAsScalarSet.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/UsingPropertiesAsScalarSet.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/UsingPropertiesAsScalarSet.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/Aggregates.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/Aggregates.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/Aggregates.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/Aggregates.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/AnyTest.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/AnyTest.java
similarity index 97%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/AnyTest.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/AnyTest.java
index f1f7515b7..99b1709b0 100644
--- a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/AnyTest.java
+++ b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/AnyTest.java
@@ -20,7 +20,7 @@
import static org.postgresql.pljava.annotation.Function.Effects.IMMUTABLE;
import static
org.postgresql.pljava.annotation.Function.OnNullInput.RETURNS_NULL;
-import org.postgresql.pljava.annotation.SQLAction;
+
import org.postgresql.pljava.annotation.SQLType;
/**
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/ComplexScalar.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/ComplexScalar.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/ComplexScalar.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/ComplexScalar.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/ComplexTuple.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/ComplexTuple.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/ComplexTuple.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/ComplexTuple.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/ConditionalDDR.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/ConditionalDDR.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/ConditionalDDR.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/ConditionalDDR.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/Enumeration.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/Enumeration.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/Enumeration.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/Enumeration.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/Holdability.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/Holdability.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/Holdability.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/Holdability.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/IntWithMod.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/IntWithMod.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/IntWithMod.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/IntWithMod.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/JDBC42_21.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/JDBC42_21.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/JDBC42_21.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/JDBC42_21.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/MishandledExceptions.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/MishandledExceptions.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/MishandledExceptions.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/MishandledExceptions.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/Modules.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/Modules.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/Modules.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/Modules.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/OnInterface.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/OnInterface.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/OnInterface.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/OnInterface.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/PGF1010962.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/PGF1010962.java
similarity index 98%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/PGF1010962.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/PGF1010962.java
index 747f2ef6d..c8c14391a 100644
--- a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/PGF1010962.java
+++ b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/PGF1010962.java
@@ -1,6 +1,5 @@
package org.postgresql.pljava.example.annotation;
-import java.sql.Array;
import java.sql.ResultSet;
import java.sql.SQLException;
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/Parameters.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/Parameters.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/Parameters.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/Parameters.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/PassXML.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/PassXML.java
similarity index 99%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/PassXML.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/PassXML.java
index d6dd14bfc..2ac4d2b2d 100644
--- a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/PassXML.java
+++ b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/PassXML.java
@@ -20,7 +20,6 @@
import java.sql.SQLInput;
import java.sql.SQLOutput;
import java.sql.SQLXML;
-import java.sql.Statement;
import java.sql.Types;
import java.sql.SQLDataException;
@@ -76,7 +75,6 @@
import static org.postgresql.pljava.example.LoggerTest.logMessage;
/* Imports needed just for the SAX flavor of "low-level XML echo" below */
-import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.XMLReader;
import org.xml.sax.ContentHandler;
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/Point.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/Point.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/Point.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/Point.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/PreJSR310.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/PreJSR310.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/PreJSR310.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/PreJSR310.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/RecordParameterDefaults.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/RecordParameterDefaults.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/RecordParameterDefaults.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/RecordParameterDefaults.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/ReturnComposite.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/ReturnComposite.java
similarity index 99%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/ReturnComposite.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/ReturnComposite.java
index fb9965d0e..25cddd57d 100644
--- a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/ReturnComposite.java
+++ b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/ReturnComposite.java
@@ -12,7 +12,6 @@
package org.postgresql.pljava.example.annotation;
import java.sql.ResultSet;
-import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.util.Iterator;
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/SPIActions.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/SPIActions.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/SPIActions.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/SPIActions.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/SetOfRecordTest.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/SetOfRecordTest.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/SetOfRecordTest.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/SetOfRecordTest.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/ThreadTest.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/ThreadTest.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/ThreadTest.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/ThreadTest.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/Triggers.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/Triggers.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/Triggers.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/Triggers.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/TypeRoundTripper.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/TypeRoundTripper.java
similarity index 99%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/TypeRoundTripper.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/TypeRoundTripper.java
index 8c3151556..acc65e5c6 100644
--- a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/TypeRoundTripper.java
+++ b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/TypeRoundTripper.java
@@ -12,7 +12,7 @@
package org.postgresql.pljava.example.annotation;
import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
+
import static java.lang.reflect.Modifier.isPublic;
import static java.lang.reflect.Modifier.isStatic;
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/UDTScalarIOTest.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/UDTScalarIOTest.java
similarity index 98%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/UDTScalarIOTest.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/UDTScalarIOTest.java
index 659a5e2ab..14183b333 100644
--- a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/UDTScalarIOTest.java
+++ b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/UDTScalarIOTest.java
@@ -29,8 +29,6 @@
import java.nio.CharBuffer;
import static java.nio.charset.StandardCharsets.UTF_8;
import java.nio.charset.CharacterCodingException;
-import java.nio.charset.CharsetDecoder;
-import java.nio.charset.CharsetEncoder;
import java.util.Arrays;
import java.util.Scanner;
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/UnicodeRoundTripTest.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/UnicodeRoundTripTest.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/UnicodeRoundTripTest.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/UnicodeRoundTripTest.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/UsingProperties.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/UsingProperties.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/UsingProperties.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/UsingProperties.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/UsingPropertiesAsScalarSet.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/UsingPropertiesAsScalarSet.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/UsingPropertiesAsScalarSet.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/UsingPropertiesAsScalarSet.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/Variadic.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/Variadic.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/Variadic.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/Variadic.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/VarlenaUDTTest.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/VarlenaUDTTest.java
similarity index 100%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/VarlenaUDTTest.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/VarlenaUDTTest.java
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/XMLRenderedTypes.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/XMLRenderedTypes.java
similarity index 95%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/XMLRenderedTypes.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/XMLRenderedTypes.java
index 812233d15..c6cb1e70b 100644
--- a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/XMLRenderedTypes.java
+++ b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/XMLRenderedTypes.java
@@ -19,8 +19,6 @@
import org.postgresql.pljava.annotation.SQLAction;
import org.postgresql.pljava.annotation.SQLType;
-import static org.postgresql.pljava.example.LoggerTest.logMessage;
-
/**
* Class illustrating use of {@link SQLXML} to operate on non-XML data types
* for which PL/Java provides an XML rendering.
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/package-info.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/package-info.java
similarity index 80%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/package-info.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/package-info.java
index 20ea8b40b..2d88d3e8c 100644
--- a/pljava-examples/src/main/java/org/postgresql/pljava/example/annotation/package-info.java
+++ b/pljava-examples/src/main/java/org/spring-boot/pljava/example/annotation/package-info.java
@@ -4,4 +4,3 @@
* @author Thomas Hallgren
* @author Chapman Flack
*/
-package org.postgresql.pljava.example.annotation;
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/package-info.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/package-info.java
similarity index 86%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/package-info.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/package-info.java
index 8a348b8c0..2b9c1a953 100644
--- a/pljava-examples/src/main/java/org/postgresql/pljava/example/package-info.java
+++ b/pljava-examples/src/main/java/org/spring-boot/pljava/example/package-info.java
@@ -4,4 +4,3 @@
* not having been reworked to use annotations yet.
* @author Thomas Hallgren
*/
-package org.postgresql.pljava.example;
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/saxon/S9.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/saxon/S9.java
similarity index 99%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/saxon/S9.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/saxon/S9.java
index d14c8f5e8..28304cd01 100644
--- a/pljava-examples/src/main/java/org/postgresql/pljava/example/saxon/S9.java
+++ b/pljava-examples/src/main/java/org/spring-boot/pljava/example/saxon/S9.java
@@ -20,7 +20,6 @@
import java.sql.ResultSetMetaData;
import static java.sql.ResultSetMetaData.columnNoNulls;
import java.sql.SQLXML;
-import java.sql.Statement;
import java.sql.Types;
import java.sql.SQLException;
@@ -42,15 +41,12 @@
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
-import java.util.List;
import java.util.Map;
-import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.xml.transform.Source;
-import javax.xml.transform.Result;
import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
import static javax.xml.XMLConstants.XML_NS_URI;
diff --git a/pljava-examples/src/main/java/org/postgresql/pljava/example/saxon/package-info.java b/pljava-examples/src/main/java/org/spring-boot/pljava/example/saxon/package-info.java
similarity index 83%
rename from pljava-examples/src/main/java/org/postgresql/pljava/example/saxon/package-info.java
rename to pljava-examples/src/main/java/org/spring-boot/pljava/example/saxon/package-info.java
index 1e8429521..ee745139b 100644
--- a/pljava-examples/src/main/java/org/postgresql/pljava/example/saxon/package-info.java
+++ b/pljava-examples/src/main/java/org/spring-boot/pljava/example/saxon/package-info.java
@@ -4,4 +4,3 @@
* line (which will also cause Saxon-HE to be downloaded).
* @author Chapman Flack
*/
-package org.postgresql.pljava.example.saxon;
diff --git a/pljava-examples/src/main/resources/org/postgresql/pljava/example/annotation/example.properties b/pljava-examples/src/main/resources/org/spring-boot/pljava/example/annotation/example.properties
similarity index 100%
rename from pljava-examples/src/main/resources/org/postgresql/pljava/example/annotation/example.properties
rename to pljava-examples/src/main/resources/org/spring-boot/pljava/example/annotation/example.properties
diff --git a/pljava-examples/src/main/resources/org/postgresql/pljava/example/example.properties b/pljava-examples/src/main/resources/org/spring-boot/pljava/example/example.properties
similarity index 100%
rename from pljava-examples/src/main/resources/org/postgresql/pljava/example/example.properties
rename to pljava-examples/src/main/resources/org/spring-boot/pljava/example/example.properties
diff --git a/pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/AbstractPGXS.java b/pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/AbstractPGXS.java
similarity index 100%
rename from pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/AbstractPGXS.java
rename to pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/AbstractPGXS.java
diff --git a/pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/GoalScript.java b/pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/GoalScript.java
similarity index 100%
rename from pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/GoalScript.java
rename to pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/GoalScript.java
diff --git a/pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/PGXSUtils.java b/pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/PGXSUtils.java
similarity index 100%
rename from pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/PGXSUtils.java
rename to pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/PGXSUtils.java
diff --git a/pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/RelativizingFileManager.java b/pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/RelativizingFileManager.java
similarity index 100%
rename from pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/RelativizingFileManager.java
rename to pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/RelativizingFileManager.java
diff --git a/pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/ReportScript.java b/pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/ReportScript.java
similarity index 100%
rename from pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/ReportScript.java
rename to pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/ReportScript.java
diff --git a/pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/ReportScriptingMojo.java b/pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/ReportScriptingMojo.java
similarity index 100%
rename from pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/ReportScriptingMojo.java
rename to pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/ReportScriptingMojo.java
diff --git a/pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/ScriptEngineLoader.java b/pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/ScriptEngineLoader.java
similarity index 100%
rename from pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/ScriptEngineLoader.java
rename to pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/ScriptEngineLoader.java
diff --git a/pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/ScriptingMojo.java b/pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/ScriptingMojo.java
similarity index 98%
rename from pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/ScriptingMojo.java
rename to pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/ScriptingMojo.java
index 489f679bd..ae3aab58c 100644
--- a/pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/ScriptingMojo.java
+++ b/pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/ScriptingMojo.java
@@ -26,9 +26,7 @@
import javax.script.Invocable;
import javax.script.ScriptEngine;
-import java.util.function.BiConsumer;
import java.util.function.BiFunction;
-import java.util.function.Function;
import static javax.script.ScriptContext.ENGINE_SCOPE;
diff --git a/pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/package-info.java b/pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/package-info.java
similarity index 94%
rename from pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/package-info.java
rename to pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/package-info.java
index 68ca19d3f..40eebcd38 100644
--- a/pljava-pgxs/src/main/java/org/postgresql/pljava/pgxs/package-info.java
+++ b/pljava-pgxs/src/main/java/org/spring-boot/pljava/pgxs/package-info.java
@@ -15,4 +15,3 @@
* the PL/Java Native C code. It also provides a maven plugin goal for utilising
* JavaScript during maven SITE lifecycle phase.
*/
-package org.postgresql.pljava.pgxs;
\ No newline at end of file
diff --git a/pljava/src/main/java/org/postgresql/pljava/elog/ELogFormatter.java b/pljava/src/main/java/org/spring-boot/pljava/elog/ELogFormatter.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/elog/ELogFormatter.java
rename to pljava/src/main/java/org/spring-boot/pljava/elog/ELogFormatter.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/elog/ELogHandler.java b/pljava/src/main/java/org/spring-boot/pljava/elog/ELogHandler.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/elog/ELogHandler.java
rename to pljava/src/main/java/org/spring-boot/pljava/elog/ELogHandler.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/elog/package-info.java b/pljava/src/main/java/org/spring-boot/pljava/elog/package-info.java
similarity index 94%
rename from pljava/src/main/java/org/postgresql/pljava/elog/package-info.java
rename to pljava/src/main/java/org/spring-boot/pljava/elog/package-info.java
index ad0218b6a..771bf6d43 100644
--- a/pljava/src/main/java/org/postgresql/pljava/elog/package-info.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/elog/package-info.java
@@ -15,4 +15,3 @@
* PostgreSQL's error logging mechanisms, isolated here in a package that can be
* exported to the {@code java.logging} module, as that API requires.
*/
-package org.postgresql.pljava.elog;
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/AclId.java b/pljava/src/main/java/org/spring-boot/pljava/internal/AclId.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/AclId.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/AclId.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/Backend.java b/pljava/src/main/java/org/spring-boot/pljava/internal/Backend.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/Backend.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/Backend.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/ByteBufferInputStream.java b/pljava/src/main/java/org/spring-boot/pljava/internal/ByteBufferInputStream.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/ByteBufferInputStream.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/ByteBufferInputStream.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/ByteBufferXMLReader.java b/pljava/src/main/java/org/spring-boot/pljava/internal/ByteBufferXMLReader.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/ByteBufferXMLReader.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/ByteBufferXMLReader.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/Checked.java b/pljava/src/main/java/org/spring-boot/pljava/internal/Checked.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/Checked.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/Checked.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/DualState.java b/pljava/src/main/java/org/spring-boot/pljava/internal/DualState.java
similarity index 99%
rename from pljava/src/main/java/org/postgresql/pljava/internal/DualState.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/DualState.java
index 438bc4a9d..68d935188 100644
--- a/pljava/src/main/java/org/postgresql/pljava/internal/DualState.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/internal/DualState.java
@@ -24,7 +24,6 @@
import java.util.Deque;
import java.util.HashMap;
import java.util.IdentityHashMap;
-import java.util.List;
import java.util.Map;
import java.util.NoSuchElementException;
import java.util.Queue;
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/EntryPoints.java b/pljava/src/main/java/org/spring-boot/pljava/internal/EntryPoints.java
similarity index 99%
rename from pljava/src/main/java/org/postgresql/pljava/internal/EntryPoints.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/EntryPoints.java
index 82f042795..aaacf25e4 100644
--- a/pljava/src/main/java/org/postgresql/pljava/internal/EntryPoints.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/internal/EntryPoints.java
@@ -28,7 +28,6 @@
import static java.util.Objects.requireNonNull;
-import org.postgresql.pljava.internal.UncheckedException;
import static org.postgresql.pljava.internal.UncheckedException.unchecked;
/*
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/ErrorData.java b/pljava/src/main/java/org/spring-boot/pljava/internal/ErrorData.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/ErrorData.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/ErrorData.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/ExecutionPlan.java b/pljava/src/main/java/org/spring-boot/pljava/internal/ExecutionPlan.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/ExecutionPlan.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/ExecutionPlan.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/Function.java b/pljava/src/main/java/org/spring-boot/pljava/internal/Function.java
similarity index 99%
rename from pljava/src/main/java/org/postgresql/pljava/internal/Function.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/Function.java
index 83ba3ba05..b009af9ea 100644
--- a/pljava/src/main/java/org/postgresql/pljava/internal/Function.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/internal/Function.java
@@ -12,7 +12,6 @@
package org.postgresql.pljava.internal;
import java.lang.invoke.MethodHandle;
-import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodHandles.Lookup;
import static java.lang.invoke.MethodHandles.arrayElementGetter;
import static java.lang.invoke.MethodHandles.arrayElementSetter;
@@ -37,7 +36,6 @@
import java.lang.invoke.WrongMethodTypeException;
import java.lang.reflect.Array;
-import java.lang.reflect.Method;
import java.lang.reflect.GenericDeclaration;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
@@ -56,8 +54,6 @@
import java.sql.SQLData;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
-import java.sql.SQLInput;
-import java.sql.SQLOutput;
import java.sql.SQLNonTransientException;
import java.sql.SQLSyntaxErrorException;
@@ -86,7 +82,7 @@
import static org.postgresql.pljava.internal.Backend.getListConfigOption;
import static org.postgresql.pljava.internal.Backend.WITHOUT_ENFORCEMENT;
import static org.postgresql.pljava.internal.Backend.allowingUnenforcedUDT;
-import org.postgresql.pljava.internal.EntryPoints;
+
import org.postgresql.pljava.internal.EntryPoints.Invocable;
import static org.postgresql.pljava.internal.EntryPoints.invocable;
import static org.postgresql.pljava.internal.EntryPoints.loadAndInitWithACC;
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/InstallHelper.java b/pljava/src/main/java/org/spring-boot/pljava/internal/InstallHelper.java
similarity index 99%
rename from pljava/src/main/java/org/postgresql/pljava/internal/InstallHelper.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/InstallHelper.java
index add6b5635..eee25b108 100644
--- a/pljava/src/main/java/org/postgresql/pljava/internal/InstallHelper.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/internal/InstallHelper.java
@@ -12,7 +12,6 @@
package org.postgresql.pljava.internal;
import java.io.InputStream;
-import java.io.InputStreamReader;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
@@ -25,7 +24,6 @@
import java.security.Security;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
-import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/MarkableSequenceInputStream.java b/pljava/src/main/java/org/spring-boot/pljava/internal/MarkableSequenceInputStream.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/MarkableSequenceInputStream.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/MarkableSequenceInputStream.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/MarkableSequenceReader.java b/pljava/src/main/java/org/spring-boot/pljava/internal/MarkableSequenceReader.java
similarity index 99%
rename from pljava/src/main/java/org/postgresql/pljava/internal/MarkableSequenceReader.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/MarkableSequenceReader.java
index 82b101d8d..236b5a2f1 100644
--- a/pljava/src/main/java/org/postgresql/pljava/internal/MarkableSequenceReader.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/internal/MarkableSequenceReader.java
@@ -17,7 +17,6 @@
import java.lang.reflect.UndeclaredThrowableException;
import java.util.LinkedList;
-import java.util.List;
import java.util.ListIterator;
/**
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/ObjectPoolImpl.java b/pljava/src/main/java/org/spring-boot/pljava/internal/ObjectPoolImpl.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/ObjectPoolImpl.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/ObjectPoolImpl.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/Oid.java b/pljava/src/main/java/org/spring-boot/pljava/internal/Oid.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/Oid.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/Oid.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/PgSavepoint.java b/pljava/src/main/java/org/spring-boot/pljava/internal/PgSavepoint.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/PgSavepoint.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/PgSavepoint.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/Portal.java b/pljava/src/main/java/org/spring-boot/pljava/internal/Portal.java
similarity index 99%
rename from pljava/src/main/java/org/postgresql/pljava/internal/Portal.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/Portal.java
index 363f2bb1b..007f9b59a 100644
--- a/pljava/src/main/java/org/postgresql/pljava/internal/Portal.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/internal/Portal.java
@@ -12,7 +12,6 @@
*/
package org.postgresql.pljava.internal;
-import org.postgresql.pljava.internal.SPI; // for javadoc
import static org.postgresql.pljava.internal.Backend.doInPG;
import java.sql.SQLException;
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/Privilege.java b/pljava/src/main/java/org/spring-boot/pljava/internal/Privilege.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/Privilege.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/Privilege.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/Relation.java b/pljava/src/main/java/org/spring-boot/pljava/internal/Relation.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/Relation.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/Relation.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/ResultSetPicker.java b/pljava/src/main/java/org/spring-boot/pljava/internal/ResultSetPicker.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/ResultSetPicker.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/ResultSetPicker.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/SPI.java b/pljava/src/main/java/org/spring-boot/pljava/internal/SPI.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/SPI.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/SPI.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/SPIException.java b/pljava/src/main/java/org/spring-boot/pljava/internal/SPIException.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/SPIException.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/SPIException.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/SQL_ASCII.java b/pljava/src/main/java/org/spring-boot/pljava/internal/SQL_ASCII.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/SQL_ASCII.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/SQL_ASCII.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/ServerException.java b/pljava/src/main/java/org/spring-boot/pljava/internal/ServerException.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/ServerException.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/ServerException.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/Session.java b/pljava/src/main/java/org/spring-boot/pljava/internal/Session.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/Session.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/Session.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/SubXactListener.java b/pljava/src/main/java/org/spring-boot/pljava/internal/SubXactListener.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/SubXactListener.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/SubXactListener.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/SyntheticXMLReader.java b/pljava/src/main/java/org/spring-boot/pljava/internal/SyntheticXMLReader.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/SyntheticXMLReader.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/SyntheticXMLReader.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/TransactionalMap.java b/pljava/src/main/java/org/spring-boot/pljava/internal/TransactionalMap.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/TransactionalMap.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/TransactionalMap.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/TriggerData.java b/pljava/src/main/java/org/spring-boot/pljava/internal/TriggerData.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/TriggerData.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/TriggerData.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/Tuple.java b/pljava/src/main/java/org/spring-boot/pljava/internal/Tuple.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/Tuple.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/Tuple.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/TupleDesc.java b/pljava/src/main/java/org/spring-boot/pljava/internal/TupleDesc.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/TupleDesc.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/TupleDesc.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/TupleTable.java b/pljava/src/main/java/org/spring-boot/pljava/internal/TupleTable.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/TupleTable.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/TupleTable.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/UncheckedException.java b/pljava/src/main/java/org/spring-boot/pljava/internal/UncheckedException.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/UncheckedException.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/UncheckedException.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/UnhandledPGException.java b/pljava/src/main/java/org/spring-boot/pljava/internal/UnhandledPGException.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/UnhandledPGException.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/UnhandledPGException.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/VarlenaWrapper.java b/pljava/src/main/java/org/spring-boot/pljava/internal/VarlenaWrapper.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/VarlenaWrapper.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/VarlenaWrapper.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/VarlenaXMLRenderer.java b/pljava/src/main/java/org/spring-boot/pljava/internal/VarlenaXMLRenderer.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/VarlenaXMLRenderer.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/VarlenaXMLRenderer.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/XactListener.java b/pljava/src/main/java/org/spring-boot/pljava/internal/XactListener.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/internal/XactListener.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/XactListener.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/internal/package-info.java b/pljava/src/main/java/org/spring-boot/pljava/internal/package-info.java
similarity index 90%
rename from pljava/src/main/java/org/postgresql/pljava/internal/package-info.java
rename to pljava/src/main/java/org/spring-boot/pljava/internal/package-info.java
index c63144d25..68f51a4d6 100644
--- a/pljava/src/main/java/org/postgresql/pljava/internal/package-info.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/internal/package-info.java
@@ -8,4 +8,3 @@
>pljava-so.
* @author Thomas Hallgren
*/
-package org.postgresql.pljava.internal;
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/AbstractResultSet.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/AbstractResultSet.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/AbstractResultSet.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/AbstractResultSet.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/AbstractResultSetMetaData.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/AbstractResultSetMetaData.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/AbstractResultSetMetaData.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/AbstractResultSetMetaData.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/BlobValue.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/BlobValue.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/BlobValue.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/BlobValue.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/BuiltinFunctions.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/BuiltinFunctions.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/BuiltinFunctions.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/BuiltinFunctions.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/ClobValue.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/ClobValue.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/ClobValue.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/ClobValue.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/Invocation.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/Invocation.java
similarity index 98%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/Invocation.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/Invocation.java
index 88301d0be..6d67feedc 100644
--- a/pljava/src/main/java/org/postgresql/pljava/jdbc/Invocation.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/jdbc/Invocation.java
@@ -12,12 +12,8 @@
*/
package org.postgresql.pljava.jdbc;
-import java.sql.PreparedStatement;
import java.sql.SQLException;
-import java.util.ArrayList;
-import java.util.logging.Logger;
-import org.postgresql.pljava.internal.Backend;
import static org.postgresql.pljava.internal.Backend.doInPG;
import org.postgresql.pljava.internal.PgSavepoint;
import org.postgresql.pljava.internal.ServerException; // for javadoc
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/ObjectResultSet.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/ObjectResultSet.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/ObjectResultSet.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/ObjectResultSet.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/PgNodeTreeAsXML.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/PgNodeTreeAsXML.java
similarity index 99%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/PgNodeTreeAsXML.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/PgNodeTreeAsXML.java
index 8d5de171b..51507eb08 100644
--- a/pljava/src/main/java/org/postgresql/pljava/jdbc/PgNodeTreeAsXML.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/jdbc/PgNodeTreeAsXML.java
@@ -23,7 +23,6 @@
import java.sql.SQLException;
-import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.xml.sax.SAXException;
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/ReadOnlyResultSet.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/ReadOnlyResultSet.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/ReadOnlyResultSet.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/ReadOnlyResultSet.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/ResultSetBase.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/ResultSetBase.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/ResultSetBase.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/ResultSetBase.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/ResultSetField.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/ResultSetField.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/ResultSetField.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/ResultSetField.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SPIConnection.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SPIConnection.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SPIConnection.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SPIConnection.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SPIDatabaseMetaData.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SPIDatabaseMetaData.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SPIDatabaseMetaData.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SPIDatabaseMetaData.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SPIDriver.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SPIDriver.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SPIDriver.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SPIDriver.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SPIParameterMetaData.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SPIParameterMetaData.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SPIParameterMetaData.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SPIParameterMetaData.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SPIPreparedStatement.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SPIPreparedStatement.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SPIPreparedStatement.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SPIPreparedStatement.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SPIReadOnlyControl.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SPIReadOnlyControl.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SPIReadOnlyControl.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SPIReadOnlyControl.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SPIResultSet.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SPIResultSet.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SPIResultSet.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SPIResultSet.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SPIResultSetMetaData.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SPIResultSetMetaData.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SPIResultSetMetaData.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SPIResultSetMetaData.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SPIStatement.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SPIStatement.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SPIStatement.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SPIStatement.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SQLChunkIOOrder.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SQLChunkIOOrder.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SQLChunkIOOrder.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SQLChunkIOOrder.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SQLInputFromChunk.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SQLInputFromChunk.java
similarity index 97%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SQLInputFromChunk.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SQLInputFromChunk.java
index 24dda80b7..3e2caaa86 100644
--- a/pljava/src/main/java/org/postgresql/pljava/jdbc/SQLInputFromChunk.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SQLInputFromChunk.java
@@ -17,13 +17,11 @@
import java.io.Reader;
import java.io.StringReader;
import java.math.BigDecimal;
-import java.net.MalformedURLException;
import java.net.URI;
-import java.net.URISyntaxException;
import java.net.URL;
import java.nio.ByteBuffer;
import static java.nio.charset.StandardCharsets.UTF_8;
-import java.nio.charset.CharsetDecoder;
+
import java.sql.Array;
import java.sql.Blob;
import java.sql.Clob;
@@ -40,8 +38,6 @@
import java.sql.Time;
import java.sql.Timestamp;
-import org.postgresql.pljava.internal.Backend;
-
import static org.postgresql.pljava.jdbc.SQLChunkIOOrder.MIRROR_P2J;
import static org.postgresql.pljava.jdbc.SQLChunkIOOrder.SCALAR_P2J;
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SQLInputFromTuple.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SQLInputFromTuple.java
similarity index 99%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SQLInputFromTuple.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SQLInputFromTuple.java
index 2b99e01ba..b1a29f880 100644
--- a/pljava/src/main/java/org/postgresql/pljava/jdbc/SQLInputFromTuple.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SQLInputFromTuple.java
@@ -31,7 +31,6 @@
import java.sql.Time;
import java.sql.Timestamp;
-import org.postgresql.pljava.internal.Backend;
import org.postgresql.pljava.internal.DualState;
import org.postgresql.pljava.internal.TupleDesc;
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SQLOutputToChunk.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SQLOutputToChunk.java
similarity index 99%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SQLOutputToChunk.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SQLOutputToChunk.java
index 5524b70c2..065907b9a 100644
--- a/pljava/src/main/java/org/postgresql/pljava/jdbc/SQLOutputToChunk.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SQLOutputToChunk.java
@@ -12,11 +12,9 @@
*/
package org.postgresql.pljava.jdbc;
-import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
-import java.io.StringWriter;
import java.math.BigDecimal;
import java.nio.BufferOverflowException;
import java.nio.ByteBuffer;
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SQLOutputToTuple.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SQLOutputToTuple.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SQLOutputToTuple.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SQLOutputToTuple.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SQLUtils.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SQLUtils.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SQLUtils.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SQLUtils.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SQLXMLImpl.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SQLXMLImpl.java
similarity index 99%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SQLXMLImpl.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SQLXMLImpl.java
index 8baae3dd7..7844431c2 100644
--- a/pljava/src/main/java/org/postgresql/pljava/jdbc/SQLXMLImpl.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SQLXMLImpl.java
@@ -30,14 +30,12 @@
import java.io.FilterInputStream;
import java.io.IOException;
-import java.lang.invoke.MethodHandles.Lookup;
import static java.lang.invoke.MethodHandles.lookup;
import java.lang.invoke.VarHandle;
import java.nio.charset.Charset;
import static java.nio.charset.StandardCharsets.US_ASCII;
-import org.postgresql.pljava.internal.Backend;
import static org.postgresql.pljava.internal.Backend.doInPG;
import org.postgresql.pljava.internal.MarkableSequenceInputStream;
@@ -46,12 +44,9 @@
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;
-import static javax.xml.stream.XMLStreamConstants.CDATA;
-import static javax.xml.stream.XMLStreamConstants.CHARACTERS;
import static javax.xml.stream.XMLStreamConstants.COMMENT;
import static javax.xml.stream.XMLStreamConstants.DTD;
import static javax.xml.stream.XMLStreamConstants.PROCESSING_INSTRUCTION;
-import static javax.xml.stream.XMLStreamConstants.SPACE;
import static javax.xml.stream.XMLStreamConstants.START_DOCUMENT;
import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
@@ -78,7 +73,6 @@
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
-import org.w3c.dom.Text;
import static org.postgresql.pljava.internal.Session.implServerCharset;
import org.postgresql.pljava.internal.VarlenaWrapper;
@@ -121,7 +115,6 @@
/* ... for SQLXMLImpl.SAXResultAdapter and .SAXUnwrapFilter */
-import javax.xml.transform.Transformer;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.ext.DefaultHandler2;
@@ -136,7 +129,6 @@
import javax.xml.namespace.NamespaceContext;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
-import javax.xml.stream.events.XMLEvent;
import javax.xml.stream.util.StreamReaderDelegate;
/* ... for static adopt() method, doing low-level copies from foreign objects */
@@ -145,7 +137,6 @@
import java.io.CharArrayReader;
import java.io.FilterReader;
-import javax.xml.stream.XMLEventWriter;
import javax.xml.stream.util.XMLEventConsumer;
import org.postgresql.pljava.internal.MarkableSequenceReader;
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SingleRowReader.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SingleRowReader.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SingleRowReader.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SingleRowReader.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SingleRowResultSet.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SingleRowResultSet.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SingleRowResultSet.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SingleRowResultSet.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SingleRowWriter.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SingleRowWriter.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SingleRowWriter.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SingleRowWriter.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/StatementClosedException.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/StatementClosedException.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/StatementClosedException.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/StatementClosedException.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SyntheticResultSet.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SyntheticResultSet.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SyntheticResultSet.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SyntheticResultSet.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/SyntheticResultSetMetaData.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/SyntheticResultSetMetaData.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/SyntheticResultSetMetaData.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/SyntheticResultSetMetaData.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/TriggerResultSet.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/TriggerResultSet.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/TriggerResultSet.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/TriggerResultSet.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/TypeBridge.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/TypeBridge.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/TypeBridge.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/TypeBridge.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/TypeOid.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/TypeOid.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/TypeOid.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/TypeOid.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/UnsupportedFeatureException.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/UnsupportedFeatureException.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/UnsupportedFeatureException.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/UnsupportedFeatureException.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/XMLEventToStreamConsumer.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/XMLEventToStreamConsumer.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/XMLEventToStreamConsumer.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/XMLEventToStreamConsumer.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/jdbc/package-info.java b/pljava/src/main/java/org/spring-boot/pljava/jdbc/package-info.java
similarity index 90%
rename from pljava/src/main/java/org/postgresql/pljava/jdbc/package-info.java
rename to pljava/src/main/java/org/spring-boot/pljava/jdbc/package-info.java
index 9a778080a..76263f54e 100644
--- a/pljava/src/main/java/org/postgresql/pljava/jdbc/package-info.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/jdbc/package-info.java
@@ -7,4 +7,3 @@
* comments in the code may be helpful in case of any question.
* @author Thomas Hallgren
*/
-package org.postgresql.pljava.jdbc;
diff --git a/pljava/src/main/java/org/postgresql/pljava/management/Commands.java b/pljava/src/main/java/org/spring-boot/pljava/management/Commands.java
similarity index 99%
rename from pljava/src/main/java/org/postgresql/pljava/management/Commands.java
rename to pljava/src/main/java/org/spring-boot/pljava/management/Commands.java
index ca186de3a..d1c069994 100644
--- a/pljava/src/main/java/org/postgresql/pljava/management/Commands.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/management/Commands.java
@@ -45,7 +45,7 @@
import java.util.ArrayList;
import static java.util.Arrays.fill;
import static java.util.Objects.requireNonNullElse;
-import java.util.jar.Attributes;
+
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
import java.util.logging.Logger;
diff --git a/pljava/src/main/java/org/postgresql/pljava/management/DDRExecutor.java b/pljava/src/main/java/org/spring-boot/pljava/management/DDRExecutor.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/management/DDRExecutor.java
rename to pljava/src/main/java/org/spring-boot/pljava/management/DDRExecutor.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/management/SQLDeploymentDescriptor.java b/pljava/src/main/java/org/spring-boot/pljava/management/SQLDeploymentDescriptor.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/management/SQLDeploymentDescriptor.java
rename to pljava/src/main/java/org/spring-boot/pljava/management/SQLDeploymentDescriptor.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/management/package-info.java b/pljava/src/main/java/org/spring-boot/pljava/management/package-info.java
similarity index 86%
rename from pljava/src/main/java/org/postgresql/pljava/management/package-info.java
rename to pljava/src/main/java/org/spring-boot/pljava/management/package-info.java
index 7af191369..64ebbcab0 100644
--- a/pljava/src/main/java/org/postgresql/pljava/management/package-info.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/management/package-info.java
@@ -5,4 +5,3 @@
* descriptions.
* @author Thomas Hallgren
*/
-package org.postgresql.pljava.management;
diff --git a/pljava/src/main/java/org/postgresql/pljava/mbeans/DualStateStatistics.java b/pljava/src/main/java/org/spring-boot/pljava/mbeans/DualStateStatistics.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/mbeans/DualStateStatistics.java
rename to pljava/src/main/java/org/spring-boot/pljava/mbeans/DualStateStatistics.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/mbeans/package-info.java b/pljava/src/main/java/org/spring-boot/pljava/mbeans/package-info.java
similarity index 94%
rename from pljava/src/main/java/org/postgresql/pljava/mbeans/package-info.java
rename to pljava/src/main/java/org/spring-boot/pljava/mbeans/package-info.java
index 808708438..a40c2cb64 100644
--- a/pljava/src/main/java/org/postgresql/pljava/mbeans/package-info.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/mbeans/package-info.java
@@ -16,4 +16,3 @@
* package, as the interfaces must be accessible to a JMX module that is
* dynamic and unnamed.
*/
-package org.postgresql.pljava.mbeans;
diff --git a/pljava/src/main/java/org/postgresql/pljava/nopolicy/FrozenProperties.java b/pljava/src/main/java/org/spring-boot/pljava/nopolicy/FrozenProperties.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/nopolicy/FrozenProperties.java
rename to pljava/src/main/java/org/spring-boot/pljava/nopolicy/FrozenProperties.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/nopolicy/package-info.java b/pljava/src/main/java/org/spring-boot/pljava/nopolicy/package-info.java
similarity index 80%
rename from pljava/src/main/java/org/postgresql/pljava/nopolicy/package-info.java
rename to pljava/src/main/java/org/spring-boot/pljava/nopolicy/package-info.java
index 4b122cae1..470ccedd6 100644
--- a/pljava/src/main/java/org/postgresql/pljava/nopolicy/package-info.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/nopolicy/package-info.java
@@ -3,4 +3,3 @@
* in Java 24 and later with no security policy enforcement.
* @author Chapman Flack
*/
-package org.postgresql.pljava.nopolicy;
diff --git a/pljava/src/main/java/org/postgresql/pljava/policy/TrialPolicy.java b/pljava/src/main/java/org/spring-boot/pljava/policy/TrialPolicy.java
similarity index 99%
rename from pljava/src/main/java/org/postgresql/pljava/policy/TrialPolicy.java
rename to pljava/src/main/java/org/spring-boot/pljava/policy/TrialPolicy.java
index 320a66c48..b8dfadead 100644
--- a/pljava/src/main/java/org/postgresql/pljava/policy/TrialPolicy.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/policy/TrialPolicy.java
@@ -17,7 +17,6 @@
import java.security.CodeSource;
import java.security.NoSuchAlgorithmException;
-import java.security.Permission;
import java.security.PermissionCollection;
import java.security.Policy;
import java.security.ProtectionDomain;
diff --git a/pljava/src/main/java/org/postgresql/pljava/policy/package-info.java b/pljava/src/main/java/org/spring-boot/pljava/policy/package-info.java
similarity index 95%
rename from pljava/src/main/java/org/postgresql/pljava/policy/package-info.java
rename to pljava/src/main/java/org/spring-boot/pljava/policy/package-info.java
index dc411b58b..800fa60ab 100644
--- a/pljava/src/main/java/org/postgresql/pljava/policy/package-info.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/policy/package-info.java
@@ -19,4 +19,3 @@
* This package is exported to {@code java.base} to provide a custom
* {@code Permission} that can be granted in policy.
*/
-package org.postgresql.pljava.policy;
diff --git a/pljava/src/main/java/org/postgresql/pljava/sqlj/EntryStreamHandler.java b/pljava/src/main/java/org/spring-boot/pljava/sqlj/EntryStreamHandler.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/sqlj/EntryStreamHandler.java
rename to pljava/src/main/java/org/spring-boot/pljava/sqlj/EntryStreamHandler.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/sqlj/Handler.java b/pljava/src/main/java/org/spring-boot/pljava/sqlj/Handler.java
similarity index 100%
rename from pljava/src/main/java/org/postgresql/pljava/sqlj/Handler.java
rename to pljava/src/main/java/org/spring-boot/pljava/sqlj/Handler.java
diff --git a/pljava/src/main/java/org/postgresql/pljava/sqlj/Loader.java b/pljava/src/main/java/org/spring-boot/pljava/sqlj/Loader.java
similarity index 99%
rename from pljava/src/main/java/org/postgresql/pljava/sqlj/Loader.java
rename to pljava/src/main/java/org/spring-boot/pljava/sqlj/Loader.java
index ba21a7153..139dd0c88 100644
--- a/pljava/src/main/java/org/postgresql/pljava/sqlj/Loader.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/sqlj/Loader.java
@@ -16,7 +16,7 @@
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
-import java.lang.invoke.MethodType;
+
import static java.lang.invoke.MethodType.methodType;
import java.net.MalformedURLException;
@@ -36,7 +36,6 @@
import java.sql.SQLException;
import java.sql.Statement;
-import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
diff --git a/pljava/src/main/java/org/postgresql/pljava/sqlj/package-info.java b/pljava/src/main/java/org/spring-boot/pljava/sqlj/package-info.java
similarity index 83%
rename from pljava/src/main/java/org/postgresql/pljava/sqlj/package-info.java
rename to pljava/src/main/java/org/spring-boot/pljava/sqlj/package-info.java
index d45e110ba..c9910642f 100644
--- a/pljava/src/main/java/org/postgresql/pljava/sqlj/package-info.java
+++ b/pljava/src/main/java/org/spring-boot/pljava/sqlj/package-info.java
@@ -4,4 +4,3 @@
boolean) installJar}.
* @author Thomas Hallgren
*/
-package org.postgresql.pljava.sqlj;
diff --git a/pom.xml b/pom.xml
index 1063d27db..bf893f5cc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -56,8 +56,11 @@
pljava-so
pljava-ant
pljava-examples
+ pljava-examples-spring-boot
pljava-packaging
pljava-pgxs
+ pljava-examples-spring-boot/test-framework
+ pljava-examples-spring-boot/backend
@@ -99,7 +102,25 @@
4.13.1
test
-
+
+ com.zaxxer
+ HikariCP
+ 6.2.0
+ test
+
+
+ org.springframework
+ spring-beans
+ 6.2.7
+ test
+
+
+ org.testcontainers
+ testcontainers
+ 1.21.0
+ test
+
+