Permalink
Browse files

HSEARCH-1268 Make it possible to plug in a custom MassIndexer

implementation
  • Loading branch information...
1 parent 915e399 commit 610f786ba35221c935c818675db7ffc7a8ac1134 @DavideD DavideD committed with Sanne Feb 1, 2013
@@ -0,0 +1,102 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * JBoss, Home of Professional Open Source
+ * Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors
+ * as indicated by the @authors tag. All rights reserved.
+ * See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+package org.hibernate.search.hcore.impl;
+
+import java.util.Map;
+import java.util.Properties;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.engine.spi.SessionFactoryImplementor;
+import org.hibernate.integrator.spi.ServiceContributingIntegrator;
+import org.hibernate.metamodel.source.MetadataImplementor;
+import org.hibernate.search.impl.DefaultMassIndexerFactory;
+import org.hibernate.search.spi.MassIndexerFactory;
+import org.hibernate.search.util.impl.ClassLoaderHelper;
+import org.hibernate.service.ServiceRegistryBuilder;
+import org.hibernate.service.spi.BasicServiceInitiator;
+import org.hibernate.service.spi.ServiceRegistryImplementor;
+import org.hibernate.service.spi.SessionFactoryServiceRegistry;
+
+/**
+ * Registers a {@link MassIndexerFactory} in the {@link org.hibernate.service.ServiceRegistry}.
+ * <p>
+ * The type of the factory can be specified in the configuration otherwise a defaul one is used.
+ *
+ * @author Davide D'Alto <davide@hibernate.org>
+ */
+public class MassIndexerFactoryIntegrator implements ServiceContributingIntegrator,
+ BasicServiceInitiator<MassIndexerFactory> {
+
+ public static final String MASS_INDEXER_FACTORY_CLASSNAME = "hibernate.search.massindexer.factoryclass";
+
+ @Override
+ public Class<MassIndexerFactory> getServiceInitiated() {
+ return MassIndexerFactory.class;
+ }
+
+ @Override
+ public MassIndexerFactory initiateService(Map configurationValues, ServiceRegistryImplementor registry) {
+ String factoryClassName = (String) configurationValues.get( MASS_INDEXER_FACTORY_CLASSNAME );
+ MassIndexerFactory factory = createFactory( factoryClassName );
+ factory.initialize( properties( configurationValues ) );
+ return factory;
+ }
+
+ private Properties properties(Map configurationValues) {
+ Properties properties = new Properties();
+ properties.putAll( configurationValues );
+ return properties;
+ }
+
+ private MassIndexerFactory createFactory(String factoryClassName) {
+ if ( factoryClassName == null ) {
+ return new DefaultMassIndexerFactory();
+ }
+ else {
+ return customFactory( factoryClassName );
+ }
+ }
+
+ private MassIndexerFactory customFactory(String factoryClassName) {
+ return ClassLoaderHelper.instanceFromName( MassIndexerFactory.class, factoryClassName, getClass()
+ .getClassLoader(), "Mass indexer factory" );
+ }
+
+ @Override
+ public void integrate(Configuration configuration, SessionFactoryImplementor sessionFactory,
+ SessionFactoryServiceRegistry serviceRegistry) {
+ }
+
+ @Override
+ public void integrate(MetadataImplementor metadata, SessionFactoryImplementor sessionFactory,
+ SessionFactoryServiceRegistry serviceRegistry) {
+ }
+
+ @Override
+ public void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) {
+ }
+
+ @Override
+ public void prepareServices(ServiceRegistryBuilder serviceRegistryBuilder) {
+ serviceRegistryBuilder.addInitiator( this );
+ }
+
+}
@@ -0,0 +1,50 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * JBoss, Home of Professional Open Source
+ * Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors
+ * as indicated by the @authors tag. All rights reserved.
+ * See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+package org.hibernate.search.impl;
+
+import java.util.Properties;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.search.MassIndexer;
+import org.hibernate.search.engine.spi.SearchFactoryImplementor;
+import org.hibernate.search.spi.MassIndexerFactory;
+
+/**
+ * The {@link MassIndexer} implementation used when none is specified in the configuration.
+ *
+ * @author Davide D'Alto <davide@hibernate.org>
+ */
+public class DefaultMassIndexerFactory implements MassIndexerFactory {
+
+ private static final Class<?>[] OBJECT_ARRAY = { Object.class };
+
+ @Override
+ public void initialize(Properties properties) {
+ }
+
+ @Override
+ public MassIndexer createMassIndexer(SearchFactoryImplementor searchFactory, SessionFactory sessionFactory,
+ Class<?>... entities) {
+ final Class<?>[] types = entities.length == 0 ? OBJECT_ARRAY : entities;
+ return new MassIndexerImpl( searchFactory, sessionFactory, types );
+ }
+
+}
@@ -81,6 +81,7 @@
import org.hibernate.search.backend.impl.EventSourceTransactionContext;
import org.hibernate.search.engine.spi.SearchFactoryImplementor;
import org.hibernate.search.query.hibernate.impl.FullTextQueryImpl;
+import org.hibernate.search.spi.MassIndexerFactory;
import org.hibernate.search.util.impl.ContextHelper;
import org.hibernate.search.util.impl.HibernateHelper;
import org.hibernate.stat.SessionStatistics;
@@ -205,12 +206,12 @@ public void flushToIndexes() {
}
public MassIndexer createIndexer(Class<?>... types) {
- if ( types.length == 0 ) {
- return new MassIndexerImpl( getSearchFactoryImplementor(), getSessionFactory(), Object.class );
- }
- else {
- return new MassIndexerImpl( getSearchFactoryImplementor(), getSessionFactory(), types );
- }
+ MassIndexerFactory factory = requestService( MassIndexerFactory.class );
+ return factory.createMassIndexer( getSearchFactoryImplementor(), getSessionFactory(), types );
+ }
+
+ private MassIndexerFactory requestService(Class<MassIndexerFactory> serviceRole) {
+ return sessionImplementor.getFactory().getServiceRegistry().getService( serviceRole );
}
public SearchFactory getSearchFactory() {
@@ -0,0 +1,60 @@
+/*
+ * Hibernate, Relational Persistence for Idiomatic Java
+ *
+ * JBoss, Home of Professional Open Source
+ * Copyright 2013 Red Hat Inc. and/or its affiliates and other contributors
+ * as indicated by the @authors tag. All rights reserved.
+ * See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This copyrighted material is made available to anyone wishing to use,
+ * modify, copy, or redistribute it subject to the terms and conditions
+ * of the GNU Lesser General Public License, v. 2.1.
+ * This program is distributed in the hope that it will be useful, but WITHOUT A
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+ * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
+ * You should have received a copy of the GNU Lesser General Public License,
+ * v.2.1 along with this distribution; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+package org.hibernate.search.spi;
+
+import java.util.Properties;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.search.MassIndexer;
+import org.hibernate.search.engine.spi.SearchFactoryImplementor;
+import org.hibernate.service.Service;
+
+/**
+ * Contains methods that can be used to create a {@link MassIndexer}.
+ *
+ * @author Davide D'Alto <davide@hibernate.org>
+ * @see Service
+ */
+public interface MassIndexerFactory extends Service {
+
+ /**
+ * Called after the creation of the factory, can be used to read configuration parameters.
+ *
+ * @param properties
+ * configuration properties
+ */
+ void initialize(Properties properties);
+
+ /**
+ * Create an instance of a {@link MassIndexer}.
+ *
+ * @param searchFactory
+ * the Hibernate Search factory
+ * @param sessionFactory
+ * the {@link org.hibernate.Session} factory
+ * @param entities
+ * the classes of the entities that are going to be indexed
+ * @return a new MassIndexer
+ */
+ MassIndexer createMassIndexer(SearchFactoryImplementor searchFactory, SessionFactory sessionFactory,
+ Class<?>... entities);
+
+}
@@ -1 +1,2 @@
-org.hibernate.search.hcore.impl.HibernateSearchIntegrator
+org.hibernate.search.hcore.impl.HibernateSearchIntegrator
+org.hibernate.search.hcore.impl.MassIndexerFactoryIntegrator
Oops, something went wrong. Retry.

0 comments on commit 610f786

Please sign in to comment.