private string ParseMessageListenerContainer(XmlElement element, ParserContext parserContext)
        {
            if (element.HasAttribute("container"))
            {
                foreach (string containerAttribute in containerAttributes)
                {
                    if (element.HasAttribute(containerAttribute))
                    {
                        parserContext.ReaderContext.ReportException(element, containerAttribute,
                                                                    "The '" + containerAttribute +
                                                                    "' attribute should not be provided when specifying a 'container' reference.");
                    }
                }
                return(element.GetAttribute("container"));
            }
            ObjectDefinitionBuilder builder = ObjectDefinitionBuilder.GenericObjectDefinition(typeof(SimpleMessageListenerContainer));
            string destinationAttribute     = this.expectReply ? "request-destination" : "destination";
            string destinationNameAttribute = this.expectReply ? "request-destination-name" : "destination-name";
            string destination     = element.GetAttribute(destinationAttribute);
            string destinationName = element.GetAttribute(destinationNameAttribute);

            if (!(StringUtils.HasText(destination) ^ StringUtils.HasText(destinationName)))
            {
                parserContext.ReaderContext.ReportException(element, "destination or destination-name",
                                                            "Exactly one of '" + destinationAttribute + "' or '" + destinationNameAttribute + "' is required.");
            }

            builder.AddPropertyReference(NmsAdapterParserUtils.CONNECTION_FACTORY_PROPERTY,
                                         NmsAdapterParserUtils.DetermineConnectionFactoryBeanName(element, parserContext));

            if (StringUtils.HasText(destination))
            {
                builder.AddPropertyReference("destination", destination);
            }
            else
            {
                builder.AddPropertyValue("destinationName", destinationName);
            }
            AcknowledgementMode acknowledgementMode = NmsAdapterParserUtils.ParseAcknowledgementMode(element, parserContext);

            if (acknowledgementMode.Equals(AcknowledgementMode.Transactional))
            {
                builder.AddPropertyValue("sessionTransacted", true);
            }
            else
            {
                builder.AddPropertyValue("sessionAcknowledgeMode", acknowledgementMode);
            }

            IntegrationNamespaceUtils.SetReferenceIfAttributeDefined(builder, element, "destination-resolver");
            IntegrationNamespaceUtils.SetReferenceIfAttributeDefined(builder, element, "transaction-manager");
            IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "pub-sub-domain");
            IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "concurrent-consumers");
            IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "max-concurrent-consumers");
            IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "max-messages-per-task");
            IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "idle-task-execution-limit");
            builder.AddPropertyValue("autoStartup", false);
            return(parserContext.ReaderContext.RegisterWithGeneratedName(builder.ObjectDefinition));
        }
        protected override void DoParse(XmlElement element, ParserContext parserContext, ObjectDefinitionBuilder builder)
        {
            String containerBeanName = ParseMessageListenerContainer(element, parserContext);
            String listenerBeanName  = ParseMessageListener(element, parserContext);

            builder.AddConstructorArgReference(containerBeanName);
            builder.AddConstructorArgReference(listenerBeanName);
            IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "auto-startup");
        }
        protected override string ParseSource(XmlElement element, ParserContext parserContext)
        {
            ObjectDefinitionBuilder builder = ObjectDefinitionBuilder.GenericObjectDefinition(typeof(NmsDestinationPollingSource));
            string nmsTemplate     = element.GetAttribute(NmsAdapterParserUtils.NMS_TEMPLATE_ATTRIBUTE);
            string destination     = element.GetAttribute(NmsAdapterParserUtils.DESTINATION_ATTRIBUTE);
            string destinationName = element.GetAttribute(NmsAdapterParserUtils.DESTINATION_NAME_ATTRIBUTE);
            string headerMapper    = element.GetAttribute(NmsAdapterParserUtils.HEADER_MAPPER_ATTRIBUTE);

            if (StringUtils.HasText(nmsTemplate))
            {
                if (element.HasAttribute(NmsAdapterParserUtils.CONNECTION_FACTORY_ATTRIBUTE) ||
                    element.HasAttribute(NmsAdapterParserUtils.DESTINATION_NAME_ATTRIBUTE) ||
                    element.HasAttribute(NmsAdapterParserUtils.DESTINATION_ATTRIBUTE))
                {
                    throw new ObjectCreationException(
                              "When providing '" + NmsAdapterParserUtils.NMS_TEMPLATE_ATTRIBUTE +
                              "', none of '" + NmsAdapterParserUtils.CONNECTION_FACTORY_ATTRIBUTE +
                              "', '" + NmsAdapterParserUtils.DESTINATION_ATTRIBUTE + "', or '" +
                              NmsAdapterParserUtils.DESTINATION_NAME_ATTRIBUTE + "' should be provided.");
                }
                builder.AddConstructorArgReference(nmsTemplate);
            }

            else if (StringUtils.HasText(destination) || StringUtils.HasText(destinationName))
            {
                builder.AddConstructorArgReference(NmsAdapterParserUtils.DetermineConnectionFactoryBeanName(element,
                                                                                                            parserContext));
                if (StringUtils.HasText(destination))
                {
                    builder.AddConstructorArgReference(destination);
                }
                else if (StringUtils.HasText(destinationName))
                {
                    builder.AddConstructorArg(destinationName);
                }
            }
            else
            {
                throw new ObjectCreationException("either a '" + NmsAdapterParserUtils.NMS_TEMPLATE_ATTRIBUTE + "' or one of '" +
                                                  NmsAdapterParserUtils.DESTINATION_ATTRIBUTE + "' or '" + NmsAdapterParserUtils.DESTINATION_NAME_ATTRIBUTE +
                                                  "' attributes must be provided for a polling NMS adapter");
            }
            if (StringUtils.HasText(headerMapper))
            {
                builder.AddPropertyReference(NmsAdapterParserUtils.HEADER_MAPPER_PROPERTY, headerMapper);
            }
            IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "extract-payload");
            IntegrationNamespaceUtils.SetReferenceIfAttributeDefined(builder, element, "destination-resolver");
            return(parserContext.ReaderContext.RegisterWithGeneratedName(builder.ObjectDefinition));
        }
        protected override AbstractObjectDefinition ParseConsumer(XmlElement element, ParserContext parserContext)
        {
            ObjectDefinitionBuilder builder = ObjectDefinitionBuilder.GenericObjectDefinition(typeof(NmsSendingMessageHandler));
            string nmsTemplate     = element.GetAttribute(NmsAdapterParserUtils.NMS_TEMPLATE_ATTRIBUTE);
            string destination     = element.GetAttribute(NmsAdapterParserUtils.DESTINATION_ATTRIBUTE);
            string destinationName = element.GetAttribute(NmsAdapterParserUtils.DESTINATION_NAME_ATTRIBUTE);
            string headerMapper    = element.GetAttribute(NmsAdapterParserUtils.HEADER_MAPPER_ATTRIBUTE);

            if (StringUtils.HasText(nmsTemplate))
            {
                if (element.HasAttribute(NmsAdapterParserUtils.CONNECTION_FACTORY_ATTRIBUTE) ||
                    element.HasAttribute(NmsAdapterParserUtils.DESTINATION_NAME_ATTRIBUTE) ||
                    element.HasAttribute(NmsAdapterParserUtils.DESTINATION_ATTRIBUTE))
                {
                    throw new ObjectCreationException(
                              "When providing '" + NmsAdapterParserUtils.NMS_TEMPLATE_ATTRIBUTE +
                              "', none of '" + NmsAdapterParserUtils.CONNECTION_FACTORY_ATTRIBUTE +
                              "', '" + NmsAdapterParserUtils.DESTINATION_ATTRIBUTE + "', or '" +
                              NmsAdapterParserUtils.DESTINATION_NAME_ATTRIBUTE + "' should be provided.");
                }
                builder.AddPropertyReference(NmsAdapterParserUtils.NMS_TEMPLATE_PROPERTY, nmsTemplate);
            }
            else if (StringUtils.HasText(destination) ^ StringUtils.HasText(destinationName))
            {
                builder.AddPropertyReference(NmsAdapterParserUtils.CONNECTION_FACTORY_PROPERTY,
                                             NmsAdapterParserUtils.DetermineConnectionFactoryBeanName(element, parserContext));
                if (StringUtils.HasText(destination))
                {
                    builder.AddPropertyReference(NmsAdapterParserUtils.DESTINATION_PROPERTY, destination);
                }
                else
                {
                    builder.AddPropertyValue(NmsAdapterParserUtils.DESTINATION_NAME_PROPERTY, destinationName);
                }
            }
            else
            {
                throw new ObjectCreationException("either a '" + NmsAdapterParserUtils.NMS_TEMPLATE_ATTRIBUTE + "' or one of '" +
                                                  NmsAdapterParserUtils.DESTINATION_ATTRIBUTE + "' or '" + NmsAdapterParserUtils.DESTINATION_NAME_ATTRIBUTE +
                                                  "' attributes must be provided");
            }
            if (StringUtils.HasText(headerMapper))
            {
                builder.AddPropertyReference(NmsAdapterParserUtils.HEADER_MAPPER_PROPERTY, headerMapper);
            }
            IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "extract-payload");
            return(builder.ObjectDefinition);
        }
        private string ParseMessageListener(XmlElement element, ParserContext parserContext)
        {
            ObjectDefinitionBuilder builder = ObjectDefinitionBuilder.GenericObjectDefinition(typeof(ChannelPublishingJmsMessageListener));

            builder.AddPropertyValue("expectReply", this.expectReply);
            if (this.expectReply)
            {
                IntegrationNamespaceUtils.SetReferenceIfAttributeDefined(builder, element, "request-channel");
                IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "request-timeout");
                IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "reply-timeout");
                IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "extract-request-payload");
                IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "extract-reply-payload");
                int defaults = 0;
                if (StringUtils.HasText(element.GetAttribute(DEFAULT_REPLY_DESTINATION_ATTRIB)))
                {
                    defaults++;
                }
                if (StringUtils.HasText(element.GetAttribute(DEFAULT_REPLY_QUEUE_NAME_ATTRIB)))
                {
                    defaults++;
                }
                if (StringUtils.HasText(element.GetAttribute(DEFAULT_REPLY_TOPIC_NAME_ATTRIB)))
                {
                    defaults++;
                }
                if (defaults > 1)
                {
                    parserContext.ReaderContext.ReportException(element, "several possible properites", "At most one of '" + DEFAULT_REPLY_DESTINATION_ATTRIB
                                                                + "', '" + DEFAULT_REPLY_QUEUE_NAME_ATTRIB + "', or '" + DEFAULT_REPLY_TOPIC_NAME_ATTRIB
                                                                + "' may be provided.");
                }
                IntegrationNamespaceUtils.SetReferenceIfAttributeDefined(builder, element, DEFAULT_REPLY_DESTINATION_ATTRIB);
                IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, DEFAULT_REPLY_QUEUE_NAME_ATTRIB);
                IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, DEFAULT_REPLY_TOPIC_NAME_ATTRIB);
                IntegrationNamespaceUtils.SetReferenceIfAttributeDefined(builder, element, "destination-resolver");
            }
            else
            {
                IntegrationNamespaceUtils.SetReferenceIfAttributeDefined(builder, element, "channel", "requestChannel");
                IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "send-timeout", "requestTimeout");
                IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "extract-payload", "extractRequestPayload");
            }
            IntegrationNamespaceUtils.SetReferenceIfAttributeDefined(builder, element, "message-converter");
            IntegrationNamespaceUtils.SetReferenceIfAttributeDefined(builder, element, "header-mapper");
            return(parserContext.ReaderContext.RegisterWithGeneratedName(builder.ObjectDefinition));
        }
        protected override ObjectDefinitionBuilder ParseHandler(XmlElement element, ParserContext parserContext)
        {
            ObjectDefinitionBuilder builder = ObjectDefinitionBuilder.GenericObjectDefinition(typeof(NmsOutboundGateway));

            builder.AddPropertyReference("connectionFactory", element.GetAttribute("connection-factory"));
            String requestDestination     = element.GetAttribute("request-destination");
            String requestDestinationName = element.GetAttribute("request-destination-name");

            if (!(StringUtils.HasText(requestDestination) ^ StringUtils.HasText(requestDestinationName)))
            {
                parserContext.ReaderContext.ReportException(element, "request-destination or request-destination-name",
                                                            "Exactly one of the 'request-destination' or 'request-destination-name' attributes is required.");
            }
            if (StringUtils.HasText(requestDestination))
            {
                builder.AddPropertyReference("requestDestination", requestDestination);
            }
            else if (StringUtils.HasText(requestDestinationName))
            {
                builder.AddPropertyValue("requestDestinationName", requestDestinationName);
            }
            IntegrationNamespaceUtils.SetReferenceIfAttributeDefined(builder, element, "reply-destination");
            IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "reply-destination-name");
            IntegrationNamespaceUtils.SetReferenceIfAttributeDefined(builder, element, "reply-channel");
            IntegrationNamespaceUtils.SetReferenceIfAttributeDefined(builder, element, "message-converter");
            IntegrationNamespaceUtils.SetReferenceIfAttributeDefined(builder, element, "header-mapper");
            IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "extract-request-payload");
            IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "extract-reply-payload");
            IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "receive-timeout");
            IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "pub-sub-domain");
            IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "delivery-mode");
            IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "time-to-live");
            IntegrationNamespaceUtils.SetValueIfAttributeDefined(builder, element, "priority");



            return(builder);
        }