Search in sources :

Example 86 with BeanComponentDefinition

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

the class GlobalChannelInterceptorParser method getBeanDefinitionBuilderConstructorValue.

protected Object getBeanDefinitionBuilderConstructorValue(Element element, ParserContext parserContext) {
    BeanComponentDefinition interceptorBeanDefinition = IntegrationNamespaceUtils.parseInnerHandlerDefinition(element, parserContext);
    if (interceptorBeanDefinition != null) {
        return interceptorBeanDefinition;
    }
    BeanDefinitionParserDelegate delegate = parserContext.getDelegate();
    String beanName = null;
    if (element.hasAttribute(REF_ATTRIBUTE)) {
        beanName = element.getAttribute(REF_ATTRIBUTE);
    } else {
        List<Element> els = DomUtils.getChildElements(element);
        if (els.isEmpty()) {
            parserContext.getReaderContext().error("child BeanDefinition must not be null", element);
        } else {
            Element child = els.get(0);
            if ("wire-tap".equals(child.getLocalName())) {
                beanName = new WireTapParser().parse(child, parserContext);
            } else if (delegate.nodeNameEquals(child, BeanDefinitionParserDelegate.REF_ELEMENT)) {
                return delegate.parsePropertySubElement(child, null);
            } else {
                BeanDefinition beanDef = delegate.parseCustomElement(child);
                beanName = BeanDefinitionReaderUtils.generateBeanName(beanDef, parserContext.getRegistry());
            }
        }
    }
    return new RuntimeBeanReference(beanName);
}
Also used : BeanDefinitionParserDelegate(org.springframework.beans.factory.xml.BeanDefinitionParserDelegate) Element(org.w3c.dom.Element) BeanComponentDefinition(org.springframework.beans.factory.parsing.BeanComponentDefinition) AbstractBeanDefinition(org.springframework.beans.factory.support.AbstractBeanDefinition) BeanDefinition(org.springframework.beans.factory.config.BeanDefinition) RuntimeBeanReference(org.springframework.beans.factory.config.RuntimeBeanReference)

Example 87 with BeanComponentDefinition

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

the class IntegrationNamespaceUtils method parseInnerHandlerDefinition.

public static BeanComponentDefinition parseInnerHandlerDefinition(Element element, ParserContext parserContext) {
    // parses out the inner bean definition for concrete implementation if defined
    List<Element> childElements = DomUtils.getChildElementsByTagName(element, "bean");
    BeanComponentDefinition innerComponentDefinition = null;
    if (childElements != null && childElements.size() == 1) {
        Element beanElement = childElements.get(0);
        BeanDefinitionParserDelegate delegate = parserContext.getDelegate();
        BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(beanElement);
        bdHolder = delegate.decorateBeanDefinitionIfRequired(beanElement, bdHolder);
        BeanDefinition inDef = bdHolder.getBeanDefinition();
        innerComponentDefinition = new BeanComponentDefinition(inDef, bdHolder.getBeanName());
    }
    String ref = element.getAttribute(REF_ATTRIBUTE);
    if (StringUtils.hasText(ref) && innerComponentDefinition != null) {
        parserContext.getReaderContext().error("Ambiguous definition. Inner bean " + (innerComponentDefinition.getBeanDefinition().getBeanClassName()) + " declaration and \"ref\" " + ref + " are not allowed together on element " + IntegrationNamespaceUtils.createElementDescription(element) + ".", parserContext.extractSource(element));
    }
    return innerComponentDefinition;
}
Also used : BeanDefinitionParserDelegate(org.springframework.beans.factory.xml.BeanDefinitionParserDelegate) BeanMetadataElement(org.springframework.beans.BeanMetadataElement) Element(org.w3c.dom.Element) BeanDefinitionHolder(org.springframework.beans.factory.config.BeanDefinitionHolder) BeanComponentDefinition(org.springframework.beans.factory.parsing.BeanComponentDefinition) RootBeanDefinition(org.springframework.beans.factory.support.RootBeanDefinition) BeanDefinition(org.springframework.beans.factory.config.BeanDefinition)

Example 88 with BeanComponentDefinition

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

the class AbstractDelegatingConsumerEndpointParser method parseHandler.

