diff --git a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/DefaultJmsHeaderMapper.java b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/DefaultJmsHeaderMapper.java index 8bcf0d1d09..52df23c090 100644 --- a/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/DefaultJmsHeaderMapper.java +++ b/org.springframework.integration.jms/src/main/java/org/springframework/integration/jms/DefaultJmsHeaderMapper.java @@ -29,7 +29,6 @@ import javax.jms.JMSException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.springframework.integration.adapter.MessageMappingException; import org.springframework.integration.core.MessageHeaders; import org.springframework.util.StringUtils; @@ -67,15 +66,30 @@ public class DefaultJmsHeaderMapper implements JmsHeaderMapper { jmsCorrelationId = ((Number) jmsCorrelationId).toString(); } if (jmsCorrelationId instanceof String) { - jmsMessage.setJMSCorrelationID((String) jmsCorrelationId); + try { + jmsMessage.setJMSCorrelationID((String) jmsCorrelationId); + } + catch (Exception e) { + logger.info("failed to set JMSCorrelationID, skipping", e); + } } Object jmsReplyTo = headers.get(JmsHeaders.REPLY_TO); if (jmsReplyTo instanceof Destination) { - jmsMessage.setJMSReplyTo((Destination) jmsReplyTo); + try { + jmsMessage.setJMSReplyTo((Destination) jmsReplyTo); + } + catch (Exception e) { + logger.info("failed to set JMSReplyTo, skipping", e); + } } Object jmsType = headers.get(JmsHeaders.TYPE); if (jmsType instanceof String) { - jmsMessage.setJMSType((String) jmsType); + try { + jmsMessage.setJMSType((String) jmsType); + } + catch (Exception e) { + logger.info("failed to set JMSType, skipping", e); + } } Set attributeNames = headers.keySet(); for (String attributeName : attributeNames) { @@ -105,7 +119,7 @@ public class DefaultJmsHeaderMapper implements JmsHeaderMapper { } catch (Exception e) { if (logger.isWarnEnabled()) { - logger.warn("error occurred while mapping properties from MessageHeaders", e); + logger.warn("error occurred while mapping from MessageHeaders to JMS properties", e); } } } @@ -113,22 +127,47 @@ public class DefaultJmsHeaderMapper implements JmsHeaderMapper { public Map toHeaders(javax.jms.Message jmsMessage) { Map headers = new HashMap(); try { - String messageId = jmsMessage.getJMSMessageID(); - if (messageId != null) { - headers.put(JmsHeaders.MESSAGE_ID, messageId); + try { + String messageId = jmsMessage.getJMSMessageID(); + if (messageId != null) { + headers.put(JmsHeaders.MESSAGE_ID, messageId); + } } - String correlationId = jmsMessage.getJMSCorrelationID(); - if (correlationId != null) { - headers.put(JmsHeaders.CORRELATION_ID, correlationId); + catch (Exception e) { + logger.info("failed to read JMSMessageID property, skipping", e); } - Destination replyTo = jmsMessage.getJMSReplyTo(); - if (replyTo != null) { - headers.put(JmsHeaders.REPLY_TO, replyTo); + try { + String correlationId = jmsMessage.getJMSCorrelationID(); + if (correlationId != null) { + headers.put(JmsHeaders.CORRELATION_ID, correlationId); + } } - headers.put(JmsHeaders.REDELIVERED, jmsMessage.getJMSRedelivered()); - String type = jmsMessage.getJMSType(); - if (type != null) { - headers.put(JmsHeaders.TYPE, type); + catch (Exception e) { + logger.info("failed to read JMSCorrelationID property, skipping", e); + } + try { + Destination replyTo = jmsMessage.getJMSReplyTo(); + if (replyTo != null) { + headers.put(JmsHeaders.REPLY_TO, replyTo); + } + } + catch (Exception e) { + logger.info("failed to read JMSReplyTo property, skipping", e); + } + try { + headers.put(JmsHeaders.REDELIVERED, jmsMessage.getJMSRedelivered()); + } + catch (Exception e) { + logger.info("failed to read JMSRedelivered property, skipping", e); + } + try { + String type = jmsMessage.getJMSType(); + if (type != null) { + headers.put(JmsHeaders.TYPE, type); + } + } + catch (Exception e) { + logger.info("failed to read JMSType property, skipping", e); } Enumeration jmsPropertyNames = jmsMessage.getPropertyNames(); if (jmsPropertyNames != null) { @@ -147,7 +186,9 @@ public class DefaultJmsHeaderMapper implements JmsHeaderMapper { } } catch (JMSException e) { - throw new MessageMappingException("failure occurred while mapping JMS properties to MessageHeaders", e); + if (logger.isWarnEnabled()) { + logger.warn("error occurred while mapping from JMS properties to MessageHeaders", e); + } } return headers; } diff --git a/org.springframework.integration.jms/src/test/java/org/springframework/integration/jms/DefaultJmsHeaderMapperTests.java b/org.springframework.integration.jms/src/test/java/org/springframework/integration/jms/DefaultJmsHeaderMapperTests.java index 04cb59300d..0e901c7c3d 100644 --- a/org.springframework.integration.jms/src/test/java/org/springframework/integration/jms/DefaultJmsHeaderMapperTests.java +++ b/org.springframework.integration.jms/src/test/java/org/springframework/integration/jms/DefaultJmsHeaderMapperTests.java @@ -252,4 +252,160 @@ public class DefaultJmsHeaderMapperTests { assertNull(bad); } + @Test + public void attemptToWriteDisallowedReplyToPropertyIsNotFatal() throws JMSException { + Message message = MessageBuilder.withPayload("test") + .setHeader(JmsHeaders.REPLY_TO, new StubDestination()) + .setHeader("foo", "bar") + .build(); + DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper(); + javax.jms.Message jmsMessage = new StubTextMessage() { + @Override + public void setJMSReplyTo(Destination replyTo) throws JMSException { + throw new JMSException("illegal property"); + } + }; + mapper.fromHeaders(message.getHeaders(), jmsMessage); + assertNull(jmsMessage.getJMSReplyTo()); + assertNotNull(jmsMessage.getStringProperty("foo")); + assertEquals("bar", jmsMessage.getStringProperty("foo")); + } + + @Test + public void attemptToWriteDisallowedTypePropertyIsNotFatal() throws JMSException { + Message message = MessageBuilder.withPayload("test") + .setHeader(JmsHeaders.TYPE, "someType") + .setHeader("foo", "bar") + .build(); + DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper(); + javax.jms.Message jmsMessage = new StubTextMessage() { + @Override + public void setJMSType(String type) throws JMSException { + throw new JMSException("illegal property"); + } + }; + mapper.fromHeaders(message.getHeaders(), jmsMessage); + assertNull(jmsMessage.getJMSType()); + assertNotNull(jmsMessage.getStringProperty("foo")); + assertEquals("bar", jmsMessage.getStringProperty("foo")); + } + + @Test + public void attemptToWriteDisallowedCorrelationIdStringPropertyIsNotFatal() throws JMSException { + Message message = MessageBuilder.withPayload("test") + .setHeader(JmsHeaders.CORRELATION_ID, "abc") + .setHeader("foo", "bar") + .build(); + DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper(); + javax.jms.Message jmsMessage = new StubTextMessage() { + @Override + public void setJMSCorrelationID(String correlationId) throws JMSException { + throw new JMSException("illegal property"); + } + }; + mapper.fromHeaders(message.getHeaders(), jmsMessage); + assertNull(jmsMessage.getJMSCorrelationID()); + assertNotNull(jmsMessage.getStringProperty("foo")); + assertEquals("bar", jmsMessage.getStringProperty("foo")); + } + + @Test + public void attemptToWriteDisallowedCorrelationIdNumberPropertyIsNotFatal() throws JMSException { + Message message = MessageBuilder.withPayload("test") + .setHeader(JmsHeaders.CORRELATION_ID, new Integer(123)) + .setHeader("foo", "bar") + .build(); + DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper(); + javax.jms.Message jmsMessage = new StubTextMessage() { + @Override + public void setJMSCorrelationID(String correlationId) throws JMSException { + throw new JMSException("illegal property"); + } + }; + mapper.fromHeaders(message.getHeaders(), jmsMessage); + assertNull(jmsMessage.getJMSCorrelationID()); + assertNotNull(jmsMessage.getStringProperty("foo")); + assertEquals("bar", jmsMessage.getStringProperty("foo")); + } + + @Test + public void attemptToReadDisallowedMessageIdPropertyIsNotFatal() throws JMSException { + DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper(); + javax.jms.Message jmsMessage = new StubTextMessage() { + @Override + public String getJMSMessageID() throws JMSException { + throw new JMSException("illegal property"); + } + }; + jmsMessage.setStringProperty("foo", "bar"); + Map headers = mapper.toHeaders(jmsMessage); + assertNull(headers.get(JmsHeaders.MESSAGE_ID)); + assertNotNull(headers.get("foo")); + assertEquals("bar", headers.get("foo")); + } + + @Test + public void attemptToReadDisallowedCorrelationIdPropertyIsNotFatal() throws JMSException { + DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper(); + javax.jms.Message jmsMessage = new StubTextMessage() { + @Override + public String getJMSCorrelationID() throws JMSException { + throw new JMSException("illegal property"); + } + }; + jmsMessage.setStringProperty("foo", "bar"); + Map headers = mapper.toHeaders(jmsMessage); + assertNull(headers.get(JmsHeaders.CORRELATION_ID)); + assertNotNull(headers.get("foo")); + assertEquals("bar", headers.get("foo")); + } + + @Test + public void attemptToReadDisallowedTypePropertyIsNotFatal() throws JMSException { + DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper(); + javax.jms.Message jmsMessage = new StubTextMessage() { + @Override + public String getJMSType() throws JMSException { + throw new JMSException("illegal property"); + } + }; + jmsMessage.setStringProperty("foo", "bar"); + Map headers = mapper.toHeaders(jmsMessage); + assertNull(headers.get(JmsHeaders.TYPE)); + assertNotNull(headers.get("foo")); + assertEquals("bar", headers.get("foo")); + } + + @Test + public void attemptToReadDisallowedReplyToPropertyIsNotFatal() throws JMSException { + DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper(); + javax.jms.Message jmsMessage = new StubTextMessage() { + @Override + public Destination getJMSReplyTo() throws JMSException { + throw new JMSException("illegal property"); + } + }; + jmsMessage.setStringProperty("foo", "bar"); + Map headers = mapper.toHeaders(jmsMessage); + assertNull(headers.get(JmsHeaders.REPLY_TO)); + assertNotNull(headers.get("foo")); + assertEquals("bar", headers.get("foo")); + } + + @Test + public void attemptToReadDisallowedRedeliveredPropertyIsNotFatal() throws JMSException { + DefaultJmsHeaderMapper mapper = new DefaultJmsHeaderMapper(); + javax.jms.Message jmsMessage = new StubTextMessage() { + @Override + public boolean getJMSRedelivered() throws JMSException { + throw new JMSException("illegal property"); + } + }; + jmsMessage.setStringProperty("foo", "bar"); + Map headers = mapper.toHeaders(jmsMessage); + assertNull(headers.get(JmsHeaders.REDELIVERED)); + assertNotNull(headers.get("foo")); + assertEquals("bar", headers.get("foo")); + } + } diff --git a/org.springframework.integration.jms/src/test/java/org/springframework/integration/jms/StubTextMessage.java b/org.springframework.integration.jms/src/test/java/org/springframework/integration/jms/StubTextMessage.java index a633e08e9c..823d9d441c 100644 --- a/org.springframework.integration.jms/src/test/java/org/springframework/integration/jms/StubTextMessage.java +++ b/org.springframework.integration.jms/src/test/java/org/springframework/integration/jms/StubTextMessage.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2010 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. @@ -23,18 +23,35 @@ import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.TextMessage; +/** + * Stub JMS Message implementation intended for testing purposes only. + * + * @author Mark Fisher + */ public class StubTextMessage implements TextMessage { - private String text; - - private Destination replyTo; - private String messageId; + private String text; + + private int deliveryMode = DEFAULT_DELIVERY_MODE; + + private Destination destination; + private String correlationId; + private Destination replyTo; + private String type; + private long timestamp = 0L; + + private long expiration = 0L; + + private int priority = DEFAULT_PRIORITY; + + private boolean redelivered; + private ConcurrentHashMap properties = new ConcurrentHashMap(); @@ -55,32 +72,40 @@ public class StubTextMessage implements TextMessage { } public void acknowledge() throws JMSException { + throw new UnsupportedOperationException(); } public void clearBody() throws JMSException { + this.text = null; } public void clearProperties() throws JMSException { + this.properties.clear(); } public boolean getBooleanProperty(String name) throws JMSException { - return false; + Object value = this.properties.get(name); + return (value instanceof Boolean) ? ((Boolean) value).booleanValue() : false; } public byte getByteProperty(String name) throws JMSException { - return 0; + Object value = this.properties.get(name); + return (value instanceof Byte) ? ((Byte) value).byteValue() : 0; } public double getDoubleProperty(String name) throws JMSException { - return 0; + Object value = this.properties.get(name); + return (value instanceof Double) ? ((Double) value).doubleValue() : 0; } public float getFloatProperty(String name) throws JMSException { - return 0; + Object value = this.properties.get(name); + return (value instanceof Float) ? ((Float) value).floatValue() : 0; } public int getIntProperty(String name) throws JMSException { - return 0; + Object value = this.properties.get(name); + return (value instanceof Integer) ? ((Integer) value).intValue() : 0; } public String getJMSCorrelationID() throws JMSException { @@ -88,19 +113,19 @@ public class StubTextMessage implements TextMessage { } public byte[] getJMSCorrelationIDAsBytes() throws JMSException { - return null; + return this.correlationId.getBytes(); } public int getJMSDeliveryMode() throws JMSException { - return 0; + return this.deliveryMode; } public Destination getJMSDestination() throws JMSException { - return null; + return this.destination; } public long getJMSExpiration() throws JMSException { - return 0; + return this.expiration; } public String getJMSMessageID() throws JMSException { @@ -108,11 +133,11 @@ public class StubTextMessage implements TextMessage { } public int getJMSPriority() throws JMSException { - return 0; + return this.priority; } public boolean getJMSRedelivered() throws JMSException { - return false; + return this.redelivered; } public Destination getJMSReplyTo() throws JMSException { @@ -120,7 +145,7 @@ public class StubTextMessage implements TextMessage { } public long getJMSTimestamp() throws JMSException { - return 0; + return this.timestamp; } public String getJMSType() throws JMSException { @@ -128,7 +153,8 @@ public class StubTextMessage implements TextMessage { } public long getLongProperty(String name) throws JMSException { - return 0; + Object value = this.properties.get(name); + return (value instanceof Long) ? ((Long) value).longValue() : 0; } public Object getObjectProperty(String name) throws JMSException { @@ -140,11 +166,13 @@ public class StubTextMessage implements TextMessage { } public short getShortProperty(String name) throws JMSException { - return 0; + Object value = this.properties.get(name); + return (value instanceof Short) ? ((Short) value).shortValue() : 0; } public String getStringProperty(String name) throws JMSException { - return null; + Object value = this.properties.get(name); + return (value instanceof String) ? (String) value : null; } public boolean propertyExists(String name) throws JMSException { @@ -176,15 +204,19 @@ public class StubTextMessage implements TextMessage { } public void setJMSCorrelationIDAsBytes(byte[] correlationID) throws JMSException { + this.correlationId = new String(correlationID); } public void setJMSDeliveryMode(int deliveryMode) throws JMSException { + this.deliveryMode = deliveryMode; } public void setJMSDestination(Destination destination) throws JMSException { + this.destination = destination; } public void setJMSExpiration(long expiration) throws JMSException { + this.expiration = expiration; } public void setJMSMessageID(String id) throws JMSException { @@ -192,9 +224,11 @@ public class StubTextMessage implements TextMessage { } public void setJMSPriority(int priority) throws JMSException { + this.priority = priority; } public void setJMSRedelivered(boolean redelivered) throws JMSException { + this.redelivered = redelivered; } public void setJMSReplyTo(Destination replyTo) throws JMSException { @@ -202,6 +236,7 @@ public class StubTextMessage implements TextMessage { } public void setJMSTimestamp(long timestamp) throws JMSException { + this.timestamp = timestamp; } public void setJMSType(String type) throws JMSException {