Search in sources :

Example 11 with BeanComponentDefinition

use of org.springframework.beans.factory.parsing.BeanComponentDefinition in project spring-integration by spring-projects.

the class IntegrationNamespaceUtils method configureAdviceChain.

@SuppressWarnings({ "rawtypes", "unchecked" })
public static ManagedList configureAdviceChain(Element adviceChainElement, Element txElement, boolean handleMessageAdvice, BeanDefinition parentBeanDefinition, ParserContext parserContext) {
    ManagedList adviceChain = new ManagedList();
    if (txElement != null) {
        adviceChain.add(configureTransactionAttributes(txElement, handleMessageAdvice));
    }
    if (adviceChainElement != null) {
        NodeList childNodes = adviceChainElement.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)) {
                    BeanDefinitionHolder holder = parserContext.getDelegate().parseBeanDefinitionElement(childElement, parentBeanDefinition);
                    parserContext.registerBeanComponent(new BeanComponentDefinition(holder));
                    adviceChain.add(new RuntimeBeanReference(holder.getBeanName()));
                } else if ("ref".equals(localName)) {
                    String ref = childElement.getAttribute("bean");
                    adviceChain.add(new RuntimeBeanReference(ref));
                } else {
                    BeanDefinition customBeanDefinition = parserContext.getDelegate().parseCustomElement(childElement, parentBeanDefinition);
                    if (customBeanDefinition == null) {
                        parserContext.getReaderContext().error("failed to parse custom element '" + localName + "'", childElement);
                    }
                    adviceChain.add(customBeanDefinition);
                }
            }
        }
    }
    return adviceChain;
}
Also used : NodeList(org.w3c.dom.NodeList) Node(org.w3c.dom.Node) BeanMetadataElement(org.springframework.beans.BeanMetadataElement) Element(org.w3c.dom.Element) BeanDefinitionHolder(org.springframework.beans.factory.config.BeanDefinitionHolder) ManagedList(org.springframework.beans.factory.support.ManagedList) BeanComponentDefinition(org.springframework.beans.factory.parsing.BeanComponentDefinition) RuntimeBeanReference(org.springframework.beans.factory.config.RuntimeBeanReference) RootBeanDefinition(org.springframework.beans.factory.support.RootBeanDefinition) BeanDefinition(org.springframework.beans.factory.config.BeanDefinition) AbstractPollingEndpoint(org.springframework.integration.endpoint.AbstractPollingEndpoint)

Example 12 with BeanComponentDefinition

use of org.springframework.beans.factory.parsing.BeanComponentDefinition in project spring-integration by spring-projects.

the class AbstractConsumerEndpointParser method parseInternal.