@Override
protected final BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) {
    Object source = parserContext.extractSource(element);
    BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(this.getFactoryBeanClassName());
    BeanComponentDefinition innerDefinition = IntegrationNamespaceUtils.parseInnerHandlerDefinition(element, parserContext);
    String ref = element.getAttribute(REF_ATTRIBUTE);
    String expression = element.getAttribute(EXPRESSION_ATTRIBUTE);
    boolean hasRef = StringUtils.hasText(ref);
    boolean hasExpression = StringUtils.hasText(expression);
    Element scriptElement = DomUtils.getChildElementByTagName(element, "script");
    Element expressionElement = DomUtils.getChildElementByTagName(element, "expression");
    if (innerDefinition != null) {
        if (hasRef || hasExpression || expressionElement != null) {
            parserContext.getReaderContext().error("Neither 'ref' nor 'expression' are permitted when an inner bean (<bean/>) is configured on element " + IntegrationNamespaceUtils.createElementDescription(element) + ".", source);
            return null;
        }
        builder.addPropertyValue("targetObject", innerDefinition);
    } else if (scriptElement != null) {
        if (hasRef || hasExpression || expressionElement != null) {
            parserContext.getReaderContext().error("Neither 'ref' nor 'expression' are permitted when an inner script element is configured on element " + IntegrationNamespaceUtils.createElementDescription(element) + ".", source);
            return null;
        }
        BeanDefinition scriptBeanDefinition = parserContext.getDelegate().parseCustomElement(scriptElement, builder.getBeanDefinition());
        builder.addPropertyValue("targetObject", scriptBeanDefinition);
    } else if (expressionElement != null) {
        if (hasRef || hasExpression) {
            parserContext.getReaderContext().error("Neither 'ref' nor 'expression' are permitted when an inner 'expression' element is configured on element " + IntegrationNamespaceUtils.createElementDescription(element) + ".", source);
            return null;
        }
        BeanDefinitionBuilder dynamicExpressionBuilder = BeanDefinitionBuilder.genericBeanDefinition(DynamicExpression.class);
        String key = expressionElement.getAttribute("key");
        String expressionSourceReference = expressionElement.getAttribute("source");
        dynamicExpressionBuilder.addConstructorArgValue(key);
        dynamicExpressionBuilder.addConstructorArgReference(expressionSourceReference);
        builder.addPropertyValue("expression", dynamicExpressionBuilder.getBeanDefinition());
    } else if (hasRef && hasExpression) {
        parserContext.getReaderContext().error("Only one of 'ref' or 'expression' is permitted, not both, on element " + IntegrationNamespaceUtils.createElementDescription(element) + ".", source);
        return null;
    } else if (hasRef) {
        builder.addPropertyReference("targetObject", ref);
    } else if (hasExpression) {
        builder.addPropertyValue("expressionString", expression);
    } else if (!this.hasDefaultOption()) {
        parserContext.getReaderContext().error("Exactly one of the 'ref' attribute, 'expression' attribute, " + "or inner bean (<bean/>) definition is required for element " + IntegrationNamespaceUtils.createElementDescription(element) + ".", source);
        return null;
    }
    String method = element.getAttribute(METHOD_ATTRIBUTE);
    if (StringUtils.hasText(method)) {
        if (hasExpression || expressionElement != null) {
            parserContext.getReaderContext().error("A 'method' attribute is not permitted when configuring an 'expression' on element " + IntegrationNamespaceUtils.createElementDescription(element) + ".", source);
        }
        if (hasRef || innerDefinition != null) {
            builder.addPropertyValue("targetMethodName", method);
        } else {
            parserContext.getReaderContext().error("A 'method' attribute is only permitted when either " + "a 'ref' or inner-bean definition is provided on element " + IntegrationNamespaceUtils.createElementDescription(element) + ".", source);
        }
    }
    IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "requires-reply");
    IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "send-timeout");
    this.postProcess(builder, element, parserContext);
    return builder;
}
Also used : BeanDefinitionBuilder(org.springframework.beans.factory.support.BeanDefinitionBuilder) Element(org.w3c.dom.Element) BeanComponentDefinition(org.springframework.beans.factory.parsing.BeanComponentDefinition) BeanDefinition(org.springframework.beans.factory.config.BeanDefinition)

Example 89 with BeanComponentDefinition

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

