Using a CustomEditorConfigurer to Specify a Lucene FSDirectory Using Spring
When I started to use Spring with my Lucene application, I searched for an easy way to specify the directory name where the Lucene repository is stored. Since the FSDirectory class is not instantiated directly (you need to call FSDirectory.getDirectory), I couldn't see how to configure Spring to create the object for me.
Then I discovered that the JavaBeans api has the ability to automatically convert from a String to any other class using a configurator object. With this ability, specifying a bean that uses an FSDirectory can be done in the following way:
<bean id="serverDatabase" class="com.server.DB" method="setup"> <property name='directory'><value>data/LuceneRepsitory</value></property> </bean>
The idea is that when Spring wired beans together some configurer object would convert that String into a Lucune FSDirectory object. This conversion is done by the following Java class:
public class FileSystemLuceneDirectoryEditor extends PropertyEditorSupport {
public void setAsText(final String textValue) {
try {
final boolean fileExists = new File(textValue).exists();
final boolean createDirectory = fileExists == true ? false : true;
setValue(FSDirectory.getDirectory(textValue, createDirectory));
} catch (IOException e) {
throw new CriteriaWatchException(e);
}
}
}
The configurer class needs to be introduced to Spring through its XML configuration file:
<bean id='customEditorConfigurer' class='org.springframework.beans.factory.config.CustomEditorConfigurer'>
<property name='customEditors'>
<map>
<entry key='org.apache.lucene.store.Directory'>
<bean id='luceneDirectoryEditor' class='FileSystemLuceneDirectoryEditor'/>
</entry>
</map>
</property>
</bean>
After the above work is done, Spring automatically converts any String values that are destined to be Directory parameters.