/* * Copyright 2002-2007 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.springmodules.lucene.index.document.handler; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.util.Iterator; import java.util.Map; import java.util.Set; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; /** * This factory bean class is used to declaratively configured * a DocumentHandlerManager instance which can be used by template * or indexers. * * <p>The configured DocumentHandlerManager can be based either on file * extensions because the factory bean uses the DocumentExtensionMatching * class to register the specified DocumentHandlers with the documentHandlers * property. * * The class internally uses by default the class <code>DefaultDocumentHandlerManager</code> * as implementation of <code>DocumentHandlerManager</code> and <code>IdentityDocumentMatching</code> * as implementation of <code>DocumentMatching</code>. This can be changed according to * their different mutators. * In the case of a matching based on file extension, the <code>ExtensionDocumentMatching</code> * can be used. * * @author Thierry Templier * @see org.springmodules.lucene.index.support.file.DocumentHandlerManager * @see #setDocumentHandlerManagerClass(Class) * @see #setDocumentMatchingClass(Class) * @see org.springmodules.lucene.index.support.handler.IdentityDocumentMatching * @see org.springmodules.lucene.index.support.handler.ExtensionDocumentMatching */ public class DocumentHandlerManagerFactoryBean implements FactoryBean,InitializingBean { private DocumentHandlerManager documentHandlerManager; private Map documentHandlers; private Class documentHandlerManagerClass = DefaultDocumentHandlerManager.class; private Class documentMatchingClass = IdentityDocumentMatching.class; private Constructor documentMatchingConstructor; /** * @see org.springframework.beans.factory.FactoryBean#getObject() */ public Object getObject() throws Exception { return documentHandlerManager; } /** * @see org.springframework.beans.factory.FactoryBean#getObjectType() */ public Class getObjectType() { return DocumentHandlerManager.class; } /** * @see org.springframework.beans.factory.FactoryBean#isSingleton() */ public boolean isSingleton() { return true; } private DocumentHandlerManager instanciateDocumentHandlerManager() throws InstantiationException, IllegalAccessException { return (DocumentHandlerManager)documentHandlerManagerClass.newInstance(); } private DocumentMatching instanciateDocumentMatching(String name) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException, SecurityException, NoSuchMethodException { if( documentMatchingConstructor==null ) { documentMatchingConstructor = documentMatchingClass.getConstructor( new Class[] { String.class }); } return (DocumentMatching)documentMatchingConstructor.newInstance( new Object[] { name }); } /** * This method registers all the configured DocumentHandler on the * DocumentHandlerManager using the specified DocumentMatching after * the call of the registerDefaultHandlers on the DocumentHandlerManager. * * @see DocumentHandlerManager#registerDefaultHandlers() */ public void afterPropertiesSet() throws Exception { documentHandlerManager = instanciateDocumentHandlerManager(); documentHandlerManager.registerDefaultHandlers(); if( documentHandlers!=null ) { Set documentHandlersKeys = documentHandlers.keySet(); for(Iterator i = documentHandlersKeys.iterator(); i.hasNext();) { String key = (String)i.next(); documentHandlerManager.registerDocumentHandler( instanciateDocumentMatching(key), (DocumentHandler)documentHandlers.get(key)); } } } public Map getDocumentHandlers() { return documentHandlers; } public void setDocumentHandlers(Map map) { documentHandlers = map; } public Class getDocumentHandlerManagerClass() { return documentHandlerManagerClass; } public void setDocumentHandlerManagerClass(Class documentHandlerManagerClass) { this.documentHandlerManagerClass = documentHandlerManagerClass; } public Class getDocumentMatchingClass() { return documentMatchingClass; } public void setDocumentMatchingClass(Class documentMatchingClass) { this.documentMatchingClass = documentMatchingClass; } }