From cd3abf14a087a933677eb08d8ad5a218d7b125dd Mon Sep 17 00:00:00 2001 From: Markus Heberling Date: Tue, 16 Jun 2020 10:10:29 +0200 Subject: [PATCH] Allow inclusion/exclusion of persistence units Fixes #6805 --- .../orm/deployment/HibernateOrmConfig.java | 24 ++++++++++++++ .../orm/deployment/HibernateOrmProcessor.java | 3 +- .../QuarkusPersistenceXmlParser.java | 29 +++++++++++++++-- .../orm/ExcludePersistenceXmlConfigTest.java | 32 +++++++++++++++++++ ...ication-exclude-persistence-xml.properties | 7 ++++ 5 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/ExcludePersistenceXmlConfigTest.java create mode 100644 extensions/hibernate-orm/deployment/src/test/resources/application-exclude-persistence-xml.properties diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmConfig.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmConfig.java index 4b2c9c6dbb6f7..ba4e400c1a7bc 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmConfig.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmConfig.java @@ -2,9 +2,11 @@ import java.nio.charset.Charset; import java.time.Duration; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.OptionalLong; +import java.util.regex.Pattern; import io.quarkus.runtime.annotations.ConfigDocSection; import io.quarkus.runtime.annotations.ConfigGroup; @@ -148,6 +150,13 @@ public class HibernateOrmConfig { @ConfigDocSection public HibernateOrmConfigLog log; + /** + * persistence.xml configuration + */ + @ConfigItem + @ConfigDocSection + public HibernateOrmConfigPersistenceXml persistenceXml; + /** * Caching configuration */ @@ -360,4 +369,19 @@ public static class HibernateOrmConfigCacheMemory { @ConfigItem public OptionalLong objectCount; } + + @ConfigGroup + public static class HibernateOrmConfigPersistenceXml { + /** + * The persistence units to include from persistence.xml files. Default all. + */ + @ConfigItem + public Optional> includePersistenceUnit; + + /** + * The persistence units to exclude from persistence.xml files. Default none. + */ + @ConfigItem + public Optional> excludePersistenceUnit; + } } diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java index c73427df0cfaa..e121049c2417b 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java @@ -176,7 +176,8 @@ List hotDeploymentWatchedFiles(LaunchModeBuil @BuildStep public void parsePersistenceXmlDescriptors( BuildProducer persistenceXmlDescriptorBuildItemBuildProducer) { - List explicitDescriptors = QuarkusPersistenceXmlParser.locatePersistenceUnits(); + List explicitDescriptors = QuarkusPersistenceXmlParser + .locatePersistenceUnits(hibernateConfig.persistenceXml); for (ParsedPersistenceXmlDescriptor desc : explicitDescriptors) { persistenceXmlDescriptorBuildItemBuildProducer.produce(new PersistenceXmlDescriptorBuildItem(desc)); } diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/QuarkusPersistenceXmlParser.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/QuarkusPersistenceXmlParser.java index 06189f0913bfa..ba234b9ad37b5 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/QuarkusPersistenceXmlParser.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/QuarkusPersistenceXmlParser.java @@ -1,9 +1,12 @@ package io.quarkus.hibernate.orm.deployment; import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.stream.Stream; import javax.persistence.spi.PersistenceUnitTransactionType; @@ -24,10 +27,32 @@ final class QuarkusPersistenceXmlParser extends PersistenceXmlParser { * * @return the list of ParsedPersistenceXmlDescriptor(s), after discovery and parsing. */ - public static List locatePersistenceUnits() { + public static List locatePersistenceUnits( + HibernateOrmConfig.HibernateOrmConfigPersistenceXml config) { final QuarkusPersistenceXmlParser parser = new QuarkusPersistenceXmlParser(); parser.doResolve(); - return parser.getResolvedPersistenceUnits(); + + final List resolvedPersistenceUnits = parser.getResolvedPersistenceUnits(); + final List filteredPersistenceUnits = new ArrayList<>(); + + resolvedPersistenceUnits.forEach(d -> { + //if it is not explicitly excluded, it is included + boolean include = config.excludePersistenceUnit.map(Collection::stream).orElse(Stream.empty()) + .noneMatch(p -> p.matcher(d.getName()).matches()); + + if (!include) { + //an explicit include overrides an explicit exclude + include = config.includePersistenceUnit.map(Collection::stream).orElse(Stream.empty()) + .anyMatch(p -> p.matcher(d.getName()).matches()); + } + + if (include) { + filteredPersistenceUnits.add(d); + } + + }); + + return filteredPersistenceUnits; } private QuarkusPersistenceXmlParser() { diff --git a/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/ExcludePersistenceXmlConfigTest.java b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/ExcludePersistenceXmlConfigTest.java new file mode 100644 index 0000000000000..e45abd5a43c13 --- /dev/null +++ b/extensions/hibernate-orm/deployment/src/test/java/io/quarkus/hibernate/orm/ExcludePersistenceXmlConfigTest.java @@ -0,0 +1,32 @@ +package io.quarkus.hibernate.orm; + +import javax.inject.Inject; +import javax.persistence.EntityManager; + +import org.jboss.shrinkwrap.api.ShrinkWrap; +import org.jboss.shrinkwrap.api.spec.JavaArchive; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import io.quarkus.hibernate.orm.enhancer.Address; +import io.quarkus.test.QuarkusUnitTest; + +public class ExcludePersistenceXmlConfigTest { + + @RegisterExtension + static QuarkusUnitTest runner = new QuarkusUnitTest() + .setArchiveProducer(() -> ShrinkWrap.create(JavaArchive.class) + .addClass(Address.class) + .addAsManifestResource("META-INF/some-persistence.xml", "persistence.xml") + .addAsResource("application-exclude-persistence-xml.properties")); + + @Inject + EntityManager entityManager; + + @Test + public void testPersistenceAndConfigTest() { + Assertions.assertNotNull(entityManager); + } + +} diff --git a/extensions/hibernate-orm/deployment/src/test/resources/application-exclude-persistence-xml.properties b/extensions/hibernate-orm/deployment/src/test/resources/application-exclude-persistence-xml.properties new file mode 100644 index 0000000000000..9c881ff877377 --- /dev/null +++ b/extensions/hibernate-orm/deployment/src/test/resources/application-exclude-persistence-xml.properties @@ -0,0 +1,7 @@ +quarkus.datasource.db-kind=h2 +quarkus.datasource.jdbc.url=jdbc:h2:mem:test + +quarkus.hibernate-orm.dialect=org.hibernate.dialect.H2Dialect +quarkus.hibernate-orm.log.sql=true +quarkus.hibernate-orm.database.generation=drop-and-create +quarkus.hibernate-orm.persistenceXml.excludePersistenceUnit=.*