/*
* 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.store.impl;
import java.util.Properties;
import org.apache.lucene.store.LockFactory;
import org.apache.lucene.store.RAMDirectory;
import org.hibernate.search.engine.service.spi.ServiceManager;
import org.hibernate.search.indexes.spi.DirectoryBasedIndexManager;
import org.hibernate.search.spi.BuildContext;
import org.hibernate.search.store.DirectoryProvider;
import org.hibernate.search.store.spi.DirectoryHelper;
import org.hibernate.search.store.spi.LockFactoryCreator;
/**
* Use a Lucene RAMDirectory
*
* @author Emmanuel Bernard
* @author Sylvain Vieujot
*/
public class RAMDirectoryProvider implements DirectoryProvider<RAMDirectory> {
private RAMDirectory directory;
private String indexName;
private Properties properties;
private ServiceManager serviceManager;
@Override
public void initialize(String directoryProviderName, Properties properties, BuildContext context) {
this.indexName = directoryProviderName;
this.properties = properties;
this.serviceManager = context.getServiceManager();
}
@Override
public void start(DirectoryBasedIndexManager indexManager) {
try {
LockFactory lockFactory = serviceManager
.requestService( LockFactoryCreator.class )
.createLockFactory( null, properties );
directory = makeRAMDirectory( lockFactory );
properties = null;
DirectoryHelper.initializeIndexIfNeeded( directory );
}
finally {
serviceManager.releaseService( LockFactoryCreator.class );
}
}
@Override
public RAMDirectory getDirectory() {
return directory;
}
@Override
public void stop() {
directory.close();
}
/**
* To allow extensions to create different RAMDirectory flavours:
* @param lockFactory provides the locking strategy
* @return the RAMDirectory this provider is going to manage
*/
protected RAMDirectory makeRAMDirectory(LockFactory lockFactory) {
return new RAMDirectory( lockFactory );
}
@Override
public boolean equals(Object obj) {
// this code is actually broken since the value change after initialize call
// but from a practical POV this is fine since we only call this method
// after initialize call
if ( obj == this ) {
return true;
}
if ( obj == null || !( obj instanceof RAMDirectoryProvider ) ) {
return false;
}
return indexName.equals( ( (RAMDirectoryProvider) obj ).indexName );
}
@Override
public int hashCode() {
// this code is actually broken since the value change after initialize call
// but from a practical POV this is fine since we only call this method
// after initialize call
int hash = 7;
return 29 * hash + indexName.hashCode();
}
}