the class AbstractOutboundChannelAdapterParser method doParse.

@Override
protected AbstractBeanDefinition doParse(Element element, ParserContext parserContext, String channelName) {
    if (parserContext.isNested()) {
        if (channelName != null) {
            String elementDescription = IntegrationNamespaceUtils.createElementDescription(element);
            parserContext.getReaderContext().error("The 'channel' attribute isn't allowed for " + elementDescription + " when it is used as a nested element," + " e.g. inside a <chain/>", element);
        }
        AbstractBeanDefinition consumerBeanDefinition = this.parseConsumer(element, parserContext);
        this.configureRequestHandlerAdviceChain(element, parserContext, consumerBeanDefinition, null);
        return consumerBeanDefinition;
    }
    BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(ConsumerEndpointFactoryBean.class);
    Element pollerElement = DomUtils.getChildElementByTagName(element, "poller");
    BeanComponentDefinition handlerBeanComponentDefinition = this.doParseAndRegisterConsumer(element, parserContext);
    builder.addPropertyReference("handler", handlerBeanComponentDefinition.getBeanName());
    IntegrationNamespaceUtils.checkAndConfigureFixedSubscriberChannel(element, parserContext, channelName, handlerBeanComponentDefinition.getBeanName());
    if (pollerElement != null) {
        if (!StringUtils.hasText(channelName)) {
            parserContext.getReaderContext().error("outbound channel adapter with a 'poller' requires a 'channel' to poll", element);
        }
        IntegrationNamespaceUtils.configurePollerMetadata(pollerElement, builder, parserContext);
    }
    builder.addPropertyValue("inputChannelName", channelName);
    this.configureRequestHandlerAdviceChain(element, parserContext, handlerBeanComponentDefinition.getBeanDefinition(), builder);
    return builder.getBeanDefinition();
}
Also used : BeanDefinitionBuilder(org.springframework.beans.factory.support.BeanDefinitionBuilder) AbstractBeanDefinition(org.springframework.beans.factory.support.AbstractBeanDefinition) Element(org.w3c.dom.Element) BeanComponentDefinition(org.springframework.beans.factory.parsing.BeanComponentDefinition)

Example 90 with BeanComponentDefinition

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

the class AggregatorParser method parseHandler.

@Override
protected BeanDefinitionBuilder parseHandler(Element element, ParserContext parserContext) {
    BeanComponentDefinition innerHandlerDefinition = IntegrationNamespaceUtils.parseInnerHandlerDefinition(element, parserContext);
    String ref = element.getAttribute(REF_ATTRIBUTE);
    BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(AggregatorFactoryBean.class);
    BeanMetadataElement processor = null;
    if (innerHandlerDefinition != null || StringUtils.hasText(ref)) {
        if (innerHandlerDefinition != null) {
            processor = innerHandlerDefinition;
        } else {
            processor = new RuntimeBeanReference(ref);
        }
        builder.addPropertyValue("processorBean", processor);
    } else {
        if (StringUtils.hasText(element.getAttribute(EXPRESSION_ATTRIBUTE))) {
            String expression = element.getAttribute(EXPRESSION_ATTRIBUTE);
            BeanDefinitionBuilder adapterBuilder = BeanDefinitionBuilder.genericBeanDefinition(ExpressionEvaluatingMessageGroupProcessor.class);
            adapterBuilder.addConstructorArgValue(expression);
            builder.addPropertyValue("processorBean", adapterBuilder.getBeanDefinition());
        } else {
            builder.addPropertyValue("processorBean", BeanDefinitionBuilder.genericBeanDefinition(DefaultAggregatingMessageGroupProcessor.class).getBeanDefinition());
        }
    }
    if (StringUtils.hasText(element.getAttribute(METHOD_ATTRIBUTE))) {
        String method = element.getAttribute(METHOD_ATTRIBUTE);
        builder.addPropertyValue("methodName", method);
    }
    this.doParse(builder, element, processor, parserContext);
    IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, EXPIRE_GROUPS_UPON_COMPLETION);
    return builder;
}
Also used : BeanMetadataElement(org.springframework.beans.BeanMetadataElement) BeanDefinitionBuilder(org.springframework.beans.factory.support.BeanDefinitionBuilder) 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