/* * Hibernate Search, full-text search for your domain model * * License: GNU Lesser General Public License (LGPL), version 2.1 or later * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>. */ package org.hibernate.search.test.integration.wildfly.cdi.integration; import java.util.concurrent.CompletableFuture; import javax.enterprise.context.spi.Contextual; import javax.enterprise.context.spi.CreationalContext; import javax.enterprise.inject.spi.BeanManager; import javax.inject.Singleton; import org.hibernate.search.hcore.spi.EnvironmentSynchronizer; /** * @author Yoann Rodiere */ public class CDIBeanManagerSynchronizer implements EnvironmentSynchronizer { private static final Contextual<CDIBeanManagerSynchronizer> CONTEXTUAL = new Contextual<CDIBeanManagerSynchronizer>() { @Override public CDIBeanManagerSynchronizer create(CreationalContext<CDIBeanManagerSynchronizer> creationalContext) { return new CDIBeanManagerSynchronizer(); } @Override public void destroy(CDIBeanManagerSynchronizer instance, CreationalContext<CDIBeanManagerSynchronizer> creationalContext) { creationalContext.release(); } }; /** * Retrieve the {@link CDIBeanManagerSynchronizer} from a bean manager. * <p> * We cannot use classic ways to retrieve a CDI bean or an Extension from the bean manager * because WildFly starts Hibernate ORM *before* initializing CDI, and the methods we need * in the bean manager are not available when we create the {@link CDIBeanManagerSynchronizer}. * <p> * Thus we work it around by abusing the Context API... */ public static CDIBeanManagerSynchronizer get(BeanManager beanManager) { CreationalContext<CDIBeanManagerSynchronizer> creationalContext = beanManager.createCreationalContext( CONTEXTUAL ); return beanManager.getContext( Singleton.class ).get( CONTEXTUAL, creationalContext ); } private CDIBeanManagerSynchronizer() { // Private constructor; use get(BeanManager) instead } private final CompletableFuture<Void> beanManagerInitialization = new CompletableFuture<>(); @Override public void whenEnvironmentReady(Runnable runnable) { beanManagerInitialization.thenRun( runnable ); } public void onBeanManagerInitialized() { beanManagerInitialization.complete( null ); } }