Skip to content

Commit 124a334

Browse files
author
bwynn
committed
1 parent ec0677b commit 124a334

File tree

3 files changed

+102
-64
lines changed

3 files changed

+102
-64
lines changed

src/main/java/com/amazon/sqs/javamessaging/SQSMessagingClientConstants.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@ public class SQSMessagingClientConstants {
3030

3131
public static final int MIN_PREFETCH = 0;
3232

33+
/**
34+
* SQS Message Attribute data types which we had better support.
35+
* https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-attributes.html
36+
*/
37+
public static final String NUMBER = "Number";
38+
39+
public static final String BINARY = "Binary";
40+
3341
/**
3442
* JMSMessage available user property types, which are mapped to message
3543
* attribute data types

src/main/java/com/amazon/sqs/javamessaging/message/SQSMessage.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package com.amazon.sqs.javamessaging.message;
1616

1717
import java.io.UnsupportedEncodingException;
18+
import java.nio.ByteBuffer;
1819
import java.nio.charset.Charset;
1920
import java.util.Date;
2021
import java.util.Enumeration;
@@ -159,8 +160,12 @@ private void mapSystemAttributeToJmsMessageProperty(Map<String,String> systemAtt
159160

160161
private void addMessageAttributes(com.amazonaws.services.sqs.model.Message sqsMessage) throws JMSException {
161162
for (Entry<String, MessageAttributeValue> entry : sqsMessage.getMessageAttributes().entrySet()) {
162-
properties.put(entry.getKey(), new JMSMessagePropertyValue(
163-
entry.getValue().getStringValue(), entry.getValue().getDataType()));
163+
MessageAttributeValue value = entry.getValue();
164+
if (BINARY.equals(value.getDataType())) {
165+
properties.put(entry.getKey(), new JMSMessagePropertyValue(value.getBinaryValue(), value.getDataType()));
166+
} else {
167+
properties.put(entry.getKey(), new JMSMessagePropertyValue(value.getStringValue(), value.getDataType()));
168+
}
164169
}
165170
}
166171

@@ -1210,6 +1215,9 @@ private static Object getObjectValue(String value, String type) throws JMSExcept
12101215
return Float.valueOf(value);
12111216
} else if (SHORT.equals(type)) {
12121217
return Short.valueOf(value);
1218+
} else if (NUMBER.equals(type)) {
1219+
// This may not be a JMS Type but it is a SQS Type, so we had better support it.
1220+
return Double.valueOf(value);
12131221
} else {
12141222
throw new JMSException(type + " is not a supported JMS property type");
12151223
}

src/test/java/com/amazon/sqs/javamessaging/message/SQSMessageTest.java

Lines changed: 84 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -28,22 +28,25 @@
2828
import com.amazon.sqs.javamessaging.acknowledge.Acknowledger;
2929
import com.amazon.sqs.javamessaging.message.SQSMessage;
3030
import com.amazonaws.services.sqs.model.MessageAttributeValue;
31+
32+
import org.junit.Assert;
3133
import org.junit.Before;
3234
import org.junit.Test;
3335

3436
import javax.jms.Message;
3537
import javax.jms.MessageFormatException;
3638
import javax.jms.MessageNotWriteableException;
3739

38-
import junit.framework.Assert;
39-
40+
import java.nio.ByteBuffer;
4041
import java.util.*;
4142

4243
/**
4344
* Test the SQSMessageTest class
4445
*/
4546
public class SQSMessageTest {
4647
private SQSSession mockSQSSession;
48+
final String myNumber = "myNumber";
49+
final String myBinary = "myBinary";
4750
final String myTrueBoolean = "myTrueBoolean";
4851
final String myFalseBoolean = "myFalseBoolean";
4952
final String myInteger = "myInteger";
@@ -67,65 +70,66 @@ public void testProperty() throws JMSException {
6770
when(mockSQSSession.createMessage()).thenReturn(new SQSMessage());
6871
Message message = mockSQSSession.createMessage();
6972

70-
message.setBooleanProperty("myTrueBoolean", true);
71-
message.setBooleanProperty("myFalseBoolean", false);
72-
message.setIntProperty("myInteger", 100);
73-
message.setDoubleProperty("myDouble", 2.1768);
74-
message.setFloatProperty("myFloat", 3.1457f);
75-
message.setLongProperty("myLong", 1290772974281L);
76-
message.setShortProperty("myShort", (short) 123);
77-
message.setByteProperty("myByteProperty", (byte) 'a');
78-
message.setStringProperty("myString", "StringValue");
79-
80-
Assert.assertTrue(message.propertyExists("myTrueBoolean"));
81-
Assert.assertEquals(message.getObjectProperty("myTrueBoolean"), true);
82-
Assert.assertEquals(message.getBooleanProperty("myTrueBoolean"), true);
73+
message.setBooleanProperty(myTrueBoolean, true);
74+
message.setBooleanProperty(myFalseBoolean, false);
75+
message.setIntProperty(myInteger, 100);
76+
message.setDoubleProperty(myDouble, 2.1768);
77+
message.setFloatProperty(myFloat, 3.1457f);
78+
message.setLongProperty(myLong, 1290772974281L);
79+
message.setShortProperty(myShort, (short) 123);
80+
message.setByteProperty(myByte, (byte) 'a');
81+
message.setStringProperty(myString, "StringValue");
82+
83+
Assert.assertTrue(message.propertyExists(myTrueBoolean));
84+
Assert.assertEquals(message.getObjectProperty(myTrueBoolean), true);
85+
Assert.assertEquals(message.getBooleanProperty(myTrueBoolean), true);
8386

84-
Assert.assertTrue(message.propertyExists("myFalseBoolean"));
85-
Assert.assertEquals(message.getObjectProperty("myFalseBoolean"), false);
86-
Assert.assertEquals(message.getBooleanProperty("myFalseBoolean"), false);
87+
Assert.assertTrue(message.propertyExists(myFalseBoolean));
88+
Assert.assertEquals(message.getObjectProperty(myFalseBoolean), false);
89+
Assert.assertEquals(message.getBooleanProperty(myFalseBoolean), false);
8790

88-
Assert.assertTrue(message.propertyExists("myInteger"));
89-
Assert.assertEquals(message.getObjectProperty("myInteger"), 100);
90-
Assert.assertEquals(message.getIntProperty("myInteger"), 100);
91+
Assert.assertTrue(message.propertyExists(myInteger));
92+
Assert.assertEquals(message.getObjectProperty(myInteger), 100);
93+
Assert.assertEquals(message.getIntProperty(myInteger), 100);
9194

92-
Assert.assertTrue(message.propertyExists("myDouble"));
93-
Assert.assertEquals(message.getObjectProperty("myDouble"), 2.1768);
94-
Assert.assertEquals(message.getDoubleProperty("myDouble"), 2.1768);
95+
Assert.assertTrue(message.propertyExists(myDouble));
96+
Assert.assertEquals((double)message.getObjectProperty(myDouble), 2.1768, 0);
97+
Assert.assertEquals(message.getDoubleProperty(myDouble), 2.1768, 0);
9598

96-
Assert.assertTrue(message.propertyExists("myFloat"));
97-
Assert.assertEquals(message.getObjectProperty("myFloat"), 3.1457f);
98-
Assert.assertEquals(message.getFloatProperty("myFloat"), 3.1457f);
99+
Assert.assertTrue(message.propertyExists(myFloat));
100+
Assert.assertEquals((float)message.getObjectProperty(myFloat), 3.1457f, 0);
101+
Assert.assertEquals(message.getFloatProperty(myFloat), 3.1457f, 0);
99102

100-
Assert.assertTrue(message.propertyExists("myLong"));
101-
Assert.assertEquals(message.getObjectProperty("myLong"), 1290772974281L);
102-
Assert.assertEquals(message.getLongProperty("myLong"), 1290772974281L);
103+
Assert.assertTrue(message.propertyExists(myLong));
104+
Assert.assertEquals(message.getObjectProperty(myLong), 1290772974281L);
105+
Assert.assertEquals(message.getLongProperty(myLong), 1290772974281L);
103106

104-
Assert.assertTrue(message.propertyExists("myShort"));
105-
Assert.assertEquals(message.getObjectProperty("myShort"), (short) 123);
106-
Assert.assertEquals(message.getShortProperty("myShort"), (short) 123);
107+
Assert.assertTrue(message.propertyExists(myShort));
108+
Assert.assertEquals(message.getObjectProperty(myShort), (short) 123);
109+
Assert.assertEquals(message.getShortProperty(myShort), (short) 123);
107110

108-
Assert.assertTrue(message.propertyExists("myByteProperty"));
109-
Assert.assertEquals(message.getObjectProperty("myByteProperty"), (byte) 'a');
110-
Assert.assertEquals(message.getByteProperty("myByteProperty"), (byte) 'a');
111+
Assert.assertTrue(message.propertyExists(myByte));
112+
Assert.assertEquals(message.getObjectProperty(myByte), (byte) 'a');
113+
Assert.assertEquals(message.getByteProperty(myByte), (byte) 'a');
111114

112-
Assert.assertTrue(message.propertyExists("myString"));
113-
Assert.assertEquals(message.getObjectProperty("myString"), "StringValue");
114-
Assert.assertEquals(message.getStringProperty("myString"), "StringValue");
115+
Assert.assertTrue(message.propertyExists(myString));
116+
Assert.assertEquals(message.getObjectProperty(myString), "StringValue");
117+
Assert.assertEquals(message.getStringProperty(myString), "StringValue");
115118

116119
// Validate property names
117120
Set<String> propertyNamesSet = new HashSet<String>(Arrays.asList(
118-
"myTrueBoolean",
119-
"myFalseBoolean",
120-
"myInteger",
121-
"myDouble",
122-
"myFloat",
123-
"myLong",
124-
"myShort",
125-
"myByteProperty",
126-
"myString"));
121+
myTrueBoolean,
122+
myFalseBoolean,
123+
myInteger,
124+
myDouble,
125+
myFloat,
126+
myLong,
127+
myShort,
128+
myByte,
129+
myString));
127130

128-
Enumeration<String > propertyNames = message.getPropertyNames();
131+
@SuppressWarnings("unchecked")
132+
Enumeration<String> propertyNames = message.getPropertyNames();
129133
int counter = 0;
130134
while (propertyNames.hasMoreElements()) {
131135
assertTrue(propertyNamesSet.contains(propertyNames.nextElement()));
@@ -134,14 +138,9 @@ public void testProperty() throws JMSException {
134138
assertEquals(propertyNamesSet.size(), counter);
135139

136140
message.clearProperties();
137-
Assert.assertFalse(message.propertyExists("myTrueBoolean"));
138-
Assert.assertFalse(message.propertyExists("myInteger"));
139-
Assert.assertFalse(message.propertyExists("myDouble"));
140-
Assert.assertFalse(message.propertyExists("myFloat"));
141-
Assert.assertFalse(message.propertyExists("myLong"));
142-
Assert.assertFalse(message.propertyExists("myShort"));
143-
Assert.assertFalse(message.propertyExists("myByteProperty"));
144-
Assert.assertFalse(message.propertyExists("myString"));
141+
for (String propName: propertyNamesSet) {
142+
Assert.assertFalse(message.propertyExists(propName));
143+
}
145144

146145
propertyNames = message.getPropertyNames();
147146
assertFalse(propertyNames.hasMoreElements());
@@ -272,11 +271,22 @@ public void testSQSMessageAttributeToProperty() throws JMSException {
272271

273272
Acknowledger ack = mock(Acknowledger.class);
274273

274+
final ByteBuffer binaryValue = ByteBuffer.wrap(new byte[] {(byte)0xDE, (byte)0xAD, (byte)0xBE, (byte)0xEF});
275+
275276
Map<String,String> systemAttributes = new HashMap<String, String>();
276277
systemAttributes.put(APPROXIMATE_RECEIVE_COUNT, "100");
277278

278279
Map<String, MessageAttributeValue> messageAttributes = new HashMap<String, MessageAttributeValue>();
279280

281+
/* SQS Supports Logical Data Types: String, Number, and Binary so we'd best know what to do with those at the very minimum! */
282+
messageAttributes.put(myNumber, new MessageAttributeValue()
283+
.withDataType(SQSMessagingClientConstants.NUMBER)
284+
.withStringValue("4"));
285+
messageAttributes.put(myBinary, new MessageAttributeValue()
286+
.withDataType(SQSMessagingClientConstants.BINARY)
287+
.withBinaryValue(binaryValue));
288+
289+
280290
messageAttributes.put(myTrueBoolean, new MessageAttributeValue()
281291
.withDataType(SQSMessagingClientConstants.BOOLEAN)
282292
.withStringValue("1"));
@@ -312,6 +322,7 @@ public void testSQSMessageAttributeToProperty() throws JMSException {
312322
messageAttributes.put(myString, new MessageAttributeValue()
313323
.withDataType(SQSMessagingClientConstants.STRING)
314324
.withStringValue("StringValue"));
325+
315326

316327
com.amazonaws.services.sqs.model.Message sqsMessage = new com.amazonaws.services.sqs.model.Message()
317328
.withMessageAttributes(messageAttributes)
@@ -321,6 +332,14 @@ public void testSQSMessageAttributeToProperty() throws JMSException {
321332

322333
SQSMessage message = new SQSMessage(ack, "QueueUrl", sqsMessage);
323334

335+
// SQS "Number" data type must use StringValue, may be a floating point number
336+
Assert.assertTrue(message.propertyExists(myNumber));
337+
Assert.assertEquals(4.0, (double)message.getObjectProperty(myNumber), 0);
338+
Assert.assertEquals(4.0, message.getDoubleProperty(myNumber), 0);
339+
340+
Assert.assertTrue(message.propertyExists(myBinary));
341+
Assert.assertEquals(binaryValue, message.getObjectProperty(myBinary));
342+
324343
Assert.assertTrue(message.propertyExists(myTrueBoolean));
325344
Assert.assertEquals(message.getObjectProperty(myTrueBoolean), true);
326345
Assert.assertEquals(message.getBooleanProperty(myTrueBoolean), true);
@@ -334,12 +353,12 @@ public void testSQSMessageAttributeToProperty() throws JMSException {
334353
Assert.assertEquals(message.getIntProperty(myInteger), 100);
335354

336355
Assert.assertTrue(message.propertyExists(myDouble));
337-
Assert.assertEquals(message.getObjectProperty(myDouble), 2.1768);
338-
Assert.assertEquals(message.getDoubleProperty(myDouble), 2.1768);
356+
Assert.assertEquals((double)message.getObjectProperty(myDouble), 2.1768, 0);
357+
Assert.assertEquals(message.getDoubleProperty(myDouble), 2.1768, 0);
339358

340359
Assert.assertTrue(message.propertyExists(myFloat));
341-
Assert.assertEquals(message.getObjectProperty(myFloat), 3.1457f);
342-
Assert.assertEquals(message.getFloatProperty(myFloat), 3.1457f);
360+
Assert.assertEquals((float)message.getObjectProperty(myFloat), 3.1457f, 0);
361+
Assert.assertEquals(message.getFloatProperty(myFloat), 3.1457f, 0);
343362

344363
Assert.assertTrue(message.propertyExists(myLong));
345364
Assert.assertEquals(message.getObjectProperty(myLong), 1290772974281L);
@@ -360,6 +379,8 @@ public void testSQSMessageAttributeToProperty() throws JMSException {
360379

361380
// Validate property names
362381
Set<String> propertyNamesSet = new HashSet<String>(Arrays.asList(
382+
myBinary,
383+
myNumber,
363384
myTrueBoolean,
364385
myFalseBoolean,
365386
myInteger,
@@ -374,7 +395,8 @@ public void testSQSMessageAttributeToProperty() throws JMSException {
374395
Enumeration<String > propertyNames = message.getPropertyNames();
375396
int counter = 0;
376397
while (propertyNames.hasMoreElements()) {
377-
assertTrue(propertyNamesSet.contains(propertyNames.nextElement()));
398+
String propName = propertyNames.nextElement();
399+
Assert.assertTrue("Found Unknown Property: " + propName, propertyNamesSet.contains(propName));
378400
counter++;
379401
}
380402
assertEquals(propertyNamesSet.size(), counter);

0 commit comments

Comments
 (0)