From 18b23bfc71ee837f902d96cc336302d521c43bb9 Mon Sep 17 00:00:00 2001
From: eelhazati <35301254+eelhazati@users.noreply.github.com>
Date: Sun, 1 Dec 2019 17:49:36 +0100
Subject: [PATCH] [BAEL-3443] How To Write A Quarkus Extension (#8260)
* quarkus extension
* add the extension module to default-first profile.
* 1.0.0.CR1 ==> 1.0.0.CR2
* Quarkus version ==> 1.0.0.Final
* remove comment.
* reorder module builds
---
pom.xml | 1 +
quarkus-extension/pom.xml | 18 +++++
quarkus-extension/quarkus-app/pom.xml | 71 +++++++++++++++++++
.../src/main/resources/application.properties | 10 +++
.../db/liquibase-changelog-master.xml | 21 ++++++
.../quarkus-liquibase/deployment/pom.xml | 61 ++++++++++++++++
.../quarkus/liquibase/LiquibaseProcessor.java | 40 +++++++++++
quarkus-extension/quarkus-liquibase/pom.xml | 25 +++++++
.../quarkus-liquibase/runtime/pom.xml | 67 +++++++++++++++++
.../quarkus/liquibase/LiquibaseConfig.java | 14 ++++
.../quarkus/liquibase/LiquibaseProducer.java | 32 +++++++++
.../quarkus/liquibase/LiquibaseRecorder.java | 25 +++++++
12 files changed, 385 insertions(+)
create mode 100644 quarkus-extension/pom.xml
create mode 100644 quarkus-extension/quarkus-app/pom.xml
create mode 100644 quarkus-extension/quarkus-app/src/main/resources/application.properties
create mode 100644 quarkus-extension/quarkus-app/src/main/resources/db/liquibase-changelog-master.xml
create mode 100644 quarkus-extension/quarkus-liquibase/deployment/pom.xml
create mode 100644 quarkus-extension/quarkus-liquibase/deployment/src/main/java/com/baeldung/quarkus/liquibase/LiquibaseProcessor.java
create mode 100644 quarkus-extension/quarkus-liquibase/pom.xml
create mode 100644 quarkus-extension/quarkus-liquibase/runtime/pom.xml
create mode 100644 quarkus-extension/quarkus-liquibase/runtime/src/main/java/com/baeldung/quarkus/liquibase/LiquibaseConfig.java
create mode 100644 quarkus-extension/quarkus-liquibase/runtime/src/main/java/com/baeldung/quarkus/liquibase/LiquibaseProducer.java
create mode 100644 quarkus-extension/quarkus-liquibase/runtime/src/main/java/com/baeldung/quarkus/liquibase/LiquibaseRecorder.java
diff --git a/pom.xml b/pom.xml
index 508b6921a7..272d198011 100644
--- a/pom.xml
+++ b/pom.xml
@@ -635,6 +635,7 @@
java-blockchain
machine-learning
wildfly
+ quarkus-extension
diff --git a/quarkus-extension/pom.xml b/quarkus-extension/pom.xml
new file mode 100644
index 0000000000..1a4f7b96fb
--- /dev/null
+++ b/quarkus-extension/pom.xml
@@ -0,0 +1,18 @@
+
+
+ 4.0.0
+
+ com.baeldung.quarkus.extension
+ quarkus-extension
+ 1.0-SNAPSHOT
+ Quarkus - Liquibase Extension
+ pom
+
+
+ quarkus-liquibase
+ quarkus-app
+
+
+
diff --git a/quarkus-extension/quarkus-app/pom.xml b/quarkus-extension/quarkus-app/pom.xml
new file mode 100644
index 0000000000..c4ce802418
--- /dev/null
+++ b/quarkus-extension/quarkus-app/pom.xml
@@ -0,0 +1,71 @@
+
+
+ 4.0.0
+ com.baeldung.quarkus.app
+ quarkus-app
+ 1.0-SNAPSHOT
+
+ UTF-8
+ 2.22.0
+ true
+ 1.0.0.Final
+ 3.8.1
+ 1.8
+ UTF-8
+ 1.8
+
+
+
+
+ io.quarkus
+ quarkus-universe-bom
+ ${quarkus.version}
+ pom
+ import
+
+
+
+
+
+ com.baeldung.quarkus.liquibase
+ quarkus-liquibase
+ 1.0-SNAPSHOT
+
+
+ io.quarkus
+ quarkus-jdbc-h2
+ ${quarkus.version}
+
+
+
+
+
+ io.quarkus
+ quarkus-maven-plugin
+ ${quarkus.version}
+
+
+
+ build
+
+
+
+
+
+ maven-compiler-plugin
+ ${compiler-plugin.version}
+
+
+ maven-surefire-plugin
+ ${surefire-plugin.version}
+
+
+ org.jboss.logmanager.LogManager
+
+
+
+
+
+
diff --git a/quarkus-extension/quarkus-app/src/main/resources/application.properties b/quarkus-extension/quarkus-app/src/main/resources/application.properties
new file mode 100644
index 0000000000..cd18d5a6d2
--- /dev/null
+++ b/quarkus-extension/quarkus-app/src/main/resources/application.properties
@@ -0,0 +1,10 @@
+# configure datasource
+#quarkus.datasource.url=jdbc:h2:tcp://localhost/~/test
+quarkus.datasource.url=jdbc:h2:mem:testdb
+quarkus.datasource.driver=org.h2.Driver
+quarkus.datasource.username=sa
+quarkus.datasource.password=
+
+#quarkus
+quarkus.liquibase.change-log=db/liquibase-changelog-master.xml
+
diff --git a/quarkus-extension/quarkus-app/src/main/resources/db/liquibase-changelog-master.xml b/quarkus-extension/quarkus-app/src/main/resources/db/liquibase-changelog-master.xml
new file mode 100644
index 0000000000..befef39140
--- /dev/null
+++ b/quarkus-extension/quarkus-app/src/main/resources/db/liquibase-changelog-master.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/quarkus-extension/quarkus-liquibase/deployment/pom.xml b/quarkus-extension/quarkus-liquibase/deployment/pom.xml
new file mode 100644
index 0000000000..b439a35a28
--- /dev/null
+++ b/quarkus-extension/quarkus-liquibase/deployment/pom.xml
@@ -0,0 +1,61 @@
+
+
+
+ quarkus-liquibase-parent
+ com.baeldung.quarkus.liquibase
+ 1.0-SNAPSHOT
+
+ 4.0.0
+ Quarkus - Liquibase - Deployment
+
+ quarkus-liquibase-deployment
+
+
+
+
+ io.quarkus
+ quarkus-core-deployment
+ ${quarkus.version}
+
+
+ io.quarkus
+ quarkus-arc-deployment
+ ${quarkus.version}
+
+
+ io.quarkus
+ quarkus-agroal-deployment
+ ${quarkus.version}
+
+
+
+ com.baeldung.quarkus.liquibase
+ quarkus-liquibase
+ ${project.version}
+
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+
+
+ io.quarkus
+ quarkus-extension-processor
+ ${quarkus.version}
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/quarkus-extension/quarkus-liquibase/deployment/src/main/java/com/baeldung/quarkus/liquibase/LiquibaseProcessor.java b/quarkus-extension/quarkus-liquibase/deployment/src/main/java/com/baeldung/quarkus/liquibase/LiquibaseProcessor.java
new file mode 100644
index 0000000000..3aff2eb105
--- /dev/null
+++ b/quarkus-extension/quarkus-liquibase/deployment/src/main/java/com/baeldung/quarkus/liquibase/LiquibaseProcessor.java
@@ -0,0 +1,40 @@
+package com.baeldung.quarkus.liquibase;
+
+import io.quarkus.agroal.deployment.DataSourceInitializedBuildItem;
+import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
+import io.quarkus.arc.deployment.BeanContainerBuildItem;
+import io.quarkus.arc.deployment.BeanContainerListenerBuildItem;
+import io.quarkus.deployment.annotations.BuildProducer;
+import io.quarkus.deployment.annotations.BuildStep;
+import io.quarkus.deployment.annotations.ExecutionTime;
+import io.quarkus.deployment.annotations.Record;
+import io.quarkus.deployment.builditem.FeatureBuildItem;
+import liquibase.exception.LiquibaseException;
+
+public class LiquibaseProcessor {
+
+ private LiquibaseConfig liquibaseConfig;
+
+ @Record(ExecutionTime.STATIC_INIT)
+ @BuildStep
+ void build(BuildProducer additionalBeanProducer,
+ BuildProducer featureProducer,
+ LiquibaseRecorder recorder,
+ BuildProducer containerListenerProducer,
+ DataSourceInitializedBuildItem dataSourceInitializedBuildItem) {
+
+ featureProducer.produce(new FeatureBuildItem("liquibase"));
+
+ AdditionalBeanBuildItem unremovableProducer = AdditionalBeanBuildItem.unremovableOf(LiquibaseProducer.class);
+ additionalBeanProducer.produce(unremovableProducer);
+
+ containerListenerProducer.produce(
+ new BeanContainerListenerBuildItem(recorder.setLiquibaseConfig(liquibaseConfig)));
+ }
+
+ @Record(ExecutionTime.RUNTIME_INIT)
+ @BuildStep
+ void processMigration(LiquibaseRecorder recorder, BeanContainerBuildItem beanContainer) throws LiquibaseException {
+ recorder.migrate(beanContainer.getValue());
+ }
+}
diff --git a/quarkus-extension/quarkus-liquibase/pom.xml b/quarkus-extension/quarkus-liquibase/pom.xml
new file mode 100644
index 0000000000..3b036f0658
--- /dev/null
+++ b/quarkus-extension/quarkus-liquibase/pom.xml
@@ -0,0 +1,25 @@
+
+
+ 4.0.0
+
+ com.baeldung.quarkus.liquibase
+ quarkus-liquibase-parent
+ 1.0-SNAPSHOT
+ Quarkus - Liquibase
+ pom
+
+
+ 1.8
+ 1.8
+ UTF-8
+ 1.0.0.Final
+
+
+
+ runtime
+ deployment
+
+
+
\ No newline at end of file
diff --git a/quarkus-extension/quarkus-liquibase/runtime/pom.xml b/quarkus-extension/quarkus-liquibase/runtime/pom.xml
new file mode 100644
index 0000000000..de570dc27d
--- /dev/null
+++ b/quarkus-extension/quarkus-liquibase/runtime/pom.xml
@@ -0,0 +1,67 @@
+
+
+
+ com.baeldung.quarkus.liquibase
+ quarkus-liquibase-parent
+ 1.0-SNAPSHOT
+
+ 4.0.0
+ Quarkus - Liquibase - Runtime
+
+ quarkus-liquibase
+
+
+
+ io.quarkus
+ quarkus-core
+ ${quarkus.version}
+
+
+ io.quarkus
+ quarkus-agroal
+ ${quarkus.version}
+
+
+ org.liquibase
+ liquibase-core
+ 3.8.1
+
+
+
+
+
+ io.quarkus
+ quarkus-bootstrap-maven-plugin
+ ${quarkus.version}
+
+
+
+ extension-descriptor
+
+
+ ${project.groupId}:${project.artifactId}-deployment:${project.version}
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.8.1
+
+
+
+ io.quarkus
+ quarkus-extension-processor
+ ${quarkus.version}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/quarkus-extension/quarkus-liquibase/runtime/src/main/java/com/baeldung/quarkus/liquibase/LiquibaseConfig.java b/quarkus-extension/quarkus-liquibase/runtime/src/main/java/com/baeldung/quarkus/liquibase/LiquibaseConfig.java
new file mode 100644
index 0000000000..ebf42030f6
--- /dev/null
+++ b/quarkus-extension/quarkus-liquibase/runtime/src/main/java/com/baeldung/quarkus/liquibase/LiquibaseConfig.java
@@ -0,0 +1,14 @@
+package com.baeldung.quarkus.liquibase;
+
+import io.quarkus.runtime.annotations.ConfigItem;
+import io.quarkus.runtime.annotations.ConfigPhase;
+import io.quarkus.runtime.annotations.ConfigRoot;
+
+@ConfigRoot(name = "liquibase", phase = ConfigPhase.BUILD_AND_RUN_TIME_FIXED)
+public final class LiquibaseConfig {
+ /**
+ * master change log file
+ */
+ @ConfigItem
+ public String changeLog;
+}
\ No newline at end of file
diff --git a/quarkus-extension/quarkus-liquibase/runtime/src/main/java/com/baeldung/quarkus/liquibase/LiquibaseProducer.java b/quarkus-extension/quarkus-liquibase/runtime/src/main/java/com/baeldung/quarkus/liquibase/LiquibaseProducer.java
new file mode 100644
index 0000000000..4fa6608ef7
--- /dev/null
+++ b/quarkus-extension/quarkus-liquibase/runtime/src/main/java/com/baeldung/quarkus/liquibase/LiquibaseProducer.java
@@ -0,0 +1,32 @@
+package com.baeldung.quarkus.liquibase;
+
+import io.agroal.api.AgroalDataSource;
+import liquibase.Liquibase;
+import liquibase.database.jvm.JdbcConnection;
+import liquibase.resource.ClassLoaderResourceAccessor;
+import liquibase.resource.ResourceAccessor;
+
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.inject.Produces;
+import javax.inject.Inject;
+
+@ApplicationScoped
+public class LiquibaseProducer {
+
+ @Inject
+ AgroalDataSource dataSource;
+
+ private LiquibaseConfig liquibaseConfig;
+
+ @Produces
+ public Liquibase produceLiquibase() throws Exception {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ ResourceAccessor classLoaderResourceAccessor = new ClassLoaderResourceAccessor(classLoader);
+ Liquibase liquibase = new Liquibase(liquibaseConfig.changeLog, classLoaderResourceAccessor, new JdbcConnection(dataSource.getConnection()));
+ return liquibase;
+ }
+
+ public void setLiquibaseConfig(LiquibaseConfig liquibaseConfig) {
+ this.liquibaseConfig = liquibaseConfig;
+ }
+}
\ No newline at end of file
diff --git a/quarkus-extension/quarkus-liquibase/runtime/src/main/java/com/baeldung/quarkus/liquibase/LiquibaseRecorder.java b/quarkus-extension/quarkus-liquibase/runtime/src/main/java/com/baeldung/quarkus/liquibase/LiquibaseRecorder.java
new file mode 100644
index 0000000000..dc237df7ea
--- /dev/null
+++ b/quarkus-extension/quarkus-liquibase/runtime/src/main/java/com/baeldung/quarkus/liquibase/LiquibaseRecorder.java
@@ -0,0 +1,25 @@
+package com.baeldung.quarkus.liquibase;
+
+import io.quarkus.arc.runtime.BeanContainer;
+import io.quarkus.arc.runtime.BeanContainerListener;
+import io.quarkus.runtime.annotations.Recorder;
+import liquibase.Contexts;
+import liquibase.Liquibase;
+import liquibase.exception.LiquibaseException;
+
+@Recorder
+public class LiquibaseRecorder {
+
+ public BeanContainerListener setLiquibaseConfig(LiquibaseConfig liquibaseConfig) {
+ return beanContainer -> {
+ LiquibaseProducer producer = beanContainer.instance(LiquibaseProducer.class);
+ producer.setLiquibaseConfig(liquibaseConfig);
+ };
+ }
+
+ public void migrate(BeanContainer container) throws LiquibaseException {
+ Liquibase liquibase = container.instance(Liquibase.class);
+ liquibase.update(new Contexts());
+ }
+
+}