/* * 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.hcore.impl; import static org.hibernate.engine.config.spi.StandardConverters.BOOLEAN; import static org.hibernate.engine.config.spi.StandardConverters.STRING; import java.util.Objects; import org.hibernate.SessionFactory; import org.hibernate.engine.config.spi.ConfigurationService; import org.hibernate.search.cfg.Environment; import org.hibernate.search.engine.integration.impl.ExtendedSearchIntegrator; import org.hibernate.search.exception.AssertionFailure; import org.hibernate.search.jmx.IndexControlMBean; import org.hibernate.search.jmx.impl.IndexControl; import org.hibernate.search.jmx.impl.JMXRegistrar; import org.hibernate.search.util.StringHelper; import org.hibernate.search.util.logging.impl.Log; import org.hibernate.search.util.logging.impl.LoggerFactory; /** * Handles reading configuration properties about JMX MBeans * and registering (unregistering) the MBean as needed. */ final class JMXHook { private static final Log log = LoggerFactory.make(); private final String indexControlMBeanName; private final boolean indexControlMBeanEnabled; //Guarded by synchronization private boolean registeredIfEnabled; JMXHook(ConfigurationService configurationService) { Boolean enableJMX = configurationService.getSetting( Environment.JMX_ENABLED, BOOLEAN, Boolean.FALSE ); this.indexControlMBeanName = enableJMX.booleanValue() ? extractMBeanName( configurationService ) : null; this.indexControlMBeanEnabled = enableJMX.booleanValue() && indexControlMBeanName != null; } public synchronized void registerIfEnabled(ExtendedSearchIntegrator extendedIntegrator, SessionFactory factory) { Objects.requireNonNull( extendedIntegrator ); Objects.requireNonNull( factory ); if ( registeredIfEnabled ) { throw new AssertionFailure( "Unexpected state" ); } if ( indexControlMBeanEnabled ) { enableIndexControlBean( indexControlMBeanName, extendedIntegrator, factory ); } registeredIfEnabled = true; } public synchronized void unRegisterIfRegistered() { if ( registeredIfEnabled == false ) { throw new AssertionFailure( "Unexpected state" ); } if ( registeredIfEnabled ) { JMXRegistrar.unRegisterMBean( indexControlMBeanName ); } registeredIfEnabled = false; } private static String extractMBeanName(ConfigurationService configurationService) { // if we don't have a JNDI bound SessionFactory we cannot enable the index control bean if ( StringHelper.isEmpty( configurationService.getSetting( "hibernate.session_factory_name", STRING ) ) ) { log.debug( "In order to bind the IndexControlMBean the Hibernate SessionFactory has to be available via JNDI" ); return null; } String mbeanNameSuffix = configurationService.getSetting( Environment.JMX_BEAN_SUFFIX, STRING ); String objectName = JMXRegistrar.buildMBeanName( IndexControl.INDEX_CTRL_MBEAN_OBJECT_NAME, mbeanNameSuffix ); return objectName; } private static String enableIndexControlBean(final String objectName, final ExtendedSearchIntegrator extendedIntegrator, final SessionFactory factory) { // since the SearchFactory is mutable we might have an already existing MBean which we have to unregister first if ( JMXRegistrar.isNameRegistered( objectName ) ) { JMXRegistrar.unRegisterMBean( objectName ); } IndexControl indexCtrlBean = new IndexControl( extendedIntegrator, factory ); JMXRegistrar.registerMBean( indexCtrlBean, IndexControlMBean.class, objectName ); return objectName; } }