/*
* Copyright 2002-2014 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.jms.config;
import org.w3c.dom.Element;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.xml.ParserContext;
import org.springframework.integration.config.xml.IntegrationNamespaceUtils;
import org.springframework.integration.jms.DynamicJmsTemplate;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.util.StringUtils;
/**
* Utility methods and constants for JMS adapter parsers.
*
* @author Mark Fisher
* @author Gary Russell
*/
abstract class JmsParserUtils {
static final String JMS_TEMPLATE_ATTRIBUTE = "jms-template";
static final String JMS_TEMPLATE_PROPERTY = "jmsTemplate";
static final String CONNECTION_FACTORY_ATTRIBUTE = "connection-factory";
static final String CONNECTION_FACTORY_PROPERTY = "connectionFactory";
static final String DESTINATION_ATTRIBUTE = "destination";
static final String DESTINATION_PROPERTY = "destination";
static final String DESTINATION_NAME_ATTRIBUTE = "destination-name";
static final String DESTINATION_NAME_PROPERTY = "destinationName";
static final String DESTINATION_EXPRESSION_ATTRIBUTE = "destination-expression";
static final String DESTINATION_EXPRESSION_PROPERTY = "destinationExpression";
static final String PUB_SUB_DOMAIN_ATTRIBUTE = "pub-sub-domain";
static final String PUB_SUB_DOMAIN_PROPERTY = "pubSubDomain";
static final String HEADER_MAPPER_ATTRIBUTE = "header-mapper";
static final String HEADER_MAPPER_PROPERTY = "headerMapper";
private static final String[] JMS_TEMPLATE_ATTRIBUTES = {
"connection-factory", "message-converter", "destination-resolver", "pub-sub-domain",
"time-to-live", "priority", "delivery-persistent", "explicit-qos-enabled", "acknowledge",
"receive-timeout", "session-transacted"
};
static String determineConnectionFactoryBeanName(Element element, ParserContext parserContext) {
String connectionFactoryBeanName = "jmsConnectionFactory";
if (element.hasAttribute(CONNECTION_FACTORY_ATTRIBUTE)) {
connectionFactoryBeanName = element.getAttribute(CONNECTION_FACTORY_ATTRIBUTE);
if (!StringUtils.hasText(connectionFactoryBeanName)) {
parserContext.getReaderContext().error(
"JMS adapter 'connection-factory' attribute must not be empty", element);
}
}
return connectionFactoryBeanName;
}
static BeanDefinition parseJmsTemplateBeanDefinition(Element element, ParserContext parserContext) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(DynamicJmsTemplate.class);
builder.addPropertyReference(JmsParserUtils.CONNECTION_FACTORY_PROPERTY,
determineConnectionFactoryBeanName(element, parserContext));
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "message-converter");
IntegrationNamespaceUtils.setReferenceIfAttributeDefined(builder, element, "destination-resolver");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "pub-sub-domain");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "time-to-live");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "priority");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "delivery-persistent");
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "explicit-qos-enabled");
String receiveTimeout = element.getAttribute("receive-timeout");
if (StringUtils.hasText(receiveTimeout)) {
builder.addPropertyValue("receiveTimeout", receiveTimeout);
}
else {
builder.addPropertyValue("receiveTimeout", JmsTemplate.RECEIVE_TIMEOUT_NO_WAIT);
}
IntegrationNamespaceUtils.setValueIfAttributeDefined(builder, element, "session-transacted");
return builder.getBeanDefinition();
}
static void verifyNoJmsTemplateAttributes(Element element, ParserContext parserContext) {
for (String attributeName : JMS_TEMPLATE_ATTRIBUTES) {
if (element.hasAttribute(attributeName)) {
parserContext.getReaderContext().error("When providing a 'jms-template' reference, the '"
+ attributeName + "' attribute is not allowed", parserContext.extractSource(element));
}
}
}
}