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()); + } + +}