/*
* 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.backend.impl;
import java.util.Map;
import java.util.Properties;
import org.hibernate.search.cfg.Environment;
import org.hibernate.search.backend.spi.Worker;
import org.hibernate.search.cfg.spi.SearchConfiguration;
import org.hibernate.search.engine.service.spi.ServiceManager;
import org.hibernate.search.spi.WorkerBuildContext;
import org.hibernate.search.util.StringHelper;
import org.hibernate.search.util.impl.ClassLoaderHelper;
/**
* @author Emmanuel Bernard
*/
public abstract class WorkerFactory {
public static Worker createWorker(SearchConfiguration searchConfiguration,
WorkerBuildContext buildContext,
QueueingProcessor queueingProcessor) {
Properties properties = getProperties( searchConfiguration );
String workerImplClassName = properties.getProperty( Environment.WORKER_SCOPE );
Worker worker;
if ( StringHelper.isEmpty( workerImplClassName ) || "transaction".equalsIgnoreCase( workerImplClassName ) ) {
worker = new TransactionalWorker();
}
else {
worker = instantiateExplicitlyConfiguredWorker( buildContext, workerImplClassName );
}
worker.initialize( properties, buildContext, queueingProcessor );
return worker;
}
private static Worker instantiateExplicitlyConfiguredWorker(WorkerBuildContext buildContext, String workerImplClassName) {
ServiceManager serviceManager = buildContext.getServiceManager();
return ClassLoaderHelper.instanceFromName(
Worker.class,
workerImplClassName,
"worker",
serviceManager
);
}
private static Properties getProperties(SearchConfiguration searchConfiguration) {
Properties props = searchConfiguration.getProperties();
Properties workerProperties = new Properties();
for ( Map.Entry entry : props.entrySet() ) {
String key = (String) entry.getKey();
if ( key.startsWith( "hibernate.search.worker" ) ) {
workerProperties.setProperty( key, (String) entry.getValue() );
}
}
return workerProperties;
}
}