/* * Copyright 2002-2008 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.springframework.integration.config.xml; import java.util.HashMap; import java.util.Map; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.springframework.beans.factory.config.BeanDefinitionHolder; import org.springframework.beans.factory.config.RuntimeBeanReference; import org.springframework.beans.factory.parsing.BeanComponentDefinition; import org.springframework.beans.factory.support.ManagedList; import org.springframework.beans.factory.xml.BeanDefinitionParserDelegate; import org.springframework.beans.factory.xml.ParserContext; /** * A helper class for parsing the sub-elements of a channel's * <em>interceptors</em> element. * * @author Mark Fisher * @author Oleg Zhurakousky */ public class ChannelInterceptorParser { private final Map<String, BeanDefinitionRegisteringParser> parsers; public ChannelInterceptorParser() { this.parsers = new HashMap<String, BeanDefinitionRegisteringParser>(); this.parsers.put("wire-tap", new WireTapParser()); } @SuppressWarnings({ "unchecked", "rawtypes" }) public ManagedList parseInterceptors(Element element, ParserContext parserContext) { ManagedList interceptors = new ManagedList(); NodeList childNodes = element.getChildNodes(); for (int i = 0; i < childNodes.getLength(); i++) { Node child = childNodes.item(i); if (child.getNodeType() == Node.ELEMENT_NODE) { Element childElement = (Element) child; String localName = child.getLocalName(); if ("bean".equals(localName)) { BeanDefinitionParserDelegate delegate = parserContext.getDelegate(); BeanDefinitionHolder holder = delegate.parseBeanDefinitionElement(childElement); holder = delegate.decorateBeanDefinitionIfRequired(childElement, holder); parserContext.registerBeanComponent(new BeanComponentDefinition(holder)); interceptors.add(new RuntimeBeanReference(holder.getBeanName())); } else if ("ref".equals(localName)) { String ref = childElement.getAttribute("bean"); interceptors.add(new RuntimeBeanReference(ref)); } else { BeanDefinitionRegisteringParser parser = this.parsers.get(localName); if (parser == null) { parserContext.getReaderContext().error( "unsupported interceptor element '" + localName + "'", childElement); } String interceptorBeanName = parser.parse(childElement, parserContext); interceptors.add(new RuntimeBeanReference(interceptorBeanName)); } } } return interceptors; } }