From 4b3654ef78786560fa976553897be745a8301382 Mon Sep 17 00:00:00 2001 From: Mark Fisher Date: Mon, 19 Jul 2010 17:20:23 +0000 Subject: [PATCH] INT-1241 attempts to write disallowed JMSCorrelationID, JMSReplyTo, or JMSType no longer cause the rest of the headers to be skipped --- .../jms/DefaultJmsHeaderMapper.java | 21 ++++- .../jms/DefaultJmsHeaderMapperTests.java | 76 +++++++++++++++++++ .../integration/jms/StubTextMessage.java | 75 +++++++++++++----- 3 files changed, 149 insertions(+), 23 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 0bb40bd472..120ff9e9f2 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 @@ -67,15 +67,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) { 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 0b82f60b06..40eb19a406 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 @@ -254,4 +254,80 @@ 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 IllegalArgumentException("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 IllegalArgumentException("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 IllegalArgumentException("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 IllegalArgumentException("illegal property"); + } + }; + mapper.fromHeaders(message.getHeaders(), jmsMessage); + assertNull(jmsMessage.getJMSCorrelationID()); + assertNotNull(jmsMessage.getStringProperty("foo")); + assertEquals("bar", jmsMessage.getStringProperty("foo")); + } + } diff --git a/spring-integration-jms/src/test/java/org/springframework/integration/jms/StubTextMessage.java b/spring-integration-jms/src/test/java/org/springframework/integration/jms/StubTextMessage.java index a633e08e9c..823d9d441c 100644 --- a/spring-integration-jms/src/test/java/org/springframework/integration/jms/StubTextMessage.java +++ b/spring-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 {