diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/PersistenceUnitUtil.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/PersistenceUnitUtil.java index 8c0d3306e4711..d106f3be75d20 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/PersistenceUnitUtil.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/PersistenceUnitUtil.java @@ -1,5 +1,6 @@ package io.quarkus.hibernate.orm.runtime; +import java.util.Comparator; import java.util.Locale; import javax.enterprise.inject.Default; @@ -37,6 +38,19 @@ public static InjectableInstance extensionInstanceForPersistenceUnit(Clas new PersistenceUnitExtension.Literal(persistenceUnitName)); } + public static class PersistenceUnitNameComparator implements Comparator { + @Override + public int compare(String o1, String o2) { + if (DEFAULT_PERSISTENCE_UNIT_NAME.equals(o1)) { + return -1; + } else if (DEFAULT_PERSISTENCE_UNIT_NAME.equals(o2)) { + return +1; + } else { + return o1.compareTo(o2); + } + } + } + @Deprecated public static InjectableInstance legacySingleExtensionInstanceForPersistenceUnit(Class beanType, String persistenceUnitName) { diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/devconsole/HibernateOrmDevConsoleInfoSupplier.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/devconsole/HibernateOrmDevConsoleInfoSupplier.java index 70592fc418bf3..d50a1ab2c8d30 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/devconsole/HibernateOrmDevConsoleInfoSupplier.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/devconsole/HibernateOrmDevConsoleInfoSupplier.java @@ -5,7 +5,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; import java.util.EnumSet; import java.util.List; import java.util.Map; @@ -24,9 +23,9 @@ import org.hibernate.tool.schema.spi.ScriptTargetOutput; import org.hibernate.tool.schema.spi.TargetDescriptor; -public class HibernateOrmDevConsoleInfoSupplier implements Supplier { +import io.quarkus.hibernate.orm.runtime.PersistenceUnitUtil; - private static final String DEFAULT = ""; +public class HibernateOrmDevConsoleInfoSupplier implements Supplier { public static final PersistenceUnitsInfo INSTANCE = new PersistenceUnitsInfo(); @@ -99,7 +98,7 @@ public PersistenceUnitsInfo get() { public static class PersistenceUnitsInfo { private final Map persistenceUnits = Collections - .synchronizedMap(new TreeMap<>(new PersistenceUnitNameComparator())); + .synchronizedMap(new TreeMap<>(new PersistenceUnitUtil.PersistenceUnitNameComparator())); public Collection getPersistenceUnits() { return persistenceUnits.values(); @@ -229,17 +228,4 @@ public String getType() { } } - - static class PersistenceUnitNameComparator implements Comparator { - @Override - public int compare(String o1, String o2) { - if (DEFAULT.equals(o1)) { - return -1; - } else if (DEFAULT.equals(o2)) { - return +1; - } else { - return o1.compareTo(o2); - } - } - } } diff --git a/extensions/hibernate-orm/runtime/src/test/java/io/quarkus/hibernate/orm/runtime/devconsole/PersistenceUnitNameComparatorTestCase.java b/extensions/hibernate-orm/runtime/src/test/java/io/quarkus/hibernate/orm/runtime/devconsole/PersistenceUnitNameComparatorTestCase.java index 00a0b9b651826..7dfbe219d7978 100644 --- a/extensions/hibernate-orm/runtime/src/test/java/io/quarkus/hibernate/orm/runtime/devconsole/PersistenceUnitNameComparatorTestCase.java +++ b/extensions/hibernate-orm/runtime/src/test/java/io/quarkus/hibernate/orm/runtime/devconsole/PersistenceUnitNameComparatorTestCase.java @@ -7,6 +7,8 @@ import org.junit.jupiter.api.Test; +import io.quarkus.hibernate.orm.runtime.PersistenceUnitUtil; + public class PersistenceUnitNameComparatorTestCase { @Test @@ -16,7 +18,7 @@ public void puNameComparatorTest() { names.add("alpha"); names.add(""); names.add("beta"); - names.sort(new HibernateOrmDevConsoleInfoSupplier.PersistenceUnitNameComparator()); + names.sort(new PersistenceUnitUtil.PersistenceUnitNameComparator()); assertThat(names.get(0)).isEqualTo(""); assertThat(names.get(1)).isEqualTo("alpha"); diff --git a/extensions/hibernate-search-orm-elasticsearch/deployment/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/devconsole/HibernateSearchElasticsearchDevConsoleProcessor.java b/extensions/hibernate-search-orm-elasticsearch/deployment/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/devconsole/HibernateSearchElasticsearchDevConsoleProcessor.java index 416d65953587a..92246810a801d 100644 --- a/extensions/hibernate-search-orm-elasticsearch/deployment/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/devconsole/HibernateSearchElasticsearchDevConsoleProcessor.java +++ b/extensions/hibernate-search-orm-elasticsearch/deployment/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/devconsole/HibernateSearchElasticsearchDevConsoleProcessor.java @@ -3,12 +3,17 @@ import static io.quarkus.deployment.annotations.ExecutionTime.RUNTIME_INIT; import static io.quarkus.deployment.annotations.ExecutionTime.STATIC_INIT; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + import io.quarkus.deployment.IsDevelopment; import io.quarkus.deployment.annotations.BuildStep; import io.quarkus.deployment.annotations.Record; import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem; import io.quarkus.devconsole.spi.DevConsoleRouteBuildItem; import io.quarkus.devconsole.spi.DevConsoleRuntimeTemplateInfoBuildItem; +import io.quarkus.hibernate.search.orm.elasticsearch.HibernateSearchElasticsearchPersistenceUnitConfiguredBuildItem; import io.quarkus.hibernate.search.orm.elasticsearch.runtime.HibernateSearchElasticsearchRuntimeConfig; import io.quarkus.hibernate.search.orm.elasticsearch.runtime.devconsole.HibernateSearchDevConsoleRecorder; @@ -18,9 +23,13 @@ public class HibernateSearchElasticsearchDevConsoleProcessor { @Record(RUNTIME_INIT) public DevConsoleRuntimeTemplateInfoBuildItem collectBeanInfo(HibernateSearchDevConsoleRecorder recorder, HibernateSearchElasticsearchRuntimeConfig runtimeConfig, - CurateOutcomeBuildItem curateOutcomeBuildItem) { - return new DevConsoleRuntimeTemplateInfoBuildItem("indexedEntityTypes", - recorder.infoSupplier(runtimeConfig), this.getClass(), curateOutcomeBuildItem); + CurateOutcomeBuildItem curateOutcomeBuildItem, + List peristenceUnitBuildItems) { + Set persistenceUnitNames = peristenceUnitBuildItems.stream() + .map(HibernateSearchElasticsearchPersistenceUnitConfiguredBuildItem::getPersistenceUnitName) + .collect(Collectors.toSet()); + return new DevConsoleRuntimeTemplateInfoBuildItem("indexedPersistenceUnits", + recorder.infoSupplier(runtimeConfig, persistenceUnitNames), this.getClass(), curateOutcomeBuildItem); } @BuildStep diff --git a/extensions/hibernate-search-orm-elasticsearch/deployment/src/main/resources/dev-templates/embedded.html b/extensions/hibernate-search-orm-elasticsearch/deployment/src/main/resources/dev-templates/embedded.html index 10c92d629e123..9cc1a072f0350 100644 --- a/extensions/hibernate-search-orm-elasticsearch/deployment/src/main/resources/dev-templates/embedded.html +++ b/extensions/hibernate-search-orm-elasticsearch/deployment/src/main/resources/dev-templates/embedded.html @@ -1,4 +1,7 @@ + + + Persistence units {info:indexedPersistenceUnits.persistenceUnits.size} - Indexed entity types {info:indexedEntityTypes.size()} + Indexed Entities {info:indexedPersistenceUnits.numberOfIndexedEntities}
diff --git a/extensions/hibernate-search-orm-elasticsearch/deployment/src/main/resources/dev-templates/entity-types.html b/extensions/hibernate-search-orm-elasticsearch/deployment/src/main/resources/dev-templates/entity-types.html index 079f27d7783c2..fd6cdcbffbff0 100644 --- a/extensions/hibernate-search-orm-elasticsearch/deployment/src/main/resources/dev-templates/entity-types.html +++ b/extensions/hibernate-search-orm-elasticsearch/deployment/src/main/resources/dev-templates/entity-types.html @@ -1,11 +1,14 @@ {#include main} {#title}Indexed Entities{/title} {#body} -{#if info:indexedEntityTypes.isEmpty} +{#if info:indexedPersistenceUnits.persistenceUnits.isEmpty}

No indexed entities were found.

{#else}
- + +
+ {#for indexedPersistenceUnit in info:indexedPersistenceUnits.persistenceUnits} +

Persistence Unit {indexedPersistenceUnit.persistenceUnitName}

@@ -16,7 +19,7 @@ @@ -24,11 +27,12 @@ - {#for indexedEntityType in info:indexedEntityTypes} + {#for indexedEntityType in indexedPersistenceUnit.indexedEntities} @@ -37,15 +41,13 @@ {/for}
- +
Entity name
- +
{indexedEntityType.jpaName}
+ {/for}
{/if} {/body} diff --git a/extensions/hibernate-search-orm-elasticsearch/runtime/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/runtime/devconsole/HibernateSearchDevConsoleRecorder.java b/extensions/hibernate-search-orm-elasticsearch/runtime/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/runtime/devconsole/HibernateSearchDevConsoleRecorder.java index 1a7d66cd2554b..deff448a12de3 100644 --- a/extensions/hibernate-search-orm-elasticsearch/runtime/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/runtime/devconsole/HibernateSearchDevConsoleRecorder.java +++ b/extensions/hibernate-search-orm-elasticsearch/runtime/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/runtime/devconsole/HibernateSearchDevConsoleRecorder.java @@ -2,6 +2,8 @@ import java.time.Duration; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -19,9 +21,9 @@ @Recorder public class HibernateSearchDevConsoleRecorder { - public Supplier> infoSupplier( - HibernateSearchElasticsearchRuntimeConfig runtimeConfig) { - return new HibernateSearchSupplier(runtimeConfig); + public Supplier infoSupplier( + HibernateSearchElasticsearchRuntimeConfig runtimeConfig, Set persistenceUnitNames) { + return new HibernateSearchSupplier(runtimeConfig, persistenceUnitNames); } public Handler indexEntity() { @@ -31,19 +33,25 @@ protected void handlePostAsync(RoutingContext event, MultiMap form) throws Excep if (form.isEmpty()) { return; } - SearchMapping mapping = HibernateSearchSupplier.searchMapping(); - if (mapping == null) { + Set persitenceUnitNames = form.entries().stream().map(Map.Entry::getValue) + .collect(Collectors.toSet()); + Map mappings = HibernateSearchSupplier.searchMapping(persitenceUnitNames); + if (mappings.isEmpty()) { flashMessage(event, "There are no indexed entity types.", FlashScopeUtil.FlashMessageStatus.ERROR); return; } - mapping.scope(Object.class, - mapping.allIndexedEntities().stream() - .map(SearchIndexedEntity::jpaName) - .filter(form::contains) - .collect(Collectors.toList())) - .massIndexer() - .startAndWait(); - flashMessage(event, "Entities successfully reindexed", Duration.ofSeconds(10)); + for (Map.Entry entry : mappings.entrySet()) { + SearchMapping mapping = entry.getValue(); + List entityNames = mapping.allIndexedEntities().stream() + .map(SearchIndexedEntity::jpaName) + .filter(jpaName -> form.contains(jpaName, entry.getKey(), false)) + .collect(Collectors.toList()); + if (!entityNames.isEmpty()) { + mapping.scope(Object.class, entityNames).massIndexer() + .startAndWait(); + flashMessage(event, "Entities successfully reindexed", Duration.ofSeconds(10)); + } + } } }; } diff --git a/extensions/hibernate-search-orm-elasticsearch/runtime/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/runtime/devconsole/HibernateSearchSupplier.java b/extensions/hibernate-search-orm-elasticsearch/runtime/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/runtime/devconsole/HibernateSearchSupplier.java index 2460e905887c6..ef2b842263692 100644 --- a/extensions/hibernate-search-orm-elasticsearch/runtime/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/runtime/devconsole/HibernateSearchSupplier.java +++ b/extensions/hibernate-search-orm-elasticsearch/runtime/src/main/java/io/quarkus/hibernate/search/orm/elasticsearch/runtime/devconsole/HibernateSearchSupplier.java @@ -1,44 +1,125 @@ package io.quarkus.hibernate.search.orm.elasticsearch.runtime.devconsole; -import java.util.Collections; +import java.lang.annotation.Annotation; +import java.util.Arrays; +import java.util.Comparator; import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; import java.util.function.Supplier; +import java.util.stream.Collector; import java.util.stream.Collectors; +import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.search.mapper.orm.entity.SearchIndexedEntity; import org.hibernate.search.mapper.orm.mapping.SearchMapping; import io.quarkus.arc.Arc; +import io.quarkus.hibernate.orm.PersistenceUnit; +import io.quarkus.hibernate.orm.runtime.PersistenceUnitUtil; import io.quarkus.hibernate.search.orm.elasticsearch.runtime.HibernateSearchElasticsearchRuntimeConfig; -import io.quarkus.hibernate.search.orm.elasticsearch.runtime.devconsole.HibernateSearchSupplier.DevUiIndexedEntity; -public class HibernateSearchSupplier implements Supplier> { +public class HibernateSearchSupplier implements Supplier { private final HibernateSearchElasticsearchRuntimeConfig runtimeConfig; + private final Set persistenceUnitNames; - HibernateSearchSupplier(HibernateSearchElasticsearchRuntimeConfig runtimeConfig) { + HibernateSearchSupplier(HibernateSearchElasticsearchRuntimeConfig runtimeConfig, Set persistenceUnitNames) { this.runtimeConfig = runtimeConfig; + this.persistenceUnitNames = persistenceUnitNames; } @Override - public List get() { + public IndexedPersistenceUnits get() { if (!isEnabled()) { - return Collections.emptyList(); + return new IndexedPersistenceUnits(); } - SearchMapping mapping = searchMapping(); - if (mapping == null) { - return Collections.emptyList(); + Map mappings = searchMapping(persistenceUnitNames); + if (mappings.isEmpty()) { + return new IndexedPersistenceUnits(); } - return mapping.allIndexedEntities().stream().map(DevUiIndexedEntity::new).sorted() - .collect(Collectors.toList()); + return mappings.entrySet().stream() + .map(mapping -> new IndexedPersistenceUnit(mapping.getKey(), + mapping.getValue().allIndexedEntities().stream().map(DevUiIndexedEntity::new).sorted() + .collect(Collectors.toList()))) + .collect(Collector.of(IndexedPersistenceUnits::new, IndexedPersistenceUnits::add, + (left, right) -> { + left.addAll(right); + return left; + })); } private boolean isEnabled() { return runtimeConfig.defaultPersistenceUnit.enabled; } - public static SearchMapping searchMapping() { - return Arc.container().instance(SearchMapping.class).get(); + public static Map searchMapping(Set persistenceUnitNames) { + return Arrays.stream(getPersistenceUnitQualifiers(persistenceUnitNames)).map( + qualifier -> Arc.container().select(SearchMapping.class, qualifier).get()) + .collect(Collectors.toMap(HibernateSearchSupplier::getPersistenceUnitName, mapping -> mapping)); + } + + private static Annotation[] getPersistenceUnitQualifiers(Set persistenceUnitNames) { + return persistenceUnitNames.stream().map(PersistenceUnit.PersistenceUnitLiteral::new).toArray(Annotation[]::new); + } + + private static String getPersistenceUnitName(SearchMapping searchMapping) { + SessionFactoryImplementor sessionFactory = searchMapping.toOrmSessionFactory().unwrap(SessionFactoryImplementor.class); + String name = sessionFactory.getName(); + if (name != null) { + return name; + } + Object persistenceUnitName = sessionFactory.getProperties().get("hibernate.ejb.persistenceUnitName"); + if (persistenceUnitName != null) { + return persistenceUnitName.toString(); + } + return PersistenceUnitUtil.DEFAULT_PERSISTENCE_UNIT_NAME; + } + + static class IndexedPersistenceUnits { + private final Set persistenceUnits = new TreeSet<>(new PersistenceUnitComparator()); + + public Set getPersistenceUnits() { + return persistenceUnits; + } + + public void add(IndexedPersistenceUnit indexedPersistenceUnit) { + persistenceUnits.add(indexedPersistenceUnit); + } + + public void addAll(IndexedPersistenceUnits right) { + persistenceUnits.addAll(right.persistenceUnits); + } + + public int getNumberOfIndexedEntities() { + return persistenceUnits.stream().mapToInt(pu -> pu.indexedEntities.size()).sum(); + } + } + + static class PersistenceUnitComparator implements Comparator { + Comparator persistenceUnitNameComparator = new PersistenceUnitUtil.PersistenceUnitNameComparator(); + + @Override + public int compare(IndexedPersistenceUnit o1, IndexedPersistenceUnit o2) { + return persistenceUnitNameComparator.compare(o1.persistenceUnitName, o2.persistenceUnitName); + } + } + + static class IndexedPersistenceUnit implements Comparable { + public final String persistenceUnitName; + + public final List indexedEntities; + + public IndexedPersistenceUnit(String persistenceUnitName, List indexedEntities) { + this.persistenceUnitName = persistenceUnitName; + this.indexedEntities = indexedEntities; + } + + @Override + public int compareTo(IndexedPersistenceUnit o) { + return this.persistenceUnitName.compareTo(o.persistenceUnitName); + } } public static class DevUiIndexedEntity implements Comparable {