From dbbcde22cd55d2d2066e0442a26b4366784c0842 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Fri, 12 Nov 2010 13:01:41 -0500 Subject: [PATCH] INT-1569 added inboundPrefix and outboundPrefix to DefaultJmsHeaderMapper. For now, the defaults are blank. --- .../jms/DefaultJmsHeaderMapper.java | 90 ++++++++++++++----- .../jms/DefaultJmsHeaderMapperTests.java | 28 ++++++ 2 files changed, 98 insertions(+), 20 deletions(-) diff --git a/spring-integration-jms/src/main/java/org/springframework/integration/jms/DefaultJmsHeaderMapper.java b/spring-integration-jms/src/main/java/org/springframework/integration/jms/DefaultJmsHeaderMapper.java index 0827000087..a70c64e5ec 100644 --- a/spring-integration-jms/src/main/java/org/springframework/integration/jms/DefaultJmsHeaderMapper.java +++ b/spring-integration-jms/src/main/java/org/springframework/integration/jms/DefaultJmsHeaderMapper.java @@ -58,6 +58,36 @@ public class DefaultJmsHeaderMapper implements JmsHeaderMapper { private final Log logger = LogFactory.getLog(this.getClass()); + private volatile String inboundPrefix = ""; + + private volatile String outboundPrefix = ""; + + + /** + * Specify a prefix to be appended to the integration message header name + * for any JMS property that is being mapped into the MessageHeaders. + * The Default is an empty string (no prefix). + *

+ * This does not affect the JMS properties covered by the specification/API, + * such as JMSCorrelationID, etc. The header names used for mapping such + * properties are all defined in our {@link JmsHeaders}. + */ + public void setInboundPrefix(String inboundPrefix) { + this.inboundPrefix = (inboundPrefix != null) ? inboundPrefix : ""; + } + + /** + * Specify a prefix to be appended to the JMS property name for any + * integration message header that is being mapped into the JMS Message. + * The Default is an empty string (no prefix). + *

+ * This does not affect the JMS properties covered by the specification/API, + * such as JMSCorrelationID, etc. The header names used for mapping such + * properties are all defined in our {@link JmsHeaders}. + */ + public void setOutboundPrefix(String outboundPrefix) { + this.outboundPrefix = (outboundPrefix != null) ? outboundPrefix : ""; + } public void fromHeaders(MessageHeaders headers, javax.jms.Message jmsMessage) { try { @@ -91,26 +121,23 @@ public class DefaultJmsHeaderMapper implements JmsHeaderMapper { logger.info("failed to set JMSType, skipping", e); } } - Set attributeNames = headers.keySet(); - for (String attributeName : attributeNames) { - if (!attributeName.startsWith(JmsHeaders.PREFIX)) { - if (StringUtils.hasText(attributeName)) { - Object value = headers.get(attributeName); - if (value != null && SUPPORTED_PROPERTY_TYPES.contains(value.getClass())) { - try { - jmsMessage.setObjectProperty(attributeName, value); + Set headerNames = headers.keySet(); + for (String headerName : headerNames) { + if (StringUtils.hasText(headerName) && !headerName.startsWith(JmsHeaders.PREFIX)) { + Object value = headers.get(headerName); + if (value != null && SUPPORTED_PROPERTY_TYPES.contains(value.getClass())) { + try { + String propertyName = this.fromHeaderName(headerName); + jmsMessage.setObjectProperty(propertyName, value); + } + catch (Exception e) { + if (headerName.startsWith("JMSX")) { + if (logger.isTraceEnabled()) { + logger.trace("skipping reserved header, it cannot be set by client: " + headerName); + } } - catch (Exception e) { - if (attributeName.startsWith("JMSX")) { - if (logger.isTraceEnabled()) { - logger.trace("skipping reserved header, it cannot be set by client: " - + attributeName); - } - } - else if (logger.isWarnEnabled()) { - logger.warn("failed to map Message header '" - + attributeName + "' to JMS property", e); - } + else if (logger.isWarnEnabled()) { + logger.warn("failed to map Message header '" + headerName + "' to JMS property", e); } } } @@ -174,7 +201,8 @@ public class DefaultJmsHeaderMapper implements JmsHeaderMapper { while (jmsPropertyNames.hasMoreElements()) { String propertyName = jmsPropertyNames.nextElement().toString(); try { - headers.put(propertyName, jmsMessage.getObjectProperty(propertyName)); + String headerName = this.toHeaderName(propertyName); + headers.put(headerName, jmsMessage.getObjectProperty(propertyName)); } catch (Exception e) { if (logger.isWarnEnabled()) { @@ -193,4 +221,26 @@ public class DefaultJmsHeaderMapper implements JmsHeaderMapper { return headers; } + /** + * Adds the outbound prefix if necessary. + */ + private String fromHeaderName(String headerName) { + String propertyName = headerName; + if (StringUtils.hasText(this.outboundPrefix) && !propertyName.startsWith(this.outboundPrefix)) { + propertyName = this.outboundPrefix + headerName; + } + return propertyName; + } + + /** + * Adds the inbound prefix if necessary. + */ + private String toHeaderName(String propertyName) { + String headerName = propertyName; + if (StringUtils.hasText(this.inboundPrefix) && !headerName.startsWith(this.inboundPrefix)) { + headerName = this.inboundPrefix + propertyName; + } + return headerName; + } + } diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/DefaultJmsHeaderMapperTests.java b/spring-integration-jms/src/test/java/org/springframework/integration/jms/DefaultJmsHeaderMapperTests.java index 38ef34420e..b86c114fb1 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/DefaultJmsHeaderMapperTests.java +++ b/spring-integration-jms/src/test/java/org/springframework/integration/jms/DefaultJmsHeaderMapperTests.java @@ -129,6 +129,21 @@ public class DefaultJmsHeaderMapperTests { assertEquals(123, ((Integer) value).intValue()); } + @Test + public void testUserDefinedPropertyMappedFromHeaderWithCustomPrefix() throws JMSException { + Message message = MessageBuilder.withPayload("test") + .setHeader("foo", new Integer(123)) + .build(); + DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper(); + mapper.setOutboundPrefix("custom_"); + javax.jms.Message jmsMessage = new StubTextMessage(); + mapper.fromHeaders(message.getHeaders(), jmsMessage); + Object value = jmsMessage.getObjectProperty("custom_foo"); + assertNotNull(value); + assertEquals(Integer.class, value.getClass()); + assertEquals(123, ((Integer) value).intValue()); + } + @Test public void testUserDefinedPropertyWithUnsupportedType() throws JMSException { Destination destination = new Destination() {}; @@ -202,6 +217,19 @@ public class DefaultJmsHeaderMapperTests { assertEquals(123, ((Integer) attrib).intValue()); } + @Test + public void testUserDefinedPropertyMappedToHeaderWithCustomPrefix() throws JMSException { + javax.jms.Message jmsMessage = new StubTextMessage(); + jmsMessage.setIntProperty("foo", 123); + DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper(); + mapper.setInboundPrefix("custom_"); + Map headers = mapper.toHeaders(jmsMessage); + Object header = headers.get("custom_foo"); + assertNotNull(header); + assertEquals(Integer.class, header.getClass()); + assertEquals(123, ((Integer) header).intValue()); + } + @Test public void testPropertyMappingExceptionIsNotFatal() throws JMSException { Message message = MessageBuilder.withPayload("test")