/* * 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.config; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.springframework.beans.MutablePropertyValues; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.RootBeanDefinition; import org.springframework.beans.factory.xml.BeanDefinitionParser; import org.springframework.beans.factory.xml.ParserContext; import org.springframework.util.xml.DomUtils; import org.springmodules.lucene.index.resource.NameMatchResourceAttributeSource; import org.springmodules.lucene.index.resource.ResourceInterceptor; import org.springmodules.lucene.index.resource.RuleBasedResourceAttribute; import org.w3c.dom.Element; /** * {@link org.springframework.beans.factory.xml.BeanDefinitionParser} * for the <code><lucene:resource-advice></code> tag. * * @author Thierry Templier */ class ResourceAdviceBeanDefinitionParser extends AbstractLuceneBeanDefinitionParser implements BeanDefinitionParser { private static final String RESOURCE_ATTRIBUTES_SOURCE_ATTRIBUTE = "resourceAttributesSource"; private static final String READER_WRITING_ENABLED_ATTRIBUTE = "reader-writing-enabled"; private static final String WRITER_WRITING_ENABLED_ATTRIBUTE = "writer-writing-enabled"; private static final String READER_OPEN_ATTRIBUTE = "reader-open"; private static final String WRITER_OPEN_ATTRIBUTE = "writer-open"; private static final String NAME_ATTRIBUTE = "name"; private static final String METHOD_TAG = "method"; private static final String ATTRIBUTES_TAG = "attributes"; private static final String DEFAULT_RESOURCE_MANAGER_ID = "resourceManager"; public static final String ID_ATTRIBUTE = "id"; public static final String RESOURCE_MANAGER_REF_ATTRIBUTE = "resource-manager-ref"; public static final String RESOURCE_MANAGER_ATTRIBUTE = "resourceManager"; public static final String TRUE_VALUE = "true"; public BeanDefinition parse(Element element, ParserContext parserContext) { String id = element.getAttribute(ID_ATTRIBUTE); String resourceManagerRef = element.getAttribute(RESOURCE_MANAGER_REF_ATTRIBUTE); if( resourceManagerRef==null || "".equals(resourceManagerRef) ) { resourceManagerRef = DEFAULT_RESOURCE_MANAGER_ID; } BeanDefinitionRegistry registry = parserContext.getRegistry(); RootBeanDefinition resourceAdviceBeanDefinition = new RootBeanDefinition( ResourceInterceptor.class); resourceAdviceBeanDefinition.setPropertyValues(new MutablePropertyValues()); resourceAdviceBeanDefinition.getPropertyValues() .addPropertyValue(RESOURCE_MANAGER_ATTRIBUTE, new RuntimeBeanReference(resourceManagerRef)); configureAttributes(element, resourceAdviceBeanDefinition, parserContext); registry.registerBeanDefinition(id, resourceAdviceBeanDefinition); return null; } private void configureAttributes(Element element, RootBeanDefinition resourceAdviceBeanDefinition, ParserContext parserContext) { Element attrsElement = DomUtils.getChildElementByTagName(element, ATTRIBUTES_TAG); List methodElements = DomUtils.getChildElementsByTagName(attrsElement, METHOD_TAG); NameMatchResourceAttributeSource resourceAttributeSource = new NameMatchResourceAttributeSource(); Map attributes = new HashMap(); for(Iterator i = methodElements.iterator(); i.hasNext(); ) { Element methodElement = (Element)i.next(); String methodName = methodElement.getAttribute(NAME_ATTRIBUTE); RuleBasedResourceAttribute attr = new RuleBasedResourceAttribute(); methodName = methodName.trim(); String writerOpen = methodElement.getAttribute(WRITER_OPEN_ATTRIBUTE); writerOpen = writerOpen.trim(); String readerOpen = methodElement.getAttribute(READER_OPEN_ATTRIBUTE); readerOpen = readerOpen.trim(); String writerWritingEnabled = methodElement.getAttribute(WRITER_WRITING_ENABLED_ATTRIBUTE); writerWritingEnabled = writerWritingEnabled.trim(); String readerWritingEnabled = methodElement.getAttribute(READER_WRITING_ENABLED_ATTRIBUTE); readerWritingEnabled = readerWritingEnabled.trim(); attr.setIndexWriterOpen(TRUE_VALUE.equals(writerOpen)); attr.setIndexReaderOpen(TRUE_VALUE.equals(readerOpen)); attr.setWriteOperationsForIndexWriterAuthorized(TRUE_VALUE.equals(writerWritingEnabled)); attr.setWriteOperationsForIndexReaderAuthorized(TRUE_VALUE.equals(readerWritingEnabled)); attributes.put(methodName, attr); } resourceAttributeSource.setResourceAttributes(attributes); resourceAdviceBeanDefinition.getPropertyValues() .addPropertyValue(RESOURCE_ATTRIBUTES_SOURCE_ATTRIBUTE, resourceAttributeSource); } }