@Override
protected final AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
    BeanDefinitionBuilder handlerBuilder = this.parseHandler(element, parserContext);
    IntegrationNamespaceUtils.setReferenceIfAttributeDefined(handlerBuilder, element, "output-channel");
    IntegrationNamespaceUtils.setValueIfAttributeDefined(handlerBuilder, element, "order");
    Element txElement = DomUtils.getChildElementByTagName(element, "transactional");
    Element adviceChainElement = DomUtils.getChildElementByTagName(element, IntegrationNamespaceUtils.REQUEST_HANDLER_ADVICE_CHAIN);
    @SuppressWarnings("rawtypes") ManagedList adviceChain = IntegrationNamespaceUtils.configureAdviceChain(adviceChainElement, txElement, true, handlerBuilder.getRawBeanDefinition(), parserContext);
    if (!CollectionUtils.isEmpty(adviceChain)) {
        handlerBuilder.addPropertyValue("adviceChain", adviceChain);
    }
    AbstractBeanDefinition handlerBeanDefinition = handlerBuilder.getBeanDefinition();
    String inputChannelAttributeName = this.getInputChannelAttributeName();
    boolean hasInputChannelAttribute = element.hasAttribute(inputChannelAttributeName);
    if (parserContext.isNested()) {
        String elementDescription = IntegrationNamespaceUtils.createElementDescription(element);
        if (hasInputChannelAttribute) {
            parserContext.getReaderContext().error("The '" + inputChannelAttributeName + "' attribute isn't allowed for a nested (e.g. inside a <chain/>) endpoint element: " + elementDescription + ".", element);
        }
        if (!replyChannelInChainAllowed(element)) {
            if (StringUtils.hasText(element.getAttribute("reply-channel"))) {
                parserContext.getReaderContext().error("The 'reply-channel' attribute isn't" + " allowed for a nested (e.g. inside a <chain/>) outbound gateway element: " + elementDescription + ".", element);
            }
        }
        return handlerBeanDefinition;
    } else {
        if (!hasInputChannelAttribute) {
            String elementDescription = IntegrationNamespaceUtils.createElementDescription(element);
            parserContext.getReaderContext().error("The '" + inputChannelAttributeName + "' attribute is required for the top-level endpoint element: " + elementDescription + ".", element);
        }
    }
    BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(ConsumerEndpointFactoryBean.class);
    if (!CollectionUtils.isEmpty(adviceChain)) {
        builder.addPropertyValue("adviceChain", adviceChain);
    }
    String handlerBeanName = BeanDefinitionReaderUtils.generateBeanName(handlerBeanDefinition, parserContext.getRegistry());
    String[] handlerAlias = IntegrationNamespaceUtils.generateAlias(element);
    parserContext.registerBeanComponent(new BeanComponentDefinition(handlerBeanDefinition, handlerBeanName, handlerAlias));
    builder.addPropertyReference("handler", handlerBeanName);
    String inputChannelName = element.getAttribute(inputChannelAttributeName);
    if (!parserContext.getRegistry().containsBeanDefinition(inputChannelName)) {
        if (parserContext.getRegistry().containsBeanDefinition(IntegrationContextUtils.AUTO_CREATE_CHANNEL_CANDIDATES_BEAN_NAME)) {
            BeanDefinition channelRegistry = parserContext.getRegistry().getBeanDefinition(IntegrationContextUtils.AUTO_CREATE_CHANNEL_CANDIDATES_BEAN_NAME);
            ConstructorArgumentValues caValues = channelRegistry.getConstructorArgumentValues();
            ValueHolder vh = caValues.getArgumentValue(0, Collection.class);
            if (vh == null) {
                // although it should never happen if it does we can fix it
                caValues.addIndexedArgumentValue(0, new ManagedSet<String>());
            }
            @SuppressWarnings("unchecked") Collection<String> channelCandidateNames = (Collection<String>) caValues.getArgumentValue(0, Collection.class).getValue();
            channelCandidateNames.add(inputChannelName);
        } else {
            parserContext.getReaderContext().error("Failed to locate '" + IntegrationContextUtils.AUTO_CREATE_CHANNEL_CANDIDATES_BEAN_NAME + "'", parserContext.getRegistry());
        }
    }
    IntegrationNamespaceUtils.checkAndConfigureFixedSubscriberChannel(element, parserContext, inputChannelName, handlerBeanName);
    builder.addPropertyValue("inputChannelName", inputChannelName);
    List<Element> pollerElementList = DomUtils.getChildElementsByTagName(element, "poller");
    if (!CollectionUtils.isEmpty(pollerElementList)) {
        if (pollerElementList.size() != 1) {
            parserContext.getReaderContext().error("at most one poller element may be configured for an endpoint", element);
        }
        IntegrationNamespaceUtils.configurePollerMetadata(pollerElementList.get(0), builder, parserContext);
    }
    IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, IntegrationNamespaceUtils.AUTO_STARTUP);
    IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, IntegrationNamespaceUtils.PHASE);
    IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, IntegrationNamespaceUtils.ROLE);
    AbstractBeanDefinition beanDefinition = builder.getBeanDefinition();
    String beanName = this.resolveId(element, beanDefinition, parserContext);
    parserContext.registerBeanComponent(new BeanComponentDefinition(beanDefinition, beanName));
    return null;
}
Also used : AbstractBeanDefinition(org.springframework.beans.factory.support.AbstractBeanDefinition) Element(org.w3c.dom.Element) ManagedList(org.springframework.beans.factory.support.ManagedList) AbstractBeanDefinition(org.springframework.beans.factory.support.AbstractBeanDefinition) BeanDefinition(org.springframework.beans.factory.config.BeanDefinition) ValueHolder(org.springframework.beans.factory.config.ConstructorArgumentValues.ValueHolder) ConstructorArgumentValues(org.springframework.beans.factory.config.ConstructorArgumentValues) BeanDefinitionBuilder(org.springframework.beans.factory.support.BeanDefinitionBuilder) Collection(java.util.Collection) BeanComponentDefinition(org.springframework.beans.factory.parsing.BeanComponentDefinition)

Example 13 with BeanComponentDefinition

use of org.springframework.beans.factory.parsing.BeanComponentDefinition in project spring-integration by spring-projects.

the class AbstractOutboundChannelAdapterParser method doParseAndRegisterConsumer.

/**
 * Override this method to control the registration process and return the bean name.
 * If parsing a bean definition whose name can be auto-generated, consider using
 * {@link #parseConsumer(Element, ParserContext)} instead.
 *
 * @param element The element.
 * @param parserContext The parser context.
 * @return The bean component definition.
 */
protected BeanComponentDefinition doParseAndRegisterConsumer(Element element, ParserContext parserContext) {
    AbstractBeanDefinition definition = this.parseConsumer(element, parserContext);
    if (definition == null) {
        parserContext.getReaderContext().error("Consumer parsing must return an AbstractBeanDefinition.", element);
    }
    String order = element.getAttribute(IntegrationNamespaceUtils.ORDER);
    if (StringUtils.hasText(order)) {
        definition.getPropertyValues().addPropertyValue(IntegrationNamespaceUtils.ORDER, order);
    }
    String beanName = BeanDefinitionReaderUtils.generateBeanName(definition, parserContext.getRegistry());
    String[] handlerAlias = IntegrationNamespaceUtils.generateAlias(element);
    BeanComponentDefinition beanComponentDefinition = new BeanComponentDefinition(definition, beanName, handlerAlias);
    parserContext.registerBeanComponent(beanComponentDefinition);
    return beanComponentDefinition;
}
Also used : AbstractBeanDefinition(org.springframework.beans.factory.support.AbstractBeanDefinition) BeanComponentDefinition(org.springframework.beans.factory.parsing.BeanComponentDefinition)

Example 14 with BeanComponentDefinition

use of org.springframework.beans.factory.parsing.BeanComponentDefinition in project spring-integration by spring-projects.

the class ConverterParser method parseInternal.

@Override
protected AbstractBeanDefinition parseInternal(Element element, ParserContext parserContext) {
    BeanDefinitionRegistry registry = parserContext.getRegistry();
    BeanComponentDefinition converterDefinition = IntegrationNamespaceUtils.parseInnerHandlerDefinition(element, parserContext);
    if (converterDefinition != null) {
        INTEGRATION_CONVERTER_INITIALIZER.registerConverter(registry, converterDefinition);
    } else {
        String beanName = element.getAttribute("ref");
        Assert.isTrue(StringUtils.hasText(beanName), "Either a 'ref' attribute pointing to a Converter or a <bean> sub-element defining a Converter is required.");
        INTEGRATION_CONVERTER_INITIALIZER.registerConverter(registry, new RuntimeBeanReference(beanName));
    }
    return null;
}
Also used : BeanDefinitionRegistry(org.springframework.beans.factory.support.BeanDefinitionRegistry) BeanComponentDefinition(org.springframework.beans.factory.parsing.BeanComponentDefinition) RuntimeBeanReference(org.springframework.beans.factory.config.RuntimeBeanReference)

Example 15 with BeanComponentDefinition

use of org.springframework.beans.factory.parsing.BeanComponentDefinition in project spring-integration by spring-projects.

the class ChannelInterceptorParser method parseInterceptors.

@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;
}
Also used : BeanDefinitionParserDelegate(org.springframework.beans.factory.xml.BeanDefinitionParserDelegate) NodeList(org.w3c.dom.NodeList) Node(org.w3c.dom.Node) Element(org.w3c.dom.Element) BeanDefinitionHolder(org.springframework.beans.factory.config.BeanDefinitionHolder) ManagedList(org.springframework.beans.factory.support.ManagedList) BeanComponentDefinition(org.springframework.beans.factory.parsing.BeanComponentDefinition) RuntimeBeanReference(org.springframework.beans.factory.config.RuntimeBeanReference)

Aggregations

BeanComponentDefinition (org.springframework.beans.factory.parsing.BeanComponentDefinition)133 RootBeanDefinition (org.springframework.beans.factory.support.RootBeanDefinition)75 BeanDefinition (org.springframework.beans.factory.config.BeanDefinition)52 RuntimeBeanReference (org.springframework.beans.factory.config.RuntimeBeanReference)47 BeanDefinitionBuilder (org.springframework.beans.factory.support.BeanDefinitionBuilder)47 Element (org.w3c.dom.Element)29 BeanMetadataElement (org.springframework.beans.BeanMetadataElement)22 AbstractBeanDefinition (org.springframework.beans.factory.support.AbstractBeanDefinition)22 CompositeComponentDefinition (org.springframework.beans.factory.parsing.CompositeComponentDefinition)20 BeanDefinitionHolder (org.springframework.beans.factory.config.BeanDefinitionHolder)16 ManagedList (org.springframework.beans.factory.support.ManagedList)14 Nullable (org.springframework.lang.Nullable)10 ComponentDefinition (org.springframework.beans.factory.parsing.ComponentDefinition)9 Test (org.junit.jupiter.api.Test)6 BeanDefinitionRegistry (org.springframework.beans.factory.support.BeanDefinitionRegistry)5 NodeList (org.w3c.dom.NodeList)5 Test (org.junit.Test)4 ManagedMap (org.springframework.beans.factory.support.ManagedMap)4 MutablePropertyValues (org.springframework.beans.MutablePropertyValues)3 PropertyValue (org.springframework.beans.PropertyValue)3