Author: epbernard
Date: 2007-08-21 14:01:54 -0400 (Tue, 21 Aug 2007)
New Revision: 13945
Modified:
search/trunk/src/java/org/hibernate/search/impl/SearchFactoryImpl.java
search/trunk/src/java/org/hibernate/search/store/DirectoryProvider.java
search/trunk/src/java/org/hibernate/search/store/DirectoryProviderFactory.java
search/trunk/src/java/org/hibernate/search/store/FSDirectoryProvider.java
search/trunk/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java
search/trunk/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java
search/trunk/src/java/org/hibernate/search/store/RAMDirectoryProvider.java
Log:
HSEARCH-107 introduce a start() method for DirectoryProviders
Modified: search/trunk/src/java/org/hibernate/search/impl/SearchFactoryImpl.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/impl/SearchFactoryImpl.java 2007-08-21
00:25:25 UTC (rev 13944)
+++ search/trunk/src/java/org/hibernate/search/impl/SearchFactoryImpl.java 2007-08-21
18:01:54 UTC (rev 13945)
@@ -271,6 +271,7 @@
}
}
}
+ factory.startDirectoryProviders();
}
/**
Modified: search/trunk/src/java/org/hibernate/search/store/DirectoryProvider.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/store/DirectoryProvider.java 2007-08-21
00:25:25 UTC (rev 13944)
+++ search/trunk/src/java/org/hibernate/search/store/DirectoryProvider.java 2007-08-21
18:01:54 UTC (rev 13945)
@@ -20,11 +20,19 @@
*/
public interface DirectoryProvider<TDirectory extends Directory> {
/**
- * get the information to initialize the directory and build its hashCode
+ * get the information to initialize the directory and build its hashCode/equals method
*/
void initialize(String directoryProviderName, Properties properties,
SearchFactoryImplementor searchFactoryImplementor);
/**
+ * Executed after initialize, this method set up the heavy process of starting up the
DirectoryProvider
+ * IO processing as well as backgroup processing are expected to be set up here
+ *
+ * TODO stop() method, for now use finalize()
+ */
+ void start();
+
+ /**
* Returns an initialized Lucene Directory. This method call <b>must</b> be
threadsafe
*/
TDirectory getDirectory();
Modified: search/trunk/src/java/org/hibernate/search/store/DirectoryProviderFactory.java
===================================================================
---
search/trunk/src/java/org/hibernate/search/store/DirectoryProviderFactory.java 2007-08-21
00:25:25 UTC (rev 13944)
+++
search/trunk/src/java/org/hibernate/search/store/DirectoryProviderFactory.java 2007-08-21
18:01:54 UTC (rev 13945)
@@ -118,6 +118,12 @@
return new DirectoryProviders( shardingStrategy, providers );
}
+ public void startDirectoryProviders() {
+ for ( DirectoryProvider provider : providers ) {
+ provider.start();
+ }
+ }
+
private DirectoryProvider<?> createDirectoryProvider(String directoryProviderName,
Properties indexProps, SearchFactoryImplementor searchFactoryImplementor) {
String className = indexProps.getProperty( "directory_provider" );
if ( StringHelper.isEmpty( className ) ) {
Modified: search/trunk/src/java/org/hibernate/search/store/FSDirectoryProvider.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/store/FSDirectoryProvider.java 2007-08-21
00:25:25 UTC (rev 13944)
+++ search/trunk/src/java/org/hibernate/search/store/FSDirectoryProvider.java 2007-08-21
18:01:54 UTC (rev 13945)
@@ -30,6 +30,7 @@
boolean create = !indexDir.exists();
indexName = indexDir.getCanonicalPath();
directory = FSDirectory.getDirectory( indexName );
+ //this is cheap so it's not done in start()
if ( create ) {
IndexWriter iw = new IndexWriter( directory, new StandardAnalyzer(), create );
iw.close();
@@ -40,6 +41,10 @@
}
}
+ public void start() {
+ //all the process is done in initialize
+ }
+
public FSDirectory getDirectory() {
return directory;
}
Modified: search/trunk/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java
===================================================================
---
search/trunk/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java 2007-08-21
00:25:25 UTC (rev 13944)
+++
search/trunk/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java 2007-08-21
18:01:54 UTC (rev 13945)
@@ -39,31 +39,49 @@
private Timer timer;
private SearchFactoryImplementor searchFactory;
+ //variables needed between initialize and start
+ private String source;
+ private File indexDir;
+ private String directoryProviderName;
+ private Properties properties;
+
+
public void initialize(String directoryProviderName, Properties properties,
SearchFactoryImplementor searchFactoryImplementor) {
+ this.properties = properties;
+ this.directoryProviderName = directoryProviderName;
//source guessing
- String source = DirectoryProviderHelper.getSourceDirectory( "sourceBase",
"source", directoryProviderName, properties );
+ source = DirectoryProviderHelper.getSourceDirectory( "sourceBase",
"source", directoryProviderName, properties );
if ( source == null)
throw new IllegalStateException("FSMasterDirectoryProvider requires a viable
source directory");
log.debug( "Source directory: " + source );
- File indexDir = DirectoryProviderHelper.determineIndexDir( directoryProviderName,
properties );
+ indexDir = DirectoryProviderHelper.determineIndexDir( directoryProviderName, properties
);
log.debug( "Index directory: " + indexDir );
- String refreshPeriod = properties.getProperty( "refresh", "3600"
);
- long period = Long.parseLong( refreshPeriod );
- log.debug("Refresh period " + period + " seconds");
- period *= 1000; //per second
try {
boolean create = !indexDir.exists();
- indexName = indexDir.getCanonicalPath();
if (create) {
log.debug( "Index directory '" + indexName + "' will be
initialized");
indexDir.mkdir();
}
+ indexName = indexDir.getCanonicalPath();
directory = FSDirectory.getDirectory( indexName);
if ( create ) {
IndexWriter iw = new IndexWriter( directory, new StandardAnalyzer(), create );
iw.close();
}
+ }
+ catch (IOException e) {
+ throw new HibernateException( "Unable to initialize index: " +
directoryProviderName, e );
+ }
+ this.searchFactory = searchFactoryImplementor;
+ }
+ public void start() {
+ //source guessing
+ String refreshPeriod = properties.getProperty( "refresh", "3600"
);
+ long period = Long.parseLong( refreshPeriod );
+ log.debug("Refresh period " + period + " seconds");
+ period *= 1000; //per second
+ try {
//copy to source
if ( new File( source, "current1").exists() ) {
current = 2;
@@ -90,7 +108,6 @@
timer = new Timer(true); //daemon thread, the copy algorithm is robust
TimerTask task = new FSMasterDirectoryProvider.TriggerTask(indexName, source, this );
timer.scheduleAtFixedRate( task, period, period );
- this.searchFactory = searchFactoryImplementor;
}
public FSDirectory getDirectory() {
Modified: search/trunk/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java
===================================================================
---
search/trunk/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java 2007-08-21
00:25:25 UTC (rev 13944)
+++
search/trunk/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java 2007-08-21
18:01:54 UTC (rev 13945)
@@ -39,21 +39,25 @@
private String indexName;
private Timer timer;
+ //variables needed between initialize and start
+ private String source;
+ private File indexDir;
+ private String directoryProviderName;
+ private Properties properties;
+
public void initialize(String directoryProviderName, Properties properties,
SearchFactoryImplementor searchFactoryImplementor) {
+ this.properties = properties;
+ this.directoryProviderName = directoryProviderName;
//source guessing
- String source = DirectoryProviderHelper.getSourceDirectory( "sourceBase",
"source", directoryProviderName, properties );
+ source = DirectoryProviderHelper.getSourceDirectory( "sourceBase",
"source", directoryProviderName, properties );
if (source == null)
throw new IllegalStateException("FSSlaveDirectoryProvider requires a viable
source directory");
if ( ! new File(source, "current1").exists() && ! new File(source,
"current2").exists() ) {
throw new IllegalStateException("No current marker in source directory");
}
log.debug( "Source directory: " + source );
- File indexDir = DirectoryProviderHelper.determineIndexDir( directoryProviderName,
properties );
+ indexDir = DirectoryProviderHelper.determineIndexDir( directoryProviderName, properties
);
log.debug( "Index directory: " + indexDir.getPath() );
- String refreshPeriod = properties.getProperty( "refresh", "3600"
);
- long period = Long.parseLong( refreshPeriod );
- log.debug("Refresh period " + period + " seconds");
- period *= 1000; //per second
try {
boolean create = !indexDir.exists();
indexName = indexDir.getCanonicalPath();
@@ -61,7 +65,21 @@
indexDir.mkdir();
log.debug("Initializing index directory " + indexName);
}
+ }
+ catch (IOException e) {
+ throw new HibernateException( "Unable to initialize index: " +
directoryProviderName, e );
+ }
+ }
+ public void start() {
+ //source guessing
+ String refreshPeriod = properties.getProperty( "refresh", "3600"
);
+ long period = Long.parseLong( refreshPeriod );
+ log.debug("Refresh period " + period + " seconds");
+ period *= 1000; //per second
+ try {
+ boolean create;
+
File subDir = new File( indexName, "1" );
create = ! subDir.exists();
directory1 = FSDirectory.getDirectory( subDir.getCanonicalPath());
Modified: search/trunk/src/java/org/hibernate/search/store/RAMDirectoryProvider.java
===================================================================
--- search/trunk/src/java/org/hibernate/search/store/RAMDirectoryProvider.java 2007-08-21
00:25:25 UTC (rev 13944)
+++ search/trunk/src/java/org/hibernate/search/store/RAMDirectoryProvider.java 2007-08-21
18:01:54 UTC (rev 13945)
@@ -23,6 +23,9 @@
public void initialize(String directoryProviderName, Properties properties,
SearchFactoryImplementor searchFactoryImplementor) {
indexName = directoryProviderName;
+ }
+
+ public void start() {
directory = new RAMDirectory();
try {
IndexWriter iw = new IndexWriter( directory, new StandardAnalyzer(), true );
@@ -33,6 +36,7 @@
}
}
+
public RAMDirectory getDirectory() {
return directory;
}