From 002335f077ba85596363beaeae220662dceb0855 Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Tue, 1 Sep 2020 18:20:12 -0700 Subject: [PATCH 01/27] Continue Implementation --- .../azure/core/amqp/models/AmqpBodyType.java | 54 +++++++++++++++++++ .../azure/core/amqp/models/AmqpDataBody.java | 19 +++++++ .../core/amqp/models/AmqpMessageBody.java | 11 ++++ .../azure/core/amqp/models/BinaryData.java | 10 ++++ .../azure/core/amqp/models/package-info.java | 7 +++ .../src/main/java/module-info.java | 1 + 6 files changed, 102 insertions(+) create mode 100644 sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpBodyType.java create mode 100644 sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java create mode 100644 sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageBody.java create mode 100644 sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java create mode 100644 sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/package-info.java diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpBodyType.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpBodyType.java new file mode 100644 index 000000000000..8046f30c3354 --- /dev/null +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpBodyType.java @@ -0,0 +1,54 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.core.amqp.models; + +import java.util.Locale; + +/** + * All AmqpBodyType available for AMQP Message. + */ +public enum AmqpBodyType { + /** + * Represent Amqp Data type + */ + DATA("Data"), + /** + * Represent Amqp Value type + */ + VALUE("Value"), + /** + * Represent Amqp Sequence type + */ + SEQUENCE("Sequence"); + + private final String value; + + AmqpBodyType(final String value) { + this.value = value; + } + + /** + * {@inheritDoc} + */ + @Override + public String toString() { + return this.value; + } + /** + * Creates an AmqpBodyType from its display value. + * + * @param value The string value of the AmqpBodyType. + * @return The AmqpBodyType represented by the value. + * @throws IllegalArgumentException If a AmqpBodyType cannot be parsed from the string value. + */ + public static AmqpBodyType fromString(final String value) { + for (AmqpBodyType bodyType : values()) { + if (bodyType.value.equalsIgnoreCase(value)) { + return bodyType; + } + } + + throw new IllegalArgumentException(String.format(Locale.US, "Could not convert %s to a AmqpBodyType", value)); + } +} diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java new file mode 100644 index 000000000000..40cb905e661d --- /dev/null +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.core.amqp.models; + +import com.azure.core.util.IterableStream; + +public class AmqpDataBody implements AmqpMessageBody { + public AmqpDataBody(Iterable data) { + + } + + @Override public AmqpBodyType getBodyType() { + + } + public IterableStream getData() { + + } +} diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageBody.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageBody.java new file mode 100644 index 000000000000..3124c081fcdb --- /dev/null +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageBody.java @@ -0,0 +1,11 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.core.amqp.models; + +/** + * Interface representing Amqp Message Body. + */ +public interface AmqpMessageBody { + AmqpBodyType getBodyType(); +} diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java new file mode 100644 index 000000000000..7577f4075fb2 --- /dev/null +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java @@ -0,0 +1,10 @@ +package com.azure.core.amqp.models; + +public class BinaryData { + public BinaryData(byte[] data) { + + } + public byte[] getData() { + + } +} diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/package-info.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/package-info.java new file mode 100644 index 000000000000..49c5ed1490ff --- /dev/null +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/package-info.java @@ -0,0 +1,7 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +/** + * Package containing classes related to AMQP models classes. + */ +package com.azure.core.amqp.models; diff --git a/sdk/core/azure-core-amqp/src/main/java/module-info.java b/sdk/core/azure-core-amqp/src/main/java/module-info.java index 77497a6a08af..3edfcafb0211 100644 --- a/sdk/core/azure-core-amqp/src/main/java/module-info.java +++ b/sdk/core/azure-core-amqp/src/main/java/module-info.java @@ -9,6 +9,7 @@ requires transitive org.apache.qpid.proton.j; exports com.azure.core.amqp; + exports com.azure.core.amqp.models; exports com.azure.core.amqp.exception; // FIXME this should not be a long-term solution From 672b166f45c39c03c726d8d5ba807f175b874b2f Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Wed, 2 Sep 2020 09:14:29 -0700 Subject: [PATCH 02/27] Continue implementation --- .../amqp/models/AmqpAnnotatedMessage.java | 60 +++++++++ .../azure/core/amqp/models/AmqpDataBody.java | 17 ++- .../core/amqp/models/AmqpMessageHeader.java | 122 +++++++++++++++++ .../amqp/models/AmqpMessageProperties.java | 125 ++++++++++++++++++ .../azure/core/amqp/models/BinaryData.java | 21 ++- 5 files changed, 339 insertions(+), 6 deletions(-) create mode 100644 sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java create mode 100644 sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java create mode 100644 sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java new file mode 100644 index 000000000000..fef064fc2a80 --- /dev/null +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java @@ -0,0 +1,60 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.core.amqp.models; + +import java.util.Map; + +/** + * + */ +public class AmqpAnnotatedMessage { + private AmqpMessageBody body; + private Map applicationProperties; + private Map deliveryAnnotations; + private Map MessageAnnotations; + private Map footer; + private AmqpMessageHeader header; + private AmqpMessageProperties messageProperties; + + public AmqpAnnotatedMessage(AmqpMessageBody body) { + this.body = body; + } + + public AmqpAnnotatedMessage(AmqpAnnotatedMessage message) { + + } + + /** + * Gets the {@link Map} of application properties. + * @return The application properties. + */ + public Map getApplicationProperties() { + return applicationProperties; + } + + public AmqpMessageBody getBody() { + return this.body; + } + + public Map getDeliveryAnnotations() { + return this.deliveryAnnotations; + } + + public Map getFooter() { + return this.footer; + } + + public AmqpMessageHeader getHeader() { + return this.header; + } + + public Map getMessageAnnotations() { + return this.MessageAnnotations; + } + + public AmqpMessageProperties getProperties() { + return messageProperties; + } + +} diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java index 40cb905e661d..b03ffed2044e 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java @@ -5,15 +5,24 @@ import com.azure.core.util.IterableStream; +/** + * + */ public class AmqpDataBody implements AmqpMessageBody { - public AmqpDataBody(Iterable data) { + private AmqpBodyType bodyType; + private final Iterable data; + private final IterableStream dataStream; + public AmqpDataBody(Iterable data) { + this.data = data; + this.dataStream = new IterableStream<>(data); } - @Override public AmqpBodyType getBodyType() { - + @Override + public AmqpBodyType getBodyType() { + return bodyType; } public IterableStream getData() { - + return dataStream; } } diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java new file mode 100644 index 000000000000..3ad880ebd06a --- /dev/null +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java @@ -0,0 +1,122 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.core.amqp.models; + +import com.azure.core.annotation.Fluent; + +import java.time.Duration; + +/** + * Represents Header from Amqp message. + */ +@Fluent +public class AmqpMessageHeader { + + private Integer deliveryCount; + private Boolean durable; + private Boolean firstAcquirer; + private Byte priority; + private Duration timeToLive; + + AmqpMessageHeader() { + // This class does not have any public constructors, and is not able to be instantiated using 'new'. + } + + /** + * Gets delivery count. + * + * @return delivery count. + */ + public Integer getDeliveryCount() { + return deliveryCount; + } + + /** + * Sets delivery count. + * + * @param deliveryCount to be set. + * @return updated {@link AmqpMessageHeader}. + */ + public AmqpMessageHeader setDeliveryCount(Integer deliveryCount) { + this.deliveryCount = deliveryCount; + return this; + } + + /** + * Gets durable boolean flag. + * + * @return The durable. + */ + public Boolean getDurable() { + return this.durable; + } + + /** + * Sets the durable boolean flag. + * + * @param durable to set on {@link AmqpMessageHeader}. + * @return updated {@link AmqpMessageHeader}. + */ + public AmqpMessageHeader setDurable(Boolean durable) { + this.durable = durable; + return this; + } + + /** + * Gets boolean flag for {@code firstAcquirer} + * + * @return The {@code firstAcquirer}. + */ + public Boolean getFirstAcquirer() { + return this.firstAcquirer; + } + + /** + * Sets the {@code firstAcquirer} boolean flag. + * + * @param firstAcquirer to set on {@link AmqpMessageHeader}. + * @return updated {@link AmqpMessageHeader}. + */ + public AmqpMessageHeader setFirstAcquirer(Boolean firstAcquirer) { + this.firstAcquirer = firstAcquirer; + return this; + } + + /** + * Gets the priority on {@code amqpMessage}. + * @return the priority. + */ + public Byte getPriority(){ + return this.priority; + } + + /** + * Sets the priority. + * + * @param priority to set on {@link AmqpMessageHeader}. + * @return updated {@link AmqpMessageHeader}. + */ + public AmqpMessageHeader setPriority(Byte priority) { + this.priority = priority; + return this; + } + + /** + * Gets {@code timeToLive}. + * @return {@code timeToLive}. + */ + public Duration getTimeToLive() { + return this.timeToLive; + } + + /** + * + * @param timeToLive to set on {@link AmqpMessageHeader}. + * @return updated {@link AmqpMessageHeader}. + */ + public AmqpMessageHeader setTimeToLive(Duration timeToLive) { + this.timeToLive = timeToLive; + return this; + } +} diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java new file mode 100644 index 000000000000..9e0fcbfc816e --- /dev/null +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java @@ -0,0 +1,125 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.core.amqp.models; + +import java.time.OffsetDateTime; + +/** + * Represents properties from Amqp message. + */ +public class AmqpMessageProperties { + + private OffsetDateTime absoluteExpiryTime; + + /** + * + * @return + */ + public OffsetDateTime getAbsoluteExpiryTime() { + return this.absoluteExpiryTime; + } + + public AmqpMessageProperties setAbsoluteExpiryTime(OffsetDateTime absoluteExpiryTime) { + this.absoluteExpiryTime = absoluteExpiryTime; + return this; + } + + public String getContentEncoding() { + + } + + public AmqpMessageProperties setContentEncoding(String contentEncoding) { + + } + + public String getContentType() { + + } + + public AmqpMessageProperties setContentType(String contentType) { + + } + + public String getCorrelationId() { + + } + + public AmqpMessageProperties setCorrelationId(String correlationId) { + + } + + public OffsetDateTime getCreationTime() { + + } + + public AmqpMessageProperties setCreationTime(OffsetDateTime creationTime) { + + } + + public String getGroupId() { + + } + + public AmqpMessageProperties setGroupId(String groupId) { + + } + + public String getGroupSequence() { + + } + + public AmqpMessageProperties setGroupSequence(String groupSequence) { + + } + + public String getMessageId() { + + } + + public AmqpMessageProperties setMessageId(String messageId) { + + } + + public String getReplyTo() { + + } + + public AmqpMessageProperties setReplyTo(String replyTo) { + + } + + public String getReplyToGroupId() { + + } + + public AmqpMessageProperties setReplyToGroupId(String replyToGroupId) { + + } + + public String getSubject() { + + } + + public AmqpMessageProperties setSubject(String subject) { + + } + + public String getTo() { + + } + + public AmqpMessageProperties setTo(String to) { + + } + + public byte[] getUserId() { + + } + + public AmqpMessageProperties setUserId(byte[] userId) { + + } + + +} diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java index 7577f4075fb2..76daaf089fe9 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java @@ -1,10 +1,27 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + package com.azure.core.amqp.models; +/** + * + */ public class BinaryData { + private byte[] data; + /** + * + * @param data + */ public BinaryData(byte[] data) { - + this.data = data; } - public byte[] getData() { + /** + * + * @return + */ + + public byte[] getData() { + return data; } } From 10f0647ada91368f1505487653aaae40caf33106 Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Wed, 2 Sep 2020 10:42:53 -0700 Subject: [PATCH 03/27] Continue implementation --- .../core/amqp/models/AmqpMessageHeader.java | 19 +- .../amqp/models/AmqpMessageProperties.java | 218 +++++++++++++++--- 2 files changed, 202 insertions(+), 35 deletions(-) diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java index 3ad880ebd06a..2bb1ca048b50 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java @@ -33,10 +33,10 @@ public Integer getDeliveryCount() { } /** - * Sets delivery count. + * Sets the given {@code deliveryCount} value on {@link AmqpMessageHeader} object. * * @param deliveryCount to be set. - * @return updated {@link AmqpMessageHeader}. + * @return updated {@link AmqpMessageHeader} object. */ public AmqpMessageHeader setDeliveryCount(Integer deliveryCount) { this.deliveryCount = deliveryCount; @@ -53,10 +53,10 @@ public Boolean getDurable() { } /** - * Sets the durable boolean flag. + * Sets the given {@code durable} value on {@link AmqpMessageHeader} object. * * @param durable to set on {@link AmqpMessageHeader}. - * @return updated {@link AmqpMessageHeader}. + * @return updated {@link AmqpMessageHeader} object. */ public AmqpMessageHeader setDurable(Boolean durable) { this.durable = durable; @@ -73,10 +73,10 @@ public Boolean getFirstAcquirer() { } /** - * Sets the {@code firstAcquirer} boolean flag. + * Sets the given {@code firstAcquirer} value on {@link AmqpMessageHeader} object. * * @param firstAcquirer to set on {@link AmqpMessageHeader}. - * @return updated {@link AmqpMessageHeader}. + * @return updated {@link AmqpMessageHeader} object. */ public AmqpMessageHeader setFirstAcquirer(Boolean firstAcquirer) { this.firstAcquirer = firstAcquirer; @@ -92,10 +92,10 @@ public Byte getPriority(){ } /** - * Sets the priority. + * Sets the given {@code priority} value on {@link AmqpMessageHeader} object. * * @param priority to set on {@link AmqpMessageHeader}. - * @return updated {@link AmqpMessageHeader}. + * @return updated {@link AmqpMessageHeader} object. */ public AmqpMessageHeader setPriority(Byte priority) { this.priority = priority; @@ -111,9 +111,10 @@ public Duration getTimeToLive() { } /** + * Sets the given {@code timeToLive} value on {@link AmqpMessageHeader} object. * * @param timeToLive to set on {@link AmqpMessageHeader}. - * @return updated {@link AmqpMessageHeader}. + * @return updated {@link AmqpMessageHeader} object. */ public AmqpMessageHeader setTimeToLive(Duration timeToLive) { this.timeToLive = timeToLive; diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java index 9e0fcbfc816e..f88e464824bb 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java @@ -3,122 +3,288 @@ package com.azure.core.amqp.models; +import com.azure.core.annotation.Fluent; + import java.time.OffsetDateTime; /** * Represents properties from Amqp message. */ +@Fluent public class AmqpMessageProperties { private OffsetDateTime absoluteExpiryTime; + private String contentEncoding; + private String contentType; + private String correlationId; + private OffsetDateTime creationTime; + private String groupId; + private String groupSequence; + private String messageId; + private String replyToGroupId; + private String replyTo; + private String to; + private String subject; + private byte[] userId; /** + * Gets AbsoluteExpiryTime from Amqp message. * - * @return + * @return The {@code absoluteExpiryTime}. */ public OffsetDateTime getAbsoluteExpiryTime() { return this.absoluteExpiryTime; } + /** + * Sets the given {@code absoluteExpiryTime} value on {@link AmqpMessageProperties} object. + * + * @param absoluteExpiryTime to be set . + * @return updated {@link AmqpMessageProperties} object. + */ public AmqpMessageProperties setAbsoluteExpiryTime(OffsetDateTime absoluteExpiryTime) { - this.absoluteExpiryTime = absoluteExpiryTime; + this.absoluteExpiryTime = absoluteExpiryTime; return this; } + /** + * Gets AbsoluteExpiryTime from Amqp message. + * + * @return The {@code absoluteExpiryTime}. + */ public String getContentEncoding() { - + return this.contentEncoding; } + /** + * Sets the given {@code contentEncoding} value on {@link AmqpMessageProperties} object. + * + * @param contentEncoding to be set . + * @return updated {@link AmqpMessageProperties} object. + */ public AmqpMessageProperties setContentEncoding(String contentEncoding) { - + this.contentEncoding = contentEncoding; + return this; } + /** + * Gets {@code contentType} from the Amqp message. + * + * @return The {@code contentType}. + */ public String getContentType() { - + return contentType; } + /** + * Sets the given {@code contentType} value on {@link AmqpMessageProperties} object. + * + * @param contentType to be set . + * @return updated {@link AmqpMessageProperties} object. + */ public AmqpMessageProperties setContentType(String contentType) { - + this.contentType = contentType; + return this; } + /** + * Gets {@code correlationId} from the Amqp message. + * + * @return The {@code correlationId}. + */ public String getCorrelationId() { - + return this.correlationId; } + /** + * Sets the given {@code correlationId} value on {@link AmqpMessageProperties} object. + * + * @param correlationId to be set . + * @return updated {@link AmqpMessageProperties} object. + */ public AmqpMessageProperties setCorrelationId(String correlationId) { - + this.correlationId = correlationId; + return this; } + /** + * Gets {@code creationTime} from the Amqp message. + * + * @return The {@code creationTime}. + */ public OffsetDateTime getCreationTime() { - + return this.creationTime; } + /** + * Sets the given {@code creationTime} value on {@link AmqpMessageProperties} object. + * + * @param creationTime to be set . + * @return updated {@link AmqpMessageProperties} object. + */ public AmqpMessageProperties setCreationTime(OffsetDateTime creationTime) { - + this.creationTime = creationTime; + return this; } + /** + * Gets {@code groupId} from the Amqp message. + * + * @return The {@code groupId}. + */ public String getGroupId() { - + return this.groupId; } + /** + * Sets the given {@code groupId} value on {@link AmqpMessageProperties} object. + * + * @param groupId to be set . + * @return updated {@link AmqpMessageProperties} object. + */ public AmqpMessageProperties setGroupId(String groupId) { - + this.groupId = groupId; + return this; } + /** + * Gets {@code groupSequence} from the Amqp message. + * + * @return The {@code groupSequence}. + */ public String getGroupSequence() { - + return this.groupSequence; } + /** + * Sets the given {@code groupSequence} value on {@link AmqpMessageProperties} object. + * + * @param groupSequence to be set . + * @return updated {@link AmqpMessageProperties} object. + */ public AmqpMessageProperties setGroupSequence(String groupSequence) { - + this.groupSequence = groupSequence; + return this; } + /** + * Gets {@code messageId} from the Amqp message. + * + * @return The {@code messageId}. + */ public String getMessageId() { - + return this.messageId; } + /** + * Sets the given {@code messageId} value on {@link AmqpMessageProperties} object. + * + * @param messageId to be set . + * @return updated {@link AmqpMessageProperties} object. + */ public AmqpMessageProperties setMessageId(String messageId) { - + this.messageId = messageId; + return this; } + /** + * Gets {@code replyTo} from the Amqp message. + * + * @return The {@code replyTo}. + */ public String getReplyTo() { - + return this.replyTo; } + /** + * Sets the given {@code replyTo} value on {@link AmqpMessageProperties} object. + * + * @param replyTo to be set . + * @return updated {@link AmqpMessageProperties} object. + */ public AmqpMessageProperties setReplyTo(String replyTo) { - + this.replyTo = replyTo; + return this; } + /** + * Gets {@code replyToGroupId} from the Amqp message. + * + * @return The {@code replyToGroupId}. + */ public String getReplyToGroupId() { - + return this.replyToGroupId; } + /** + * Sets the given {@code replyToGroupId} value on {@link AmqpMessageProperties} object. + * + * @param replyToGroupId to be set . + * @return updated {@link AmqpMessageProperties} object. + */ public AmqpMessageProperties setReplyToGroupId(String replyToGroupId) { - + this.replyToGroupId = replyToGroupId; + return this; } + /** + * Gets {@code subject} from the Amqp message. + * + * @return The {@code subject}. + */ public String getSubject() { - + return this.subject; } + /** + * Sets the given {@code subject} value on {@link AmqpMessageProperties} object. + * + * @param subject to be set . + * @return updated {@link AmqpMessageProperties} object. + */ public AmqpMessageProperties setSubject(String subject) { - + this.subject = subject; + return this; } + /** + * Gets {@code to} from the Amqp message. + * + * @return The {@code to}. + */ public String getTo() { - + return this.to; } + /** + * Sets the given {@code to} value on {@link AmqpMessageProperties} object. + * + * @param to to be set . + * @return updated {@link AmqpMessageProperties} object. + */ public AmqpMessageProperties setTo(String to) { - + this.to = to; + return this; } + /** + * Gets {@code userId} from Amqp message. + * + * @return The {@code userId}. + */ public byte[] getUserId() { - + return this.userId; } + /** + * Sets the given {@code userId} value on {@link AmqpMessageProperties} object. + * + * @param userId to be set . + * @return updated {@link AmqpMessageProperties} object. + */ public AmqpMessageProperties setUserId(byte[] userId) { - + this.userId = userId; + return this; } From 5cd4b18aaeb7d002f42a65d1acea47322eaf5e4b Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Thu, 3 Sep 2020 00:47:08 -0700 Subject: [PATCH 04/27] Continue implementation --- .../amqp/models/AmqpAnnotatedMessage.java | 90 ++++++++++++--- .../azure/core/amqp/models/AmqpDataBody.java | 9 ++ .../core/amqp/models/AmqpMessageBody.java | 4 + .../core/amqp/models/AmqpMessageHeader.java | 2 +- .../azure/core/amqp/models/BinaryData.java | 9 +- .../servicebus/ServiceBusMessage.java | 109 ++++++++++++------ .../servicebus/ServiceBusMessageBatch.java | 2 +- .../ServiceBusMessageSerializer.java | 6 +- .../servicebus/ServiceBusReceivedMessage.java | 10 ++ ...usSenderAsyncClientJavaDocCodeSamples.java | 4 +- ...viceBusSenderClientJavaDocCodeSamples.java | 6 +- .../servicebus/ServiceBusMessageTest.java | 2 +- ...BusReceiverAsyncClientIntegrationTest.java | 2 +- ...rviceBusReceiverClientIntegrationTest.java | 2 +- .../azure/messaging/servicebus/TestUtils.java | 4 +- 15 files changed, 186 insertions(+), 75 deletions(-) diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java index fef064fc2a80..f41cd6f81310 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java @@ -3,26 +3,51 @@ package com.azure.core.amqp.models; +import java.util.HashMap; import java.util.Map; +import java.util.Objects; /** - * + * Amqp representation of the message. */ -public class AmqpAnnotatedMessage { - private AmqpMessageBody body; - private Map applicationProperties; - private Map deliveryAnnotations; - private Map MessageAnnotations; - private Map footer; - private AmqpMessageHeader header; - private AmqpMessageProperties messageProperties; +public final class AmqpAnnotatedMessage { + private final AmqpMessageBody amqpMessageBody; + private final Map applicationProperties; + private final Map deliveryAnnotations; + private final Map messageAnnotations; + private final Map footer; + private final AmqpMessageHeader header; + private final AmqpMessageProperties properties; + /** + * Creates instance of {@link AmqpAnnotatedMessage} with given {@link AmqpMessageBody}. + * + * @param body to be set on amqp message. + */ public AmqpAnnotatedMessage(AmqpMessageBody body) { - this.body = body; + this.amqpMessageBody = Objects.requireNonNull(body, "'body' cannot be null.");; + this.applicationProperties = new HashMap<>(); + this.deliveryAnnotations = new HashMap<>(); + this.messageAnnotations = new HashMap<>(); + this.footer = new HashMap<>(); + this.header = new AmqpMessageHeader(); + this.properties = new AmqpMessageProperties(); } + /** + * Creates instance of {@link AmqpAnnotatedMessage} with given {@link AmqpAnnotatedMessage}. + * + * @param message used to create another instance of {@link AmqpAnnotatedMessage}. + */ public AmqpAnnotatedMessage(AmqpAnnotatedMessage message) { - + Objects.requireNonNull(message, "'message' cannot be null."); + this.amqpMessageBody = Objects.requireNonNull(message.getBody(), "'message.body' cannot be null."); + this.applicationProperties = message.getApplicationProperties(); + this.deliveryAnnotations = message.getDeliveryAnnotations(); + this.messageAnnotations = message.getMessageAnnotations(); + this.footer = message.getFooter(); + this.header = message.getHeader(); + this.properties = message.getProperties(); } /** @@ -33,28 +58,57 @@ public Map getApplicationProperties() { return applicationProperties; } + /** + * Gets the {@link AmqpMessageBody}. + * + * @return the {@link AmqpMessageBody} object. + */ public AmqpMessageBody getBody() { - return this.body; + return amqpMessageBody; } + /** + * Gets the {@link Map} representation of delivery annotations. + * + * @return the {@link Map} representation of delivery annotations. + */ public Map getDeliveryAnnotations() { - return this.deliveryAnnotations; + return deliveryAnnotations; } + /** + * Gets the {@link Map} representation of footer. + * + * @return the {@link Map} representation of footer. + */ public Map getFooter() { - return this.footer; + return footer; } + /** + * Gets the {@link AmqpMessageHeader}. + * + * @return the {@link AmqpMessageHeader} object. + */ public AmqpMessageHeader getHeader() { - return this.header; + return header; } + /** + * Gets the {@link Map} representation of message annotations. + * + * @return the {@link Map} representation of message annotations. + */ public Map getMessageAnnotations() { - return this.MessageAnnotations; + return messageAnnotations; } + /** + * Gets the {@link AmqpMessageProperties}. + * + * @return the {@link AmqpMessageProperties} object. + */ public AmqpMessageProperties getProperties() { - return messageProperties; + return properties; } - } diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java index b03ffed2044e..a091293980ba 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java @@ -13,6 +13,10 @@ public class AmqpDataBody implements AmqpMessageBody { private final Iterable data; private final IterableStream dataStream; + /** + * + * @param data to be set. + */ public AmqpDataBody(Iterable data) { this.data = data; this.dataStream = new IterableStream<>(data); @@ -22,6 +26,11 @@ public AmqpDataBody(Iterable data) { public AmqpBodyType getBodyType() { return bodyType; } + + /** + * + * @return data. + */ public IterableStream getData() { return dataStream; } diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageBody.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageBody.java index 3124c081fcdb..8fe504edc51a 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageBody.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageBody.java @@ -7,5 +7,9 @@ * Interface representing Amqp Message Body. */ public interface AmqpMessageBody { + /** + * + * @return The {@link AmqpBodyType}. + */ AmqpBodyType getBodyType(); } diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java index 2bb1ca048b50..1b0a0fa9a6c0 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java @@ -87,7 +87,7 @@ public AmqpMessageHeader setFirstAcquirer(Boolean firstAcquirer) { * Gets the priority on {@code amqpMessage}. * @return the priority. */ - public Byte getPriority(){ + public Byte getPriority() { return this.priority; } diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java index 76daaf089fe9..23b86bbd92c2 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java @@ -4,13 +4,14 @@ package com.azure.core.amqp.models; /** - * + * Binary representation of amqp message body. */ public class BinaryData { - private byte[] data; + private final byte[] data; /** + *Create {@link BinaryData} instance with given byte array data. * - * @param data + * @param data to use. */ public BinaryData(byte[] data) { this.data = data; @@ -18,7 +19,7 @@ public BinaryData(byte[] data) { /** * - * @return + * @return byte array representing {@link BinaryData}. */ public byte[] getData() { diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java index aa54261b7dbd..e6d596adb32d 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java @@ -3,15 +3,21 @@ package com.azure.messaging.servicebus; + +import com.azure.core.amqp.models.AmqpAnnotatedMessage; +import com.azure.core.amqp.models.AmqpDataBody; +import com.azure.core.amqp.models.BinaryData; import com.azure.core.util.Context; import java.nio.charset.StandardCharsets; import java.time.Duration; import java.time.OffsetDateTime; import java.util.Arrays; -import java.util.HashMap; +import java.util.Collections; +import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; /** * The data structure encapsulating the message being sent-to Service Bus. @@ -22,7 +28,7 @@ * AMQP 1.0 specification * *
    - *
  1. {@link #getProperties()} - AMQPMessage.ApplicationProperties section
  2. + *
  3. {@link #getApplicationProperties()} - AMQPMessage.ApplicationProperties section
  4. *
  5. {@link #getBody()} - if AMQPMessage.Body has Data section
  6. *
* @@ -34,9 +40,11 @@ * @see ServiceBusMessageBatch */ public class ServiceBusMessage { - private final Map properties = new HashMap<>(); - private final byte[] body; + private static final String SCHEDULED_ENQUEUE_TIME_NAME = "x-opt-scheduled-enqueue-time"; private Context context; + private final AmqpAnnotatedMessage amqpAnnotatedMessage; + /*private final Map applicationProperties = new HashMap<>(); + private String contentType; private String correlationId; private String label; @@ -48,7 +56,7 @@ public class ServiceBusMessage { private String sessionId; private Duration timeToLive; private String to; - private String viaPartitionKey; + private String viaPartitionKey;*/ /** * Creates a {@link ServiceBusMessage} with a {@link java.nio.charset.StandardCharsets#UTF_8 UTF_8} encoded body. @@ -69,8 +77,9 @@ public ServiceBusMessage(String body) { * @throws NullPointerException if {@code body} is {@code null}. */ public ServiceBusMessage(byte[] body) { - this.body = Objects.requireNonNull(body, "'body' cannot be null."); + Objects.requireNonNull(body, "'body' cannot be null."); this.context = Context.NONE; + amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList(new BinaryData(body)))); } /** @@ -82,13 +91,13 @@ public ServiceBusMessage(byte[] body) { * @throws NullPointerException if {@code receivedMessage} is {@code null}. */ public ServiceBusMessage(ServiceBusReceivedMessage receivedMessage) { - this.body = receivedMessage.getBody(); + this.amqpAnnotatedMessage = new AmqpAnnotatedMessage(receivedMessage.getAmqpAnnotatedMessage()); this.context = Context.NONE; setMessageId(receivedMessage.getMessageId()); setScheduledEnqueueTime(receivedMessage.getScheduledEnqueueTime()); setContentType(receivedMessage.getContentType()); setCorrelationId(receivedMessage.getCorrelationId()); - setLabel(receivedMessage.getLabel()); + setSubject(receivedMessage.getLabel()); setPartitionKey(receivedMessage.getPartitionKey()); setReplyTo(receivedMessage.getReplyTo()); setReplyToSessionId(receivedMessage.getReplyToSessionId()); @@ -96,18 +105,29 @@ public ServiceBusMessage(ServiceBusReceivedMessage receivedMessage) { setTo(receivedMessage.getTo()); setSessionId(receivedMessage.getSessionId()); setViaPartitionKey(receivedMessage.getViaPartitionKey()); + + //TODO (Hemant): Cleanup the values from AmqpAnnotatedMessage which should never be set by user. + // Some values of MessageAnnotations , Header.deliveryCount etc + } + + /** + * + * @return + */ + public AmqpAnnotatedMessage getAmqpAnnotatedMessage() { + return amqpAnnotatedMessage; } /** * Gets the set of free-form {@link ServiceBusMessage} properties which may be used for passing metadata associated - * with the {@link ServiceBusMessage} during Service Bus operations. A common use-case for {@code properties()} is - * to associate serialization hints for the {@link #getBody()} as an aid to consumers who wish to deserialize the - * binary data. + * with the {@link ServiceBusMessage} during Service Bus operations. A common use-case for + * {@code applicationProperties()} is to associate serialization hints for the {@link #getBody()} as an aid to + * consumers who wish to deserialize the binary data. * * @return Application properties associated with this {@link ServiceBusMessage}. */ - public Map getProperties() { - return properties; + public Map getApplicationProperties() { + return amqpAnnotatedMessage.getApplicationProperties(); } /** @@ -115,14 +135,26 @@ public Map getProperties() { * *

* If the means for deserializing the raw data is not apparent to consumers, a common technique is to make use of - * {@link #getProperties()} when creating the event, to associate serialization hints as an aid to consumers who + * {@link #getApplicationProperties()} when creating the event, to associate serialization hints as an aid to consumers who * wish to deserialize the binary data. *

* * @return A byte array representing the data. */ public byte[] getBody() { - return Arrays.copyOf(body, body.length); + byte[] body = null; + switch(amqpAnnotatedMessage.getBody().getBodyType()) { + case DATA: + List binaryData = ((AmqpDataBody)amqpAnnotatedMessage.getBody()).getData().stream() + .collect(Collectors.toList()); + if (binaryData != null && binaryData.size() > 0) { + byte[] firstData = binaryData.get(0).getData(); + body = Arrays.copyOf(firstData, firstData.length); + } + break; + default: + } + return body; } /** @@ -131,7 +163,7 @@ public byte[] getBody() { * @return the contentType of the {@link ServiceBusMessage}. */ public String getContentType() { - return contentType; + return amqpAnnotatedMessage.getProperties().getContentType(); } /** @@ -142,7 +174,7 @@ public String getContentType() { * @return The updated {@link ServiceBusMessage}. */ public ServiceBusMessage setContentType(String contentType) { - this.contentType = contentType; + amqpAnnotatedMessage.getProperties().setContentType(contentType); return this; } @@ -158,7 +190,7 @@ public ServiceBusMessage setContentType(String contentType) { * Routing and Correlation */ public String getCorrelationId() { - return correlationId; + return amqpAnnotatedMessage.getProperties().getCorrelationId(); } /** @@ -170,28 +202,28 @@ public String getCorrelationId() { * @see #getCorrelationId() */ public ServiceBusMessage setCorrelationId(String correlationId) { - this.correlationId = correlationId; + amqpAnnotatedMessage.getProperties().setCorrelationId(correlationId); return this; } /** - * Gets the label for the message. + * Gets the subject for the message. * - * @return The label for the message. + * @return The subject for the message. */ - public String getLabel() { - return label; + public String getSubject() { + return amqpAnnotatedMessage.getProperties().getSubject(); } /** - * Sets the label for the message. + * Sets the subject for the message. * - * @param label The label to set. + * @param label The subject to set. * * @return The updated {@link ServiceBusMessage} object. */ - public ServiceBusMessage setLabel(String label) { - this.label = label; + public ServiceBusMessage setSubject(String label) { + amqpAnnotatedMessage.getProperties().setSubject(label); return this; } @@ -199,7 +231,7 @@ public ServiceBusMessage setLabel(String label) { * @return Id of the {@link ServiceBusMessage}. */ public String getMessageId() { - return messageId; + return amqpAnnotatedMessage.getProperties().getMessageId(); } /** @@ -210,7 +242,7 @@ public String getMessageId() { * @return The updated {@link ServiceBusMessage}. */ public ServiceBusMessage setMessageId(String messageId) { - this.messageId = messageId; + amqpAnnotatedMessage.getProperties().setMessageId(messageId); return this; } @@ -227,8 +259,9 @@ public ServiceBusMessage setMessageId(String messageId) { * @see Partitioned * entities */ + private static final String PARTITION_KEY_NAME = "x-opt-partition-key"; public String getPartitionKey() { - return partitionKey; + return (String)amqpAnnotatedMessage.getMessageAnnotations().get(PARTITION_KEY_NAME); } /** @@ -240,7 +273,7 @@ public String getPartitionKey() { * @see #getPartitionKey() */ public ServiceBusMessage setPartitionKey(String partitionKey) { - this.partitionKey = partitionKey; + amqpAnnotatedMessage.getMessageAnnotations().put(PARTITION_KEY_NAME, partitionKey); return this; } @@ -256,7 +289,7 @@ public ServiceBusMessage setPartitionKey(String partitionKey) { * Routing and Correlation */ public String getReplyTo() { - return replyTo; + return amqpAnnotatedMessage.getProperties().getReplyTo(); } /** @@ -268,7 +301,7 @@ public String getReplyTo() { * @see #getReplyTo() */ public ServiceBusMessage setReplyTo(String replyTo) { - this.replyTo = replyTo; + amqpAnnotatedMessage.getProperties().setReplyTo(replyTo); return this; } @@ -278,7 +311,7 @@ public ServiceBusMessage setReplyTo(String replyTo) { * @return "To" property value of this message */ public String getTo() { - return to; + return amqpAnnotatedMessage.getProperties().getTo(); } /** @@ -294,7 +327,7 @@ public String getTo() { * @return The updated {@link ServiceBusMessage}. */ public ServiceBusMessage setTo(String to) { - this.to = to; + amqpAnnotatedMessage.getProperties().setTo(to); return this; } @@ -341,7 +374,7 @@ public ServiceBusMessage setTimeToLive(Duration timeToLive) { * Timestamps */ public OffsetDateTime getScheduledEnqueueTime() { - return scheduledEnqueueTime; + return (OffsetDateTime)amqpAnnotatedMessage.getMessageAnnotations().get(SCHEDULED_ENQUEUE_TIME_NAME); } /** @@ -353,7 +386,7 @@ public OffsetDateTime getScheduledEnqueueTime() { * @see #getScheduledEnqueueTime() */ public ServiceBusMessage setScheduledEnqueueTime(OffsetDateTime scheduledEnqueueTime) { - this.scheduledEnqueueTime = scheduledEnqueueTime; + amqpAnnotatedMessage.getMessageAnnotations().put(SCHEDULED_ENQUEUE_TIME_NAME, scheduledEnqueueTime); return this; } @@ -368,7 +401,7 @@ public ServiceBusMessage setScheduledEnqueueTime(OffsetDateTime scheduledEnqueue * Routing and Correlation */ public String getReplyToSessionId() { - return replyToSessionId; + return (OffsetDateTime)amqpAnnotatedMessage.getMessageAnnotations().get(SCHEDULED_ENQUEUE_TIME_NAME); } /** diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java index d4c94b1dcb77..af085609b6de 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java @@ -144,7 +144,7 @@ private ServiceBusMessage traceMessageSpan(ServiceBusMessage serviceBusMessage) Context eventSpanContext = tracerProvider.startSpan(serviceBusMessage.getContext(), ProcessKind.MESSAGE); Optional eventDiagnosticIdOptional = eventSpanContext.getData(DIAGNOSTIC_ID_KEY); if (eventDiagnosticIdOptional.isPresent()) { - serviceBusMessage.getProperties().put(DIAGNOSTIC_ID_KEY, eventDiagnosticIdOptional.get().toString()); + serviceBusMessage.getApplicationProperties().put(DIAGNOSTIC_ID_KEY, eventDiagnosticIdOptional.get().toString()); tracerProvider.endSpan(eventSpanContext, Signal.complete()); serviceBusMessage.addContext(SPAN_CONTEXT_KEY, eventSpanContext); } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java index 9e06ac82c674..033b31c4d2a9 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java @@ -132,8 +132,8 @@ public Message serialize(T object) { //TODO (conniey): support AMQP sequence and AMQP value. amqpMessage.setBody(new Data(new Binary(body))); - if (brokeredMessage.getProperties() != null) { - amqpMessage.setApplicationProperties(new ApplicationProperties(brokeredMessage.getProperties())); + if (brokeredMessage.getApplicationProperties() != null) { + amqpMessage.setApplicationProperties(new ApplicationProperties(brokeredMessage.getApplicationProperties())); } if (brokeredMessage.getTimeToLive() != null) { @@ -147,7 +147,7 @@ public Message serialize(T object) { amqpMessage.setMessageId(brokeredMessage.getMessageId()); amqpMessage.setContentType(brokeredMessage.getContentType()); amqpMessage.setCorrelationId(brokeredMessage.getCorrelationId()); - amqpMessage.setSubject(brokeredMessage.getLabel()); + amqpMessage.setSubject(brokeredMessage.getSubject()); amqpMessage.getProperties().setTo(brokeredMessage.getTo()); amqpMessage.setReplyTo(brokeredMessage.getReplyTo()); amqpMessage.setReplyToGroupId(brokeredMessage.getReplyToSessionId()); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java index e709f04901e9..012e33094758 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java @@ -3,6 +3,7 @@ package com.azure.messaging.servicebus; +import com.azure.core.amqp.models.AmqpAnnotatedMessage; import com.azure.messaging.servicebus.models.ReceiveMode; import java.time.Duration; @@ -17,6 +18,7 @@ * This class represents a received message from Service Bus. */ public final class ServiceBusReceivedMessage { + private AmqpAnnotatedMessage amqpAnnotatedMessage; private UUID lockToken; private long sequenceNumber; private long enqueuedSequenceNumber; @@ -47,6 +49,14 @@ public final class ServiceBusReceivedMessage { this.properties = new HashMap<>(); } + /** + * + * @return + */ + public AmqpAnnotatedMessage getAmqpAnnotatedMessage() { + return amqpAnnotatedMessage; + } + /** * Gets the actual payload/data wrapped by the {@link ServiceBusReceivedMessage}. * diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientJavaDocCodeSamples.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientJavaDocCodeSamples.java index 08dd588c842e..a9dadc7bc03a 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientJavaDocCodeSamples.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientJavaDocCodeSamples.java @@ -94,9 +94,9 @@ public void batchSizeLimited() { .buildAsyncClient(); final ServiceBusMessage firstMessage = new ServiceBusMessage("92".getBytes(UTF_8)); - firstMessage.getProperties().put("telemetry", "latency"); + firstMessage.getApplicationProperties().put("telemetry", "latency"); final ServiceBusMessage secondMessage = new ServiceBusMessage("98".getBytes(UTF_8)); - secondMessage.getProperties().put("telemetry", "cpu-temperature"); + secondMessage.getApplicationProperties().put("telemetry", "cpu-temperature"); // BEGIN: com.azure.messaging.servicebus.servicebusasyncsenderclient.createBatch#CreateBatchOptionsLimitedSize final Flux telemetryMessages = Flux.just(firstMessage, secondMessage); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderClientJavaDocCodeSamples.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderClientJavaDocCodeSamples.java index 3e1f5a874526..b9506539e082 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderClientJavaDocCodeSamples.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderClientJavaDocCodeSamples.java @@ -80,11 +80,11 @@ public void batchSizeLimited() { .buildClient(); final ServiceBusMessage firstMessage = new ServiceBusMessage("message-1".getBytes(UTF_8)); - firstMessage.getProperties().put("telemetry", "latency"); + firstMessage.getApplicationProperties().put("telemetry", "latency"); final ServiceBusMessage secondMessage = new ServiceBusMessage("message-2".getBytes(UTF_8)); - secondMessage.getProperties().put("telemetry", "cpu-temperature"); + secondMessage.getApplicationProperties().put("telemetry", "cpu-temperature"); final ServiceBusMessage thirdMessage = new ServiceBusMessage("message-3".getBytes(UTF_8)); - thirdMessage.getProperties().put("telemetry", "fps"); + thirdMessage.getApplicationProperties().put("telemetry", "fps"); // BEGIN: com.azure.messaging.servicebus.servicebussenderclient.createBatch#CreateBatchOptions-int diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java index b060a8d73156..8cd07d85cc0d 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java @@ -48,7 +48,7 @@ void messagePropertiesShouldNotBeNull() { // Assert Assertions.assertNotNull(serviceBusMessageData.getBody()); Assertions.assertNotNull(serviceBusMessageData.getContext()); - Assertions.assertNotNull(serviceBusMessageData.getProperties()); + Assertions.assertNotNull(serviceBusMessageData.getApplicationProperties()); } /** diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java index a20bcd986d97..95a29694524b 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java @@ -849,7 +849,7 @@ void sendReceiveMessageWithVariousPropertyTypes(MessagingEntityType entityType) final String messageId = UUID.randomUUID().toString(); final ServiceBusMessage messageToSend = getMessage(messageId, isSessionEnabled); - Map sentProperties = messageToSend.getProperties(); + Map sentProperties = messageToSend.getApplicationProperties(); sentProperties.put("NullProperty", null); sentProperties.put("BooleanProperty", true); sentProperties.put("ByteProperty", (byte) 1); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientIntegrationTest.java index 8f9ff62e23a6..3148fdc4fc5f 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientIntegrationTest.java @@ -739,7 +739,7 @@ void sendReceiveMessageWithVariousPropertyTypes(MessagingEntityType entityType, final ServiceBusMessage messageToSend = getMessage(messageId, isSessionEnabled); final int maxMessages = 1; - Map sentProperties = messageToSend.getProperties(); + Map sentProperties = messageToSend.getApplicationProperties(); sentProperties.put("NullProperty", null); sentProperties.put("BooleanProperty", true); sentProperties.put("ByteProperty", (byte) 1); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java index a69b9efc6fad..a898c8c2734e 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java @@ -198,7 +198,7 @@ public static List getServiceBusMessages(int numberOfEvents, return IntStream.range(0, numberOfEvents) .mapToObj(number -> { final ServiceBusMessage message = getServiceBusMessage(content, messageId); - message.getProperties().put(MESSAGE_POSITION_ID, number); + message.getApplicationProperties().put(MESSAGE_POSITION_ID, number); return message; }) @@ -218,7 +218,7 @@ public static List getServiceBusMessages(int numberOfEvents, return IntStream.range(0, numberOfEvents) .mapToObj(number -> { final ServiceBusMessage message = getServiceBusMessage("Event " + number, messageId); - message.getProperties().put(MESSAGE_POSITION_ID, number); + message.getApplicationProperties().put(MESSAGE_POSITION_ID, number); return message; }) From 7dee51803ed2a99b4b7c47df3709d8e6f25911bd Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Fri, 4 Sep 2020 08:28:51 -0700 Subject: [PATCH 05/27] Continue implementation --- .../amqp/models/AmqpAnnotatedMessage.java | 40 +- .../azure/core/amqp/models/AmqpDataBody.java | 11 +- .../core/amqp/models/AmqpMessageHeader.java | 12 +- .../amqp/models/AmqpMessageProperties.java | 11 +- .../azure/core/amqp/models/BinaryData.java | 8 +- .../servicebus/ServiceBusAsyncConsumer.java | 2 + .../servicebus/ServiceBusClientBuilder.java | 1 + .../servicebus/ServiceBusMessageBatch.java | 1 + .../ServiceBusMessageSerializer.java | 53 ++- .../ServiceBusReceiverAsyncClient.java | 14 +- .../servicebus/ServiceBusReceiverClient.java | 2 + .../ServiceBusSenderAsyncClient.java | 4 +- .../servicebus/ServiceBusSenderClient.java | 2 + .../SynchronousMessageSubscriber.java | 1 + .../servicebus/SynchronousReceiveWork.java | 1 + .../servicebus/UnnamedSessionManager.java | 1 + .../servicebus/UnnamedSessionReceiver.java | 8 +- .../models/CorrelationRuleFilter.java | 2 +- .../administration/models/RuleFilter.java | 2 +- .../administration/models/SqlRuleAction.java | 2 +- .../administration/models/SqlRuleFilter.java | 2 +- .../implementation/EntityHelper.java | 147 ++++++ .../implementation/ManagementChannel.java | 4 +- .../MessageManagementOperations.java | 2 +- .../ServiceBusManagementNode.java | 4 +- .../{ => models}/ServiceBusMessage.java | 55 ++- .../ServiceBusReceivedMessage.java | 432 +++++++++++++----- .../ServiceBusReceivedMessageContext.java | 25 +- .../messaging/servicebus/ReadmeSamples.java | 3 + .../ReceiveMessageAndSettleAsyncSample.java | 1 + .../servicebus/ReceiveMessageAsyncSample.java | 1 + .../ReceiveMessageAutoLockRenewal.java | 1 + ...eceiveMessageAzureIdentityAsyncSample.java | 1 + .../servicebus/ReceiveMessageSyncSample.java | 3 + .../servicebus/ReceiveNamedSessionSample.java | 2 + .../SendAndReceiveSessionMessageSample.java | 2 + .../servicebus/SendMessageAsyncSample.java | 2 + .../SendMessageBatchSyncSample.java | 1 + ...ndMessageWithAzureIdentityAsyncSample.java | 1 + ...dScheduledMessageAndCancelAsyncSample.java | 2 + ...ReceiverAsyncClientJavaDocCodeSamples.java | 2 + ...usSenderAsyncClientJavaDocCodeSamples.java | 1 + ...viceBusSenderClientJavaDocCodeSamples.java | 1 + .../servicebus/IntegrationTestBase.java | 3 + .../servicebus/ProxyReceiveTest.java | 1 + .../servicebus/ProxySelectorTest.java | 1 + .../messaging/servicebus/ProxySendTest.java | 1 + .../ServiceBusAsyncConsumerTest.java | 1 + .../ServiceBusMessageBatchTest.java | 3 + .../ServiceBusMessageSerializerTest.java | 9 +- ...BusReceiverAsyncClientIntegrationTest.java | 7 +- .../ServiceBusReceiverAsyncClientTest.java | 1 + ...rviceBusReceiverClientIntegrationTest.java | 5 +- .../ServiceBusReceiverClientTest.java | 11 +- ...ceBusSenderAsyncClientIntegrationTest.java | 1 + .../ServiceBusSenderAsyncClientTest.java | 2 + ...ServiceBusSenderClientIntegrationTest.java | 1 + .../ServiceBusSenderClientTest.java | 1 + .../azure/messaging/servicebus/TestUtils.java | 2 + .../UnnamedSessionManagerIntegrationTest.java | 3 + .../servicebus/UnnamedSessionManagerTest.java | 2 + .../{ => models}/ServiceBusMessageTest.java | 3 +- .../ServiceBusReceivedMessageTest.java | 23 +- 63 files changed, 738 insertions(+), 216 deletions(-) rename sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/{ => models}/ServiceBusMessage.java (91%) rename sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/{ => models}/ServiceBusReceivedMessage.java (52%) rename sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/{ => models}/ServiceBusReceivedMessageContext.java (66%) rename sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/{ => models}/ServiceBusMessageTest.java (95%) rename sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/{ => models}/ServiceBusReceivedMessageTest.java (82%) diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java index f41cd6f81310..fe02c7386fb1 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java @@ -12,12 +12,12 @@ */ public final class AmqpAnnotatedMessage { private final AmqpMessageBody amqpMessageBody; - private final Map applicationProperties; - private final Map deliveryAnnotations; - private final Map messageAnnotations; - private final Map footer; - private final AmqpMessageHeader header; - private final AmqpMessageProperties properties; + private Map applicationProperties; + private Map deliveryAnnotations; + private Map messageAnnotations; + private Map footer; + private AmqpMessageHeader header; + private AmqpMessageProperties properties; /** * Creates instance of {@link AmqpAnnotatedMessage} with given {@link AmqpMessageBody}. @@ -25,13 +25,7 @@ public final class AmqpAnnotatedMessage { * @param body to be set on amqp message. */ public AmqpAnnotatedMessage(AmqpMessageBody body) { - this.amqpMessageBody = Objects.requireNonNull(body, "'body' cannot be null.");; - this.applicationProperties = new HashMap<>(); - this.deliveryAnnotations = new HashMap<>(); - this.messageAnnotations = new HashMap<>(); - this.footer = new HashMap<>(); - this.header = new AmqpMessageHeader(); - this.properties = new AmqpMessageProperties(); + this.amqpMessageBody = Objects.requireNonNull(body, "'body' cannot be null."); } /** @@ -45,7 +39,6 @@ public AmqpAnnotatedMessage(AmqpAnnotatedMessage message) { this.applicationProperties = message.getApplicationProperties(); this.deliveryAnnotations = message.getDeliveryAnnotations(); this.messageAnnotations = message.getMessageAnnotations(); - this.footer = message.getFooter(); this.header = message.getHeader(); this.properties = message.getProperties(); } @@ -55,6 +48,9 @@ public AmqpAnnotatedMessage(AmqpAnnotatedMessage message) { * @return The application properties. */ public Map getApplicationProperties() { + if (this.applicationProperties == null) { + this.applicationProperties = new HashMap<>(); + } return applicationProperties; } @@ -73,6 +69,10 @@ public AmqpMessageBody getBody() { * @return the {@link Map} representation of delivery annotations. */ public Map getDeliveryAnnotations() { + if (deliveryAnnotations == null) { + this.deliveryAnnotations = new HashMap<>(); + } + return deliveryAnnotations; } @@ -82,6 +82,9 @@ public Map getDeliveryAnnotations() { * @return the {@link Map} representation of footer. */ public Map getFooter() { + if (this.footer == null) { + this.footer = new HashMap<>(); + } return footer; } @@ -91,6 +94,9 @@ public Map getFooter() { * @return the {@link AmqpMessageHeader} object. */ public AmqpMessageHeader getHeader() { + if (this.header == null) { + this.header = new AmqpMessageHeader(); + } return header; } @@ -100,6 +106,9 @@ public AmqpMessageHeader getHeader() { * @return the {@link Map} representation of message annotations. */ public Map getMessageAnnotations() { + if (messageAnnotations == null) { + this.messageAnnotations = new HashMap<>(); + } return messageAnnotations; } @@ -109,6 +118,9 @@ public Map getMessageAnnotations() { * @return the {@link AmqpMessageProperties} object. */ public AmqpMessageProperties getProperties() { + if (properties == null) { + this.properties = new AmqpMessageProperties(); + } return properties; } } diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java index a091293980ba..237388304008 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java @@ -9,17 +9,16 @@ * */ public class AmqpDataBody implements AmqpMessageBody { - private AmqpBodyType bodyType; - private final Iterable data; - private final IterableStream dataStream; + private final AmqpBodyType bodyType; + private final IterableStream data; /** * * @param data to be set. */ public AmqpDataBody(Iterable data) { - this.data = data; - this.dataStream = new IterableStream<>(data); + this.data = new IterableStream<>(data); + this.bodyType = AmqpBodyType.DATA; } @Override @@ -32,6 +31,6 @@ public AmqpBodyType getBodyType() { * @return data. */ public IterableStream getData() { - return dataStream; + return data; } } diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java index 1b0a0fa9a6c0..689af2eff605 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java @@ -13,10 +13,10 @@ @Fluent public class AmqpMessageHeader { - private Integer deliveryCount; + private Long deliveryCount; private Boolean durable; private Boolean firstAcquirer; - private Byte priority; + private short priority; private Duration timeToLive; AmqpMessageHeader() { @@ -28,7 +28,7 @@ public class AmqpMessageHeader { * * @return delivery count. */ - public Integer getDeliveryCount() { + public Long getDeliveryCount() { return deliveryCount; } @@ -38,7 +38,7 @@ public Integer getDeliveryCount() { * @param deliveryCount to be set. * @return updated {@link AmqpMessageHeader} object. */ - public AmqpMessageHeader setDeliveryCount(Integer deliveryCount) { + public AmqpMessageHeader setDeliveryCount(Long deliveryCount) { this.deliveryCount = deliveryCount; return this; } @@ -87,7 +87,7 @@ public AmqpMessageHeader setFirstAcquirer(Boolean firstAcquirer) { * Gets the priority on {@code amqpMessage}. * @return the priority. */ - public Byte getPriority() { + public short getPriority() { return this.priority; } @@ -97,7 +97,7 @@ public Byte getPriority() { * @param priority to set on {@link AmqpMessageHeader}. * @return updated {@link AmqpMessageHeader} object. */ - public AmqpMessageHeader setPriority(Byte priority) { + public AmqpMessageHeader setPriority(short priority) { this.priority = priority; return this; } diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java index f88e464824bb..d3c3b127d43d 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java @@ -6,6 +6,7 @@ import com.azure.core.annotation.Fluent; import java.time.OffsetDateTime; +import java.util.Arrays; /** * Represents properties from Amqp message. @@ -19,7 +20,7 @@ public class AmqpMessageProperties { private String correlationId; private OffsetDateTime creationTime; private String groupId; - private String groupSequence; + private long groupSequence; private String messageId; private String replyToGroupId; private String replyTo; @@ -152,7 +153,7 @@ public AmqpMessageProperties setGroupId(String groupId) { * * @return The {@code groupSequence}. */ - public String getGroupSequence() { + public long getGroupSequence() { return this.groupSequence; } @@ -162,7 +163,7 @@ public String getGroupSequence() { * @param groupSequence to be set . * @return updated {@link AmqpMessageProperties} object. */ - public AmqpMessageProperties setGroupSequence(String groupSequence) { + public AmqpMessageProperties setGroupSequence(long groupSequence) { this.groupSequence = groupSequence; return this; } @@ -273,7 +274,7 @@ public AmqpMessageProperties setTo(String to) { * @return The {@code userId}. */ public byte[] getUserId() { - return this.userId; + return userId != null ? Arrays.copyOf(this.userId, userId.length) : new byte[0]; } /** @@ -283,7 +284,7 @@ public byte[] getUserId() { * @return updated {@link AmqpMessageProperties} object. */ public AmqpMessageProperties setUserId(byte[] userId) { - this.userId = userId; + this.userId = userId != null ? Arrays.copyOf(userId, userId.length) : new byte[0]; return this; } diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java index 23b86bbd92c2..67955aaa2952 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java @@ -3,6 +3,9 @@ package com.azure.core.amqp.models; +import java.util.Arrays; +import java.util.Objects; + /** * Binary representation of amqp message body. */ @@ -14,7 +17,8 @@ public class BinaryData { * @param data to use. */ public BinaryData(byte[] data) { - this.data = data; + Objects.requireNonNull(data, "'data' cannot be null."); + this.data = Arrays.copyOf(data, data.length); } /** @@ -23,6 +27,6 @@ public BinaryData(byte[] data) { */ public byte[] getData() { - return data; + return Arrays.copyOf(data, data.length); } } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusAsyncConsumer.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusAsyncConsumer.java index d0bd513da33b..c83e9887fd84 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusAsyncConsumer.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusAsyncConsumer.java @@ -8,6 +8,8 @@ import com.azure.messaging.servicebus.implementation.DispositionStatus; import com.azure.messaging.servicebus.implementation.MessageUtils; import com.azure.messaging.servicebus.implementation.ServiceBusReceiveLinkProcessor; +import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import org.apache.qpid.proton.amqp.transport.DeliveryState; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusClientBuilder.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusClientBuilder.java index 6ac47b834d7f..f3e69664419d 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusClientBuilder.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusClientBuilder.java @@ -31,6 +31,7 @@ import com.azure.messaging.servicebus.implementation.ServiceBusReactorAmqpConnection; import com.azure.messaging.servicebus.implementation.ServiceBusSharedKeyCredential; import com.azure.messaging.servicebus.models.ReceiveMode; +import com.azure.messaging.servicebus.models.ServiceBusMessage; import com.azure.messaging.servicebus.models.SubQueue; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java index af085609b6de..572cc301d038 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java @@ -11,6 +11,7 @@ import com.azure.core.util.Context; import com.azure.core.util.logging.ClientLogger; import com.azure.core.util.tracing.ProcessKind; +import com.azure.messaging.servicebus.models.ServiceBusMessage; import reactor.core.publisher.Signal; import java.nio.BufferOverflowException; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java index 033b31c4d2a9..7758274a4549 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java @@ -6,10 +6,13 @@ import com.azure.core.amqp.exception.AmqpResponseCode; import com.azure.core.amqp.implementation.MessageSerializer; import com.azure.core.amqp.implementation.RequestResponseUtils; +import com.azure.core.amqp.models.AmqpMessageHeader; import com.azure.core.util.logging.ClientLogger; +import com.azure.messaging.servicebus.implementation.EntityHelper; import com.azure.messaging.servicebus.implementation.ManagementConstants; -import com.azure.messaging.servicebus.implementation.MessageWithLockToken; import com.azure.messaging.servicebus.implementation.Messages; +import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import org.apache.qpid.proton.Proton; import org.apache.qpid.proton.amqp.Binary; import org.apache.qpid.proton.amqp.Decimal128; @@ -24,6 +27,8 @@ import org.apache.qpid.proton.amqp.messaging.AmqpValue; import org.apache.qpid.proton.amqp.messaging.ApplicationProperties; import org.apache.qpid.proton.amqp.messaging.Data; +import org.apache.qpid.proton.amqp.messaging.Footer; +import org.apache.qpid.proton.amqp.messaging.Header; import org.apache.qpid.proton.amqp.messaging.MessageAnnotations; import org.apache.qpid.proton.amqp.messaging.Properties; import org.apache.qpid.proton.amqp.messaging.Section; @@ -32,7 +37,6 @@ import org.apache.qpid.proton.message.Message; import java.lang.reflect.Array; -import java.time.Duration; import java.time.Instant; import java.time.OffsetDateTime; import java.time.ZoneOffset; @@ -52,16 +56,10 @@ * Deserializes and serializes messages to and from Azure Service Bus. */ class ServiceBusMessageSerializer implements MessageSerializer { - private static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; - private static final String ENQUEUED_TIME_UTC_NAME = "x-opt-enqueued-time"; - private static final String SCHEDULED_ENQUEUE_TIME_NAME = "x-opt-scheduled-enqueue-time"; - private static final String SEQUENCE_NUMBER_NAME = "x-opt-sequence-number"; - private static final String LOCKED_UNTIL_NAME = "x-opt-locked-until"; + private static final String PARTITION_KEY_NAME = "x-opt-partition-key"; private static final String VIA_PARTITION_KEY_NAME = "x-opt-via-partition-key"; - private static final String DEAD_LETTER_SOURCE_NAME = "x-opt-deadletter-source"; - private static final String DEAD_LETTER_DESCRIPTION = "DeadLetterErrorDescription"; - private static final String DEAD_LETTER_REASON = "DeadLetterReason"; + private static final String SCHEDULED_ENQUEUE_TIME_NAME = "x-opt-scheduled-enqueue-time"; // This one appears to always be 0, but is always returned with each message. private static final String ENQUEUED_SEQUENCE_NUMBER = "x-opt-enqueue-sequence-number"; @@ -153,6 +151,26 @@ public Message serialize(T object) { amqpMessage.setReplyToGroupId(brokeredMessage.getReplyToSessionId()); amqpMessage.setGroupId(brokeredMessage.getSessionId()); + //set footer + amqpMessage.setFooter(new Footer(brokeredMessage.getAmqpAnnotatedMessage().getFooter())); + + //set header + AmqpMessageHeader header = brokeredMessage.getAmqpAnnotatedMessage().getHeader(); + if (header.getDeliveryCount() != null) { + amqpMessage.setDeliveryCount(brokeredMessage.getAmqpAnnotatedMessage().getHeader().getDeliveryCount()); + } + amqpMessage.setPriority(brokeredMessage.getAmqpAnnotatedMessage().getHeader().getPriority()); + if (header.getDurable() != null) { + amqpMessage.setDurable(brokeredMessage.getAmqpAnnotatedMessage().getHeader().getDurable()); + } + if (header.getFirstAcquirer() != null) { + amqpMessage.setFirstAcquirer(brokeredMessage.getAmqpAnnotatedMessage().getHeader().getFirstAcquirer()); + } + if (header.getTimeToLive() != null) { + amqpMessage.setTtl(brokeredMessage.getAmqpAnnotatedMessage().getHeader().getTimeToLive().toMillis()); + } + + final Map messageAnnotationsMap = new HashMap<>(); if (brokeredMessage.getScheduledEnqueueTime() != null) { messageAnnotationsMap.put(Symbol.valueOf(SCHEDULED_ENQUEUE_TIME_NAME), @@ -303,12 +321,13 @@ private List deserializeListOfMessages(Message amqpMe responseMessage.decode(messagePayLoad.getArray(), messagePayLoad.getArrayOffset(), messagePayLoad.getLength()); - final ServiceBusReceivedMessage receivedMessage = deserializeMessage(responseMessage); + UUID lockToken = null; // if amqp message have lockToken if (((Map) message).containsKey(ManagementConstants.LOCK_TOKEN_KEY)) { - receivedMessage.setLockToken((UUID) ((Map) message).get(ManagementConstants.LOCK_TOKEN_KEY)); + lockToken = (UUID) ((Map) message).get(ManagementConstants.LOCK_TOKEN_KEY); } + final ServiceBusReceivedMessage receivedMessage = deserializeMessage(responseMessage, lockToken); messageList.add(receivedMessage); } @@ -317,7 +336,13 @@ private List deserializeListOfMessages(Message amqpMe } private ServiceBusReceivedMessage deserializeMessage(Message amqpMessage) { - final ServiceBusReceivedMessage brokeredMessage; + return EntityHelper.toModel(amqpMessage, null); + } + + private ServiceBusReceivedMessage deserializeMessage(Message amqpMessage, UUID lockToken) { + return EntityHelper.toModel(amqpMessage, lockToken); + } +/* final ServiceBusReceivedMessage brokeredMessage; final Section body = amqpMessage.getBody(); if (body != null) { //TODO (conniey): Support other AMQP types like AmqpValue and AmqpSequence. @@ -424,7 +449,7 @@ private ServiceBusReceivedMessage deserializeMessage(Message amqpMessage) { } return brokeredMessage; - } + }*/ private static int getPayloadSize(Message msg) { if (msg == null || msg.getBody() == null) { diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClient.java index fe6941ba7275..04271aaef389 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClient.java @@ -17,12 +17,15 @@ import com.azure.messaging.servicebus.ServiceBusClientBuilder.ServiceBusSessionReceiverClientBuilder; import com.azure.messaging.servicebus.administration.models.DeadLetterOptions; import com.azure.messaging.servicebus.implementation.DispositionStatus; +import com.azure.messaging.servicebus.implementation.EntityHelper; import com.azure.messaging.servicebus.implementation.LockContainer; import com.azure.messaging.servicebus.implementation.MessagingEntityType; import com.azure.messaging.servicebus.implementation.ServiceBusConnectionProcessor; import com.azure.messaging.servicebus.implementation.ServiceBusReceiveLink; import com.azure.messaging.servicebus.implementation.ServiceBusReceiveLinkProcessor; import com.azure.messaging.servicebus.models.ReceiveMode; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import reactor.core.publisher.BaseSubscriber; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -891,9 +894,7 @@ public Flux peekMessages(int maxMessages, String sess // the same sequence number. final Mono handle = messages .switchIfEmpty(Mono.fromCallable(() -> { - ServiceBusReceivedMessage emptyMessage = new ServiceBusReceivedMessage(new byte[0]); - emptyMessage.setSequenceNumber(lastPeekedSequenceNumber.get()); - return emptyMessage; + return EntityHelper.toModel(new byte[0], lastPeekedSequenceNumber.get()); })) .last() .handle((last, sink) -> { @@ -964,7 +965,8 @@ public Flux receiveMessages() { if (unnamedSessionManager != null) { return unnamedSessionManager.receive(); } else { - return getOrCreateConsumer().receive().map(ServiceBusReceivedMessageContext::new); + return getOrCreateConsumer().receive() + .map(message -> EntityHelper.toModel(message, null, null)); } } @@ -1001,7 +1003,7 @@ sessionId, getLinkName(sessionId), Collections.singleton(sequenceNumber)).last() return receivedMessage; } if (receiverOptions.getReceiveMode() == ReceiveMode.PEEK_LOCK) { - receivedMessage.setLockedUntil(managementNodeLocks.addOrUpdate(receivedMessage.getLockToken(), + EntityHelper.setLockedUntil(receivedMessage, managementNodeLocks.addOrUpdate(receivedMessage.getLockToken(), receivedMessage.getLockedUntil().toInstant(), receivedMessage.getLockedUntil()).atOffset(ZoneOffset.UTC)); } @@ -1047,7 +1049,7 @@ sessionId, getLinkName(sessionId), sequenceNumbers)) return receivedMessage; } if (receiverOptions.getReceiveMode() == ReceiveMode.PEEK_LOCK) { - receivedMessage.setLockedUntil(managementNodeLocks.addOrUpdate(receivedMessage.getLockToken(), + EntityHelper.setLockedUntil(receivedMessage, managementNodeLocks.addOrUpdate(receivedMessage.getLockToken(), receivedMessage.getLockedUntil().toInstant(), receivedMessage.getLockedUntil()).atOffset(ZoneOffset.UTC)); } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverClient.java index 87bba9fb8eb6..3f57dd54f75f 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverClient.java @@ -9,6 +9,8 @@ import com.azure.messaging.servicebus.ServiceBusClientBuilder.ServiceBusReceiverClientBuilder; import com.azure.messaging.servicebus.administration.models.DeadLetterOptions; import com.azure.messaging.servicebus.models.ReceiveMode; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import reactor.core.publisher.Flux; import reactor.core.publisher.FluxSink; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java index c4fde770c3fc..c134195bcf80 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java @@ -20,6 +20,8 @@ import com.azure.messaging.servicebus.implementation.MessagingEntityType; import com.azure.messaging.servicebus.implementation.ServiceBusConnectionProcessor; import com.azure.messaging.servicebus.models.CreateBatchOptions; +import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import org.apache.qpid.proton.amqp.Binary; import org.apache.qpid.proton.amqp.messaging.MessageAnnotations; import org.apache.qpid.proton.amqp.transaction.TransactionalState; @@ -427,7 +429,7 @@ private Mono sendIterable(Iterable messages, ServiceBus } private Mono scheduleMessageInternal(ServiceBusMessage message, OffsetDateTime scheduledEnqueueTime, - ServiceBusTransactionContext transactionContext) { + ServiceBusTransactionContext transactionContext) { if (Objects.isNull(message)) { return monoError(logger, new NullPointerException("'message' cannot be null.")); } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderClient.java index ea978360464b..51903769036b 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderClient.java @@ -6,6 +6,8 @@ import com.azure.core.amqp.exception.AmqpException; import com.azure.core.annotation.ServiceClient; import com.azure.messaging.servicebus.models.CreateBatchOptions; +import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import java.time.Duration; import java.time.OffsetDateTime; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/SynchronousMessageSubscriber.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/SynchronousMessageSubscriber.java index e296fb35b60a..bbaee1389ea6 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/SynchronousMessageSubscriber.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/SynchronousMessageSubscriber.java @@ -4,6 +4,7 @@ package com.azure.messaging.servicebus; import com.azure.core.util.logging.ClientLogger; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import org.reactivestreams.Subscription; import reactor.core.Disposable; import reactor.core.publisher.BaseSubscriber; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/SynchronousReceiveWork.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/SynchronousReceiveWork.java index afb2c04ca963..7042765d5d2a 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/SynchronousReceiveWork.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/SynchronousReceiveWork.java @@ -4,6 +4,7 @@ package com.azure.messaging.servicebus; import com.azure.core.util.logging.ClientLogger; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import reactor.core.Disposable; import reactor.core.publisher.DirectProcessor; import reactor.core.publisher.Flux; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/UnnamedSessionManager.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/UnnamedSessionManager.java index 38a29130650a..4d391b4ace0f 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/UnnamedSessionManager.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/UnnamedSessionManager.java @@ -17,6 +17,7 @@ import com.azure.messaging.servicebus.implementation.ServiceBusConnectionProcessor; import com.azure.messaging.servicebus.implementation.ServiceBusManagementNode; import com.azure.messaging.servicebus.implementation.ServiceBusReceiveLink; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import org.apache.qpid.proton.amqp.transport.DeliveryState; import reactor.core.publisher.EmitterProcessor; import reactor.core.publisher.Flux; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/UnnamedSessionReceiver.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/UnnamedSessionReceiver.java index cdd095b0b835..1da872967631 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/UnnamedSessionReceiver.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/UnnamedSessionReceiver.java @@ -6,9 +6,12 @@ import com.azure.core.amqp.implementation.MessageSerializer; import com.azure.core.util.CoreUtils; import com.azure.core.util.logging.ClientLogger; +import com.azure.messaging.servicebus.implementation.EntityHelper; import com.azure.messaging.servicebus.implementation.LockContainer; import com.azure.messaging.servicebus.implementation.ServiceBusConstants; import com.azure.messaging.servicebus.implementation.ServiceBusReceiveLink; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import org.apache.qpid.proton.amqp.transport.DeliveryState; import reactor.core.Disposable; import reactor.core.Disposables; @@ -85,11 +88,12 @@ class UnnamedSessionReceiver implements AutoCloseable { deserialized.getSessionId(), deserialized.getMessageId()); } - return new ServiceBusReceivedMessageContext(deserialized); + return EntityHelper.toModel(deserialized, null, null); }) .onErrorResume(error -> { logger.warning("sessionId[{}]. Error occurred. Ending session.", sessionId, error); - return Mono.just(new ServiceBusReceivedMessageContext(getSessionId(), error)); + ; + return Mono.just(EntityHelper.toModel(null, getSessionId(), error)); }) .doOnNext(context -> { if (context.hasError()) { diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CorrelationRuleFilter.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CorrelationRuleFilter.java index da66d912e9ad..8fd6cc39e17b 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CorrelationRuleFilter.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CorrelationRuleFilter.java @@ -5,7 +5,7 @@ import com.azure.core.annotation.Fluent; import com.azure.core.util.logging.ClientLogger; -import com.azure.messaging.servicebus.ServiceBusMessage; +import com.azure.messaging.servicebus.models.ServiceBusMessage; import java.util.HashMap; import java.util.Map; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/RuleFilter.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/RuleFilter.java index a5158119f7cd..3797858f4423 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/RuleFilter.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/RuleFilter.java @@ -3,7 +3,7 @@ package com.azure.messaging.servicebus.administration.models; -import com.azure.messaging.servicebus.ServiceBusMessage; +import com.azure.messaging.servicebus.models.ServiceBusMessage; /** * Describes a filter expression that is evaluated against a {@link ServiceBusMessage}. Filter is an abstract class with diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleAction.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleAction.java index ecfe30598dab..c306d5290903 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleAction.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleAction.java @@ -4,7 +4,7 @@ package com.azure.messaging.servicebus.administration.models; import com.azure.core.util.logging.ClientLogger; -import com.azure.messaging.servicebus.ServiceBusMessage; +import com.azure.messaging.servicebus.models.ServiceBusMessage; import java.util.HashMap; import java.util.Map; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleFilter.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleFilter.java index 32630779325c..c1c05affacf1 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleFilter.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleFilter.java @@ -4,7 +4,7 @@ package com.azure.messaging.servicebus.administration.models; import com.azure.core.util.logging.ClientLogger; -import com.azure.messaging.servicebus.ServiceBusMessage; +import com.azure.messaging.servicebus.models.ServiceBusMessage; import java.util.HashMap; import java.util.Map; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/EntityHelper.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/EntityHelper.java index f92bc31b5169..c38cea9eccc2 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/EntityHelper.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/EntityHelper.java @@ -19,8 +19,13 @@ import com.azure.messaging.servicebus.implementation.models.RuleFilterImpl; import com.azure.messaging.servicebus.implementation.models.SubscriptionDescription; import com.azure.messaging.servicebus.implementation.models.TopicDescription; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; +import org.apache.qpid.proton.message.Message; +import java.time.OffsetDateTime; import java.util.Objects; +import java.util.UUID; /** * Used to access internal methods on {@link QueueProperties}. @@ -30,6 +35,8 @@ public final class EntityHelper { private static SubscriptionAccessor subscriptionAccessor; private static TopicAccessor topicAccessor; private static RuleAccessor ruleAccessor; + private static ServiceBusReceivedMessageAccessor receivedMessageAccessor; + private static ServiceBusReceivedMessageContextAccessor messageContextAccessor; static { try { @@ -38,6 +45,10 @@ public final class EntityHelper { SubscriptionProperties.class.getClassLoader()); Class.forName(TopicProperties.class.getName(), true, TopicProperties.class.getClassLoader()); Class.forName(RuleProperties.class.getName(), true, RuleProperties.class.getClassLoader()); + Class.forName(ServiceBusReceivedMessage.class.getName(), true, + ServiceBusReceivedMessage.class.getClassLoader()); + Class.forName(ServiceBusReceivedMessageContext.class.getName(), true, + ServiceBusReceivedMessageContext.class.getClassLoader()); } catch (ClassNotFoundException e) { throw new ClientLogger(EntityHelper.class).logExceptionAsError(new IllegalStateException(e)); } @@ -312,6 +323,68 @@ public static TopicProperties toModel(TopicDescription description) { return topicAccessor.toModel(description); } + /** + * Creates a new {@link ServiceBusReceivedMessage} given the options. + * + * @param amqpMessage to create {@link ServiceBusReceivedMessage} with. + * + * @return A new {@link ServiceBusReceivedMessage} with the set options. + */ + public static ServiceBusReceivedMessage toModel(Message amqpMessage, UUID lockToken) { + Objects.requireNonNull(amqpMessage, "'amqpMessage' cannot be null."); + + if (receivedMessageAccessor == null) { + throw new ClientLogger(EntityHelper.class).logExceptionAsError( + new IllegalStateException("'topicAccessor' should not be null.")); + } + + return receivedMessageAccessor.toModel(amqpMessage, lockToken); + } + + /** + * Creates a new {@link ServiceBusReceivedMessage} given the options. + * + * @param message to create {@link ServiceBusReceivedMessage} with. + * + * @return A new {@link ServiceBusReceivedMessage} with the set options. + */ + public static ServiceBusReceivedMessageContext toModel(ServiceBusReceivedMessage message, String sessionId, Throwable error) { + + if (messageContextAccessor == null) { + throw new ClientLogger(EntityHelper.class).logExceptionAsError( + new IllegalStateException("'topicAccessor' should not be null.")); + } + + return messageContextAccessor.toModel(message, sessionId, error); + } + + /** + * Creates a new {@link ServiceBusReceivedMessage} given the options. + * + * @param data to create {@link ServiceBusReceivedMessage} with. + * + * @return A new {@link ServiceBusReceivedMessage} with the set options. + */ + public static ServiceBusReceivedMessage toModel(byte[] data, long sequenceNumber) { + + if (receivedMessageAccessor == null) { + throw new ClientLogger(EntityHelper.class).logExceptionAsError( + new IllegalStateException("'topicAccessor' should not be null.")); + } + + return receivedMessageAccessor.toModel(data, sequenceNumber); + } + + public static void setLockedUntil(ServiceBusReceivedMessage message, + OffsetDateTime lockedUntil) { + + if (receivedMessageAccessor == null) { + throw new ClientLogger(EntityHelper.class).logExceptionAsError( + new IllegalStateException("'topicAccessor' should not be null.")); + } + + receivedMessageAccessor.setLockedUntil(message, lockedUntil); + } /** * Sets the queue accessor. * @@ -406,6 +479,38 @@ public static void setTopicAccessor(TopicAccessor accessor) { EntityHelper.topicAccessor = accessor; } + /** + * Sets the ServiceBusReceivedMessage accessor. + * + * @param accessor The ServiceBusReceivedMessage accessor to set. + */ + public static void setServiceBusReceivedMessageContextAccessor(ServiceBusReceivedMessageContextAccessor accessor) { + Objects.requireNonNull(accessor, "'accessor' cannot be null."); + + if (EntityHelper.messageContextAccessor != null) { + throw new ClientLogger(EntityHelper.class).logExceptionAsError(new IllegalStateException( + "'receivedMessageAccessor' is already set.")); + } + + EntityHelper.messageContextAccessor = accessor; + } + + + /** + * Sets the ServiceBusReceivedMessage accessor. + * + * @param accessor The ServiceBusReceivedMessage accessor to set. + */ + public static void setServiceBusReceivedMessageAccessor(ServiceBusReceivedMessageAccessor accessor) { + Objects.requireNonNull(accessor, "'accessor' cannot be null."); + + if (EntityHelper.receivedMessageAccessor != null) { + throw new ClientLogger(EntityHelper.class).logExceptionAsError(new IllegalStateException( + "'receivedMessageAccessor' is already set.")); + } + + EntityHelper.receivedMessageAccessor = accessor; + } /** * Sets the topic name on a {@link SubscriptionProperties}. * @@ -553,4 +658,46 @@ public interface TopicAccessor { */ void setName(TopicProperties topicProperties, String name); } + + /** + * Interface for accessing methods on a ServiceBusReceivedMessage. + */ + public interface ServiceBusReceivedMessageAccessor { + /** + * Sets properties on the ServiceBusReceivedMessage based on the TODO. + * + * @param amqpMessage The implementation topic. + * + * @return A new {@link ServiceBusReceivedMessage} with the properties set. + */ + ServiceBusReceivedMessage toModel(Message amqpMessage, UUID lockToken); + + /** + * + * @param data + * @param sequenceNumber + * @return + */ + ServiceBusReceivedMessage toModel(byte[] data, long sequenceNumber); + + /** + * + * @param lockedUntil + */ + void setLockedUntil(ServiceBusReceivedMessage message, OffsetDateTime lockedUntil); + } + + /** + * Interface for accessing methods on a ServiceBusReceivedMessage. + */ + public interface ServiceBusReceivedMessageContextAccessor { + /** + * Sets properties on the ServiceBusReceivedMessage based on the TODO. + * + * @param message The {@link ServiceBusReceivedMessage} message. + * + * @return A new {@link ServiceBusReceivedMessage} with the properties set. + */ + ServiceBusReceivedMessageContext toModel(ServiceBusReceivedMessage message, String sessionId, Throwable error); + } } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/ManagementChannel.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/ManagementChannel.java index a190f6ac64f4..5d6900ee84f1 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/ManagementChannel.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/ManagementChannel.java @@ -14,8 +14,8 @@ import com.azure.core.amqp.implementation.TokenManager; import com.azure.core.util.CoreUtils; import com.azure.core.util.logging.ClientLogger; -import com.azure.messaging.servicebus.ServiceBusMessage; -import com.azure.messaging.servicebus.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import com.azure.messaging.servicebus.ServiceBusTransactionContext; import com.azure.messaging.servicebus.models.ReceiveMode; import org.apache.qpid.proton.Proton; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/MessageManagementOperations.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/MessageManagementOperations.java index 28f355b2689b..bbbc003532bb 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/MessageManagementOperations.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/MessageManagementOperations.java @@ -2,7 +2,7 @@ // Licensed under the MIT License. package com.azure.messaging.servicebus.implementation; -import com.azure.messaging.servicebus.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import com.azure.messaging.servicebus.models.ReceiveMode; import org.apache.qpid.proton.amqp.transport.DeliveryState; import reactor.core.publisher.Mono; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/ServiceBusManagementNode.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/ServiceBusManagementNode.java index 2e9013600bd9..8b058b60820f 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/ServiceBusManagementNode.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/ServiceBusManagementNode.java @@ -3,8 +3,8 @@ package com.azure.messaging.servicebus.implementation; -import com.azure.messaging.servicebus.ServiceBusMessage; -import com.azure.messaging.servicebus.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import com.azure.messaging.servicebus.ServiceBusTransactionContext; import com.azure.messaging.servicebus.models.ReceiveMode; import reactor.core.publisher.Flux; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/models/ServiceBusMessage.java similarity index 91% rename from sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java rename to sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/models/ServiceBusMessage.java index e6d596adb32d..ec7f6f2e61fe 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/models/ServiceBusMessage.java @@ -1,19 +1,22 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.messaging.servicebus; +package com.azure.messaging.servicebus.models; import com.azure.core.amqp.models.AmqpAnnotatedMessage; import com.azure.core.amqp.models.AmqpDataBody; import com.azure.core.amqp.models.BinaryData; import com.azure.core.util.Context; +import com.azure.messaging.servicebus.ServiceBusMessageBatch; import java.nio.charset.StandardCharsets; import java.time.Duration; import java.time.OffsetDateTime; +import java.time.ZoneOffset; import java.util.Arrays; import java.util.Collections; +import java.util.Date; import java.util.List; import java.util.Map; import java.util.Objects; @@ -41,22 +44,9 @@ */ public class ServiceBusMessage { private static final String SCHEDULED_ENQUEUE_TIME_NAME = "x-opt-scheduled-enqueue-time"; + private static final String VIA_PARTITION_KEY_NAME = "x-opt-via-partition-key"; private Context context; private final AmqpAnnotatedMessage amqpAnnotatedMessage; - /*private final Map applicationProperties = new HashMap<>(); - - private String contentType; - private String correlationId; - private String label; - private String messageId; - private String partitionKey; - private String replyTo; - private String replyToSessionId; - private OffsetDateTime scheduledEnqueueTime; - private String sessionId; - private Duration timeToLive; - private String to; - private String viaPartitionKey;*/ /** * Creates a {@link ServiceBusMessage} with a {@link java.nio.charset.StandardCharsets#UTF_8 UTF_8} encoded body. @@ -77,7 +67,6 @@ public ServiceBusMessage(String body) { * @throws NullPointerException if {@code body} is {@code null}. */ public ServiceBusMessage(byte[] body) { - Objects.requireNonNull(body, "'body' cannot be null."); this.context = Context.NONE; amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList(new BinaryData(body)))); } @@ -218,12 +207,12 @@ public String getSubject() { /** * Sets the subject for the message. * - * @param label The subject to set. + * @param subject The subject to set. * * @return The updated {@link ServiceBusMessage} object. */ - public ServiceBusMessage setSubject(String label) { - amqpAnnotatedMessage.getProperties().setSubject(label); + public ServiceBusMessage setSubject(String subject) { + amqpAnnotatedMessage.getProperties().setSubject(subject); return this; } @@ -344,7 +333,7 @@ public ServiceBusMessage setTo(String to) { * @see Message Expiration */ public Duration getTimeToLive() { - return timeToLive; + return amqpAnnotatedMessage.getHeader().getTimeToLive(); } /** @@ -356,7 +345,7 @@ public Duration getTimeToLive() { * @see #getTimeToLive() */ public ServiceBusMessage setTimeToLive(Duration timeToLive) { - this.timeToLive = timeToLive; + amqpAnnotatedMessage.getHeader().setTimeToLive(timeToLive); return this; } @@ -374,7 +363,14 @@ public ServiceBusMessage setTimeToLive(Duration timeToLive) { * Timestamps */ public OffsetDateTime getScheduledEnqueueTime() { - return (OffsetDateTime)amqpAnnotatedMessage.getMessageAnnotations().get(SCHEDULED_ENQUEUE_TIME_NAME); + OffsetDateTime scheduledEnqueueTime = null; + Map messageAnnotationMap = amqpAnnotatedMessage.getMessageAnnotations(); + if (messageAnnotationMap.containsKey(SCHEDULED_ENQUEUE_TIME_NAME)) { + scheduledEnqueueTime = ((Date) messageAnnotationMap.get(SCHEDULED_ENQUEUE_TIME_NAME)).toInstant() + .atOffset(ZoneOffset.UTC) ; + } + + return scheduledEnqueueTime; } /** @@ -386,6 +382,7 @@ public OffsetDateTime getScheduledEnqueueTime() { * @see #getScheduledEnqueueTime() */ public ServiceBusMessage setScheduledEnqueueTime(OffsetDateTime scheduledEnqueueTime) { + Objects.requireNonNull(scheduledEnqueueTime, "'scheduledEnqueueTime' cannot be null."); amqpAnnotatedMessage.getMessageAnnotations().put(SCHEDULED_ENQUEUE_TIME_NAME, scheduledEnqueueTime); return this; } @@ -401,7 +398,7 @@ public ServiceBusMessage setScheduledEnqueueTime(OffsetDateTime scheduledEnqueue * Routing and Correlation */ public String getReplyToSessionId() { - return (OffsetDateTime)amqpAnnotatedMessage.getMessageAnnotations().get(SCHEDULED_ENQUEUE_TIME_NAME); + return amqpAnnotatedMessage.getProperties().getReplyToGroupId(); } /** @@ -412,7 +409,7 @@ public String getReplyToSessionId() { * @return The updated {@link ServiceBusMessage}. */ public ServiceBusMessage setReplyToSessionId(String replyToSessionId) { - this.replyToSessionId = replyToSessionId; + amqpAnnotatedMessage.getProperties().setReplyToGroupId(replyToSessionId); return this; } @@ -428,7 +425,7 @@ public ServiceBusMessage setReplyToSessionId(String replyToSessionId) { * and Send Via */ public String getViaPartitionKey() { - return viaPartitionKey; + return (String)amqpAnnotatedMessage.getMessageAnnotations().get(VIA_PARTITION_KEY_NAME); } /** @@ -440,7 +437,7 @@ public String getViaPartitionKey() { * @see #getViaPartitionKey() */ public ServiceBusMessage setViaPartitionKey(String viaPartitionKey) { - this.viaPartitionKey = viaPartitionKey; + amqpAnnotatedMessage.getMessageAnnotations().put(VIA_PARTITION_KEY_NAME, viaPartitionKey); return this; } @@ -450,7 +447,7 @@ public ServiceBusMessage setViaPartitionKey(String viaPartitionKey) { * @return Session Id of the {@link ServiceBusMessage}. */ public String getSessionId() { - return sessionId; + return amqpAnnotatedMessage.getProperties().getGroupId(); } /** @@ -461,7 +458,7 @@ public String getSessionId() { * @return The updated {@link ServiceBusMessage}. */ public ServiceBusMessage setSessionId(String sessionId) { - this.sessionId = sessionId; + amqpAnnotatedMessage.getProperties().setGroupId(sessionId); return this; } @@ -471,7 +468,7 @@ public ServiceBusMessage setSessionId(String sessionId) { * * @return the {@link Context} object set on the {@link ServiceBusMessage}. */ - Context getContext() { + public Context getContext() { return context; } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/models/ServiceBusReceivedMessage.java similarity index 52% rename from sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java rename to sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/models/ServiceBusReceivedMessage.java index 012e33094758..72e1acecd783 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/models/ServiceBusReceivedMessage.java @@ -1,52 +1,86 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.messaging.servicebus; +package com.azure.messaging.servicebus.models; import com.azure.core.amqp.models.AmqpAnnotatedMessage; -import com.azure.messaging.servicebus.models.ReceiveMode; +import com.azure.core.amqp.models.AmqpDataBody; +import com.azure.core.amqp.models.AmqpMessageHeader; +import com.azure.core.amqp.models.AmqpMessageProperties; +import com.azure.core.amqp.models.BinaryData; +import com.azure.core.util.logging.ClientLogger; +import com.azure.messaging.servicebus.implementation.EntityHelper; +import com.azure.messaging.servicebus.implementation.MessageWithLockToken; +import com.azure.messaging.servicebus.implementation.Messages; +import org.apache.qpid.proton.amqp.Binary; +import org.apache.qpid.proton.amqp.Symbol; +import org.apache.qpid.proton.amqp.messaging.ApplicationProperties; +import org.apache.qpid.proton.amqp.messaging.Data; +import org.apache.qpid.proton.amqp.messaging.DeliveryAnnotations; +import org.apache.qpid.proton.amqp.messaging.Footer; +import org.apache.qpid.proton.amqp.messaging.MessageAnnotations; +import org.apache.qpid.proton.amqp.messaging.Properties; +import org.apache.qpid.proton.amqp.messaging.Section; +import org.apache.qpid.proton.message.Message; import java.time.Duration; import java.time.OffsetDateTime; +import java.time.ZoneOffset; import java.util.Arrays; -import java.util.HashMap; +import java.util.Collections; +import java.util.Date; +import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.UUID; +import java.util.stream.Collectors; /** * This class represents a received message from Service Bus. */ public final class ServiceBusReceivedMessage { + private static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; + private static final String ENQUEUED_TIME_UTC_NAME = "x-opt-enqueued-time"; + private static final String SEQUENCE_NUMBER_NAME = "x-opt-sequence-number"; + private static final String LOCKED_UNTIL_NAME = "x-opt-locked-until"; + private static final String DEAD_LETTER_SOURCE_NAME = "x-opt-deadletter-source"; + private static final String DEAD_LETTER_DESCRIPTION = "DeadLetterErrorDescription"; + private static final String DEAD_LETTER_REASON = "DeadLetterReason"; + private static final String PARTITION_KEY_NAME = "x-opt-partition-key"; + private static final String VIA_PARTITION_KEY_NAME = "x-opt-via-partition-key"; + private static final String SCHEDULED_ENQUEUE_TIME_NAME = "x-opt-scheduled-enqueue-time"; + + // This one appears to always be 0, but is always returned with each message. + private static final String ENQUEUED_SEQUENCE_NUMBER = "x-opt-enqueue-sequence-number"; + private static final ClientLogger logger = new ClientLogger(ServiceBusReceivedMessage.class); + private AmqpAnnotatedMessage amqpAnnotatedMessage; private UUID lockToken; - private long sequenceNumber; - private long enqueuedSequenceNumber; - private long deliveryCount; - private OffsetDateTime enqueuedTime; - private OffsetDateTime lockedUntil; - private String deadLetterSource; - - private final Map properties; - private final byte[] body; - private String contentType; - private String correlationId; - private String label; - private String messageId; - private String partitionKey; - private String replyTo; - private String replyToSessionId; - private OffsetDateTime scheduledEnqueueTime; - private String sessionId; - private Duration timeToLive; - private String to; - private String viaPartitionKey; - private String deadLetterReason; - private String deadLetterErrorDescription; - ServiceBusReceivedMessage(byte[] body) { - this.body = Objects.requireNonNull(body, "'body' cannot be null."); - this.properties = new HashMap<>(); + static { + // This is used by classes in different packages to get access to private and package-private methods. + EntityHelper.setServiceBusReceivedMessageAccessor(new EntityHelper.ServiceBusReceivedMessageAccessor() { + + @Override + public ServiceBusReceivedMessage toModel(Message amqpMessage, UUID lockToken) { + ServiceBusReceivedMessage brokeredMessage = new ServiceBusReceivedMessage(amqpMessage); + if (lockToken != null) { + brokeredMessage.setLockToken(lockToken); + } + return brokeredMessage; + } + + @Override + public ServiceBusReceivedMessage toModel(byte[] data, long sequenceNumber) { + ServiceBusReceivedMessage brokeredMessage = new ServiceBusReceivedMessage(data); + brokeredMessage.setSequenceNumber(sequenceNumber); + return brokeredMessage; + } + + @Override + public void setLockedUntil(ServiceBusReceivedMessage message, OffsetDateTime lockedUntil) { + message.setLockedUntil(lockedUntil); + } + }); } /** @@ -57,19 +91,140 @@ public AmqpAnnotatedMessage getAmqpAnnotatedMessage() { return amqpAnnotatedMessage; } + ServiceBusReceivedMessage(byte[] body) { + amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList(new BinaryData(body)))); + } + + ServiceBusReceivedMessage(Message amqpMessage) { + + //final ServiceBusReceivedMessage brokeredMessage; + byte[] bytes = null; + final Section body = amqpMessage.getBody(); + if (body != null) { + //TODO (conniey): Support other AMQP types like AmqpValue and AmqpSequence. + if (body instanceof Data) { + final Binary messageData = ((Data) body).getValue(); + bytes = messageData.getArray(); + //brokeredMessage = new ServiceBusReceivedMessage(bytes); + } else { + logger.warning(String.format(Messages.MESSAGE_NOT_OF_TYPE, body.getType())); + bytes = EMPTY_BYTE_ARRAY; + //brokeredMessage = new ServiceBusReceivedMessage(EMPTY_BYTE_ARRAY); + } + } else { + logger.warning(String.format(Messages.MESSAGE_NOT_OF_TYPE, "null")); + bytes = EMPTY_BYTE_ARRAY; + //brokeredMessage = new ServiceBusReceivedMessage(EMPTY_BYTE_ARRAY); + } + amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList(new BinaryData(bytes)))); + + // Application properties + ApplicationProperties applicationProperties = amqpMessage.getApplicationProperties(); + if (applicationProperties != null) { + final Map propertiesValue = applicationProperties.getValue(); + amqpAnnotatedMessage.getApplicationProperties().putAll(propertiesValue); + } + + // Header + final AmqpMessageHeader header = amqpAnnotatedMessage.getHeader(); + header.setTimeToLive(Duration.ofMillis(amqpMessage.getTtl())); + header.setDeliveryCount(amqpMessage.getDeliveryCount()); + header.setDurable(amqpMessage.getHeader().getDurable()); + header.setFirstAcquirer(amqpMessage.getHeader().getFirstAcquirer()); + header.setPriority(amqpMessage.getPriority()); + + // Footer + final Footer footer = amqpMessage.getFooter(); + if (footer != null && footer.getValue() != null) { + final Map footerValue = footer.getValue(); + amqpAnnotatedMessage.getFooter().putAll(footerValue); + + } + + // Properties + final AmqpMessageProperties properties = amqpAnnotatedMessage.getProperties(); + properties.setReplyToGroupId(amqpMessage.getReplyToGroupId()); + properties.setReplyTo(amqpMessage.getReplyTo()); + final Object messageId = amqpMessage.getMessageId(); + if (messageId != null) { + properties.setMessageId(messageId.toString()); + } + + properties.setContentType(amqpMessage.getContentType()); + final Object correlationId = amqpMessage.getCorrelationId(); + if (correlationId != null) { + properties.setCorrelationId(correlationId.toString()); + } + + final Properties amqpProperties = amqpMessage.getProperties(); + if (amqpProperties != null) { + properties.setTo(amqpProperties.getTo()); + } + + properties.setSubject(amqpMessage.getSubject()); + properties.setReplyTo(amqpMessage.getReplyTo()); + properties.setReplyToGroupId(amqpMessage.getReplyToGroupId()); + properties.setGroupId(amqpMessage.getGroupId()); + properties.setContentEncoding(amqpMessage.getContentEncoding()); + properties.setGroupSequence(amqpMessage.getGroupSequence()); + properties.setUserId(amqpMessage.getUserId()); + + // DeliveryAnnotations + final DeliveryAnnotations deliveryAnnotations = amqpMessage.getDeliveryAnnotations(); + if (deliveryAnnotations != null && deliveryAnnotations.getValue() != null) { + final Map deliveryAnnotationMap = deliveryAnnotations.getValue(); + if (deliveryAnnotationMap != null) { + for (Map.Entry entry : deliveryAnnotationMap.entrySet()) { + final String key = entry.getKey().toString(); + final Object value = entry.getValue(); + amqpAnnotatedMessage.getDeliveryAnnotations().put(key, value); + } + } + } + + // Message Annotations + final MessageAnnotations messageAnnotations = amqpMessage.getMessageAnnotations(); + if (messageAnnotations != null) { + Map messageAnnotationsMap = messageAnnotations.getValue(); + if (messageAnnotationsMap != null) { + for (Map.Entry entry : messageAnnotationsMap.entrySet()) { + final String key = entry.getKey().toString(); + final Object value = entry.getValue(); + amqpAnnotatedMessage.getMessageAnnotations().put(key, value); + } + } + } + + if (amqpMessage instanceof MessageWithLockToken) { + this.lockToken = ((MessageWithLockToken) amqpMessage).getLockToken(); + } + } + /** * Gets the actual payload/data wrapped by the {@link ServiceBusReceivedMessage}. * *

* If the means for deserializing the raw data is not apparent to consumers, a common technique is to make use of - * {@link #getProperties()} when creating the event, to associate serialization hints as an aid to consumers who - * wish to deserialize the binary data. + * {@link #getApplicationProperties()} ()} when creating the event, to associate serialization hints as an aid to + * consumers who wish to deserialize the binary data. *

* * @return A byte array representing the data. */ public byte[] getBody() { - return Arrays.copyOf(body, body.length); + byte[] body = null; + switch(amqpAnnotatedMessage.getBody().getBodyType()) { + case DATA: + List binaryData = ((AmqpDataBody)amqpAnnotatedMessage.getBody()).getData().stream() + .collect(Collectors.toList()); + if (binaryData != null && binaryData.size() > 0) { + byte[] firstData = binaryData.get(0).getData(); + body = Arrays.copyOf(firstData, firstData.length); + } + break; + default: + } + return body; } /** @@ -78,7 +233,7 @@ public byte[] getBody() { * @return the contentType of the {@link ServiceBusReceivedMessage}. */ public String getContentType() { - return contentType; + return amqpAnnotatedMessage.getProperties().getContentType(); } /** @@ -94,7 +249,7 @@ public String getContentType() { * Routing and Correlation */ public String getCorrelationId() { - return correlationId; + return amqpAnnotatedMessage.getProperties().getCorrelationId(); } /** @@ -103,7 +258,12 @@ public String getCorrelationId() { * @return The description for a message that has been dead-lettered. */ public String getDeadLetterErrorDescription() { - return deadLetterErrorDescription; + + final Map properties = amqpAnnotatedMessage.getApplicationProperties(); + if (properties.containsKey(DEAD_LETTER_DESCRIPTION)) { + return String.valueOf(properties.get(DEAD_LETTER_DESCRIPTION)); + } + return null; } /** @@ -112,7 +272,11 @@ public String getDeadLetterErrorDescription() { * @return The reason for a message that has been dead-lettered. */ public String getDeadLetterReason() { - return deadLetterReason; + final Map properties = amqpAnnotatedMessage.getApplicationProperties(); + if (properties.containsKey(DEAD_LETTER_REASON)) { + return String.valueOf(properties.get(DEAD_LETTER_REASON)); + } + return null; } /** @@ -129,7 +293,11 @@ public String getDeadLetterReason() { * queues */ public String getDeadLetterSource() { - return deadLetterSource; + final Map properties = amqpAnnotatedMessage.getApplicationProperties(); + if (properties.containsKey(DEAD_LETTER_SOURCE_NAME)) { + return String.valueOf(properties.get(DEAD_LETTER_SOURCE_NAME)); + } + return null; } /** @@ -144,7 +312,7 @@ public String getDeadLetterSource() { * transfers, locks, and settlement. */ public long getDeliveryCount() { - return deliveryCount; + return amqpAnnotatedMessage.getHeader().getDeliveryCount(); } /** @@ -159,7 +327,15 @@ public long getDeliveryCount() { * Timestamps */ public long getEnqueuedSequenceNumber() { - return this.enqueuedSequenceNumber; + long enqueuedSequenceNumber = 0; + + final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); + if (messageAnnotations.containsKey(ENQUEUED_SEQUENCE_NUMBER)) { + Object value = messageAnnotations.get(ENQUEUED_SEQUENCE_NUMBER); + enqueuedSequenceNumber = (long) value; + } + + return enqueuedSequenceNumber; } /** @@ -175,6 +351,13 @@ public long getEnqueuedSequenceNumber() { * Timestamps */ public OffsetDateTime getEnqueuedTime() { + OffsetDateTime enqueuedTime = null; + final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); + if (messageAnnotations.containsKey(ENQUEUED_TIME_UTC_NAME)) { + Object value = messageAnnotations.get(ENQUEUED_TIME_UTC_NAME); + enqueuedTime = ((Date) value).toInstant().atOffset(ZoneOffset.UTC); + } + return enqueuedTime; } @@ -192,6 +375,7 @@ public OffsetDateTime getEnqueuedTime() { */ public OffsetDateTime getExpiresAt() { final Duration timeToLive = getTimeToLive(); + final OffsetDateTime enqueuedTime = getEnqueuedTime(); return enqueuedTime != null && timeToLive != null ? enqueuedTime.plus(timeToLive) : null; @@ -203,7 +387,7 @@ public OffsetDateTime getExpiresAt() { * @return The label for the message. */ public String getLabel() { - return label; + return amqpAnnotatedMessage.getProperties().getSubject(); } /** @@ -242,6 +426,13 @@ public String getLockToken() { * transfers, locks, and settlement */ public OffsetDateTime getLockedUntil() { + OffsetDateTime lockedUntil = null; + final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); + if (messageAnnotations.containsKey(LOCKED_UNTIL_NAME)) { + Object value = messageAnnotations.get(LOCKED_UNTIL_NAME); + lockedUntil = ((Date) value).toInstant().atOffset(ZoneOffset.UTC); + } + return lockedUntil; } @@ -249,7 +440,7 @@ public OffsetDateTime getLockedUntil() { * @return Id of the {@link ServiceBusReceivedMessage}. */ public String getMessageId() { - return messageId; + return amqpAnnotatedMessage.getProperties().getMessageId(); } /** @@ -267,6 +458,13 @@ public String getMessageId() { * entities */ public String getPartitionKey() { + String partitionKey = null; + final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); + if (messageAnnotations.containsKey(PARTITION_KEY_NAME)) { + Object value = messageAnnotations.get(PARTITION_KEY_NAME); + partitionKey = (String) value; + } + return partitionKey; } @@ -278,8 +476,8 @@ public String getPartitionKey() { * * @return Application properties associated with this {@link ServiceBusReceivedMessage}. */ - public Map getProperties() { - return properties; + public Map getApplicationProperties() { + return amqpAnnotatedMessage.getApplicationProperties(); } /** @@ -295,7 +493,7 @@ public Map getProperties() { * Routing and Correlation */ public String getReplyTo() { - return replyTo; + return amqpAnnotatedMessage.getProperties().getReplyTo(); } /** @@ -310,7 +508,7 @@ public String getReplyTo() { * Routing and Correlation */ public String getReplyToSessionId() { - return replyToSessionId; + return amqpAnnotatedMessage.getProperties().getReplyToGroupId(); } /** @@ -328,6 +526,14 @@ public String getReplyToSessionId() { * Timestamps */ public OffsetDateTime getScheduledEnqueueTime() { + + OffsetDateTime scheduledEnqueueTime = null; + final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); + if (messageAnnotations.containsKey(SCHEDULED_ENQUEUE_TIME_NAME)) { + scheduledEnqueueTime = ((Date) messageAnnotations.get(SCHEDULED_ENQUEUE_TIME_NAME)).toInstant() + .atOffset(ZoneOffset.UTC); + } + return scheduledEnqueueTime; } @@ -345,7 +551,16 @@ public OffsetDateTime getScheduledEnqueueTime() { * Timestamps */ public long getSequenceNumber() { - return this.sequenceNumber; + + long sequenceNumber = 0; + + final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); + if (messageAnnotations.containsKey(SEQUENCE_NUMBER_NAME)) { + Object value = messageAnnotations.get(SEQUENCE_NUMBER_NAME); + sequenceNumber = (long) value; + } + + return sequenceNumber; } /** @@ -354,7 +569,7 @@ public long getSequenceNumber() { * @return Session Id of the {@link ServiceBusReceivedMessage}. */ public String getSessionId() { - return sessionId; + return amqpAnnotatedMessage.getProperties().getGroupId(); } /** @@ -371,7 +586,7 @@ public String getSessionId() { * @see Message Expiration */ public Duration getTimeToLive() { - return timeToLive; + return amqpAnnotatedMessage.getHeader().getTimeToLive(); } /** @@ -380,7 +595,7 @@ public Duration getTimeToLive() { * @return "To" property value of this message */ public String getTo() { - return to; + return amqpAnnotatedMessage.getProperties().getTo(); } /** @@ -395,6 +610,13 @@ public String getTo() { * @see Transfers and Send Via */ public String getViaPartitionKey() { + String viaPartitionKey = null; + final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); + if (messageAnnotations.containsKey(VIA_PARTITION_KEY_NAME)) { + Object value = messageAnnotations.get(VIA_PARTITION_KEY_NAME); + viaPartitionKey = (String) value; + } + return viaPartitionKey; } @@ -405,36 +627,36 @@ public String getViaPartitionKey() { * * @see #getCorrelationId() */ - void setCorrelationId(String correlationId) { - this.correlationId = correlationId; - } + /*void setCorrelationId(String correlationId) { + amqpAnnotatedMessage.getProperties().setCorrelationId(correlationId); + }*/ /** * Sets the content type of the {@link ServiceBusReceivedMessage}. * * @param contentType of the message. */ - void setContentType(String contentType) { - this.contentType = contentType; - } + /*void setContentType(String contentType) { + amqpAnnotatedMessage.getProperties().setContentType(contentType); + }*/ /** * Sets the dead letter description. * * @param deadLetterErrorDescription Dead letter description. */ - void setDeadLetterErrorDescription(String deadLetterErrorDescription) { - this.deadLetterErrorDescription = deadLetterErrorDescription; - } + /*void setDeadLetterErrorDescription(String deadLetterErrorDescription) { + amqpAnnotatedMessage.getApplicationProperties().put(DEAD_LETTER_DESCRIPTION, deadLetterErrorDescription); + }/* /** * Sets the dead letter reason. * * @param deadLetterReason Dead letter reason. */ - void setDeadLetterReason(String deadLetterReason) { - this.deadLetterReason = deadLetterReason; - } + /*void setDeadLetterReason(String deadLetterReason) { + amqpAnnotatedMessage.getApplicationProperties().put(DEAD_LETTER_REASON, deadLetterReason); + }*/ /** * Sets the name of the queue or subscription that this message was enqueued on, before it was @@ -443,39 +665,39 @@ void setDeadLetterReason(String deadLetterReason) { * @param deadLetterSource the name of the queue or subscription that this message was enqueued on, * before it was deadlettered. */ - void setDeadLetterSource(String deadLetterSource) { - this.deadLetterSource = deadLetterSource; - } + /*void setDeadLetterSource(String deadLetterSource) { + amqpAnnotatedMessage.getApplicationProperties().put(DEAD_LETTER_SOURCE_NAME, deadLetterSource); + }*/ /** * Sets the number of the times this message was delivered to clients. * * @param deliveryCount the number of the times this message was delivered to clients. */ - void setDeliveryCount(long deliveryCount) { + /*void setDeliveryCount(long deliveryCount) { this.deliveryCount = deliveryCount; - } + }*/ - void setEnqueuedSequenceNumber(long enqueuedSequenceNumber) { - this.enqueuedSequenceNumber = enqueuedSequenceNumber; - } + /* void setEnqueuedSequenceNumber(long enqueuedSequenceNumber) { + amqpAnnotatedMessage.getMessageAnnotations().put(ENQUEUED_SEQUENCE_NUMBER, enqueuedSequenceNumber); + }/* /** * Sets the datetime at which this message was enqueued in Azure Service Bus. * * @param enqueuedTime the datetime at which this message was enqueued in Azure Service Bus. */ - void setEnqueuedTime(OffsetDateTime enqueuedTime) { + /*void setEnqueuedTime(OffsetDateTime enqueuedTime) { this.enqueuedTime = enqueuedTime; - } + }*/ /** - * Sets the label for the message. + * Sets the subject for the message. * - * @param label The label to set. + * @param subject The subject to set. */ - void setLabel(String label) { - this.label = label; + void setSubject(String subject) { + amqpAnnotatedMessage.getProperties().setSubject(subject); } /** @@ -493,7 +715,9 @@ void setLockToken(UUID lockToken) { * @param lockedUntil the datetime at which the lock of this message expires. */ void setLockedUntil(OffsetDateTime lockedUntil) { - this.lockedUntil = lockedUntil; + long epochMilli = lockedUntil.toInstant().toEpochMilli(); + final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); + messageAnnotations.put(LOCKED_UNTIL_NAME, new Date(epochMilli)); } /** @@ -501,9 +725,9 @@ void setLockedUntil(OffsetDateTime lockedUntil) { * * @param messageId to be set. */ - void setMessageId(String messageId) { - this.messageId = messageId; - } + /*void setMessageId(String messageId) { + amqpAnnotatedMessage.getProperties().setMessageId(messageId); + }*/ /** * Sets a partition key for sending a message to a partitioned entity @@ -512,9 +736,9 @@ void setMessageId(String messageId) { * * @see #getPartitionKey() */ - void setPartitionKey(String partitionKey) { - this.partitionKey = partitionKey; - } + /*void setPartitionKey(String partitionKey) { + amqpAnnotatedMessage.getMessageAnnotations().put(PARTITION_KEY_NAME, partitionKey); + }*/ /** * Sets the scheduled enqueue time of this message. @@ -523,9 +747,9 @@ void setPartitionKey(String partitionKey) { * * @see #getScheduledEnqueueTime() */ - void setScheduledEnqueueTime(OffsetDateTime scheduledEnqueueTime) { + /*void setScheduledEnqueueTime(OffsetDateTime scheduledEnqueueTime) { this.scheduledEnqueueTime = scheduledEnqueueTime; - } + }*/ /** * Sets the unique number assigned to a message by Service Bus. @@ -533,7 +757,7 @@ void setScheduledEnqueueTime(OffsetDateTime scheduledEnqueueTime) { * @param sequenceNumber the unique number assigned to a message by Service Bus. */ void setSequenceNumber(long sequenceNumber) { - this.sequenceNumber = sequenceNumber; + amqpAnnotatedMessage.getMessageAnnotations().put(SEQUENCE_NUMBER_NAME, sequenceNumber); } /** @@ -541,9 +765,9 @@ void setSequenceNumber(long sequenceNumber) { * * @param sessionId to be set. */ - void setSessionId(String sessionId) { - this.sessionId = sessionId; - } + /*void setSessionId(String sessionId) { + amqpAnnotatedMessage.getProperties().setGroupId(sessionId); + }*/ /** * Sets the duration of time before this message expires. @@ -552,9 +776,9 @@ void setSessionId(String sessionId) { * * @see #getTimeToLive() */ - void setTimeToLive(Duration timeToLive) { - this.timeToLive = timeToLive; - } + /*void setTimeToLive(Duration timeToLive) { + amqpAnnotatedMessage.getHeader().setTimeToLive(timeToLive); + }*/ /** * Sets the address of an entity to send replies to. @@ -563,18 +787,18 @@ void setTimeToLive(Duration timeToLive) { * * @see #getReplyTo() */ - void setReplyTo(String replyTo) { - this.replyTo = replyTo; - } + /*void setReplyTo(String replyTo) { + amqpAnnotatedMessage.getProperties().setReplyTo(replyTo); + }*/ /** * Gets or sets a session identifier augmenting the {@link #getReplyTo() ReplyTo} address. * * @param replyToSessionId ReplyToSessionId property value of this message */ - void setReplyToSessionId(String replyToSessionId) { - this.replyToSessionId = replyToSessionId; - } + /*void setReplyToSessionId(String replyToSessionId) { + amqpAnnotatedMessage.getProperties().setReplyToGroupId(replyToSessionId); + }*/ /** * Sets the "to" address. @@ -586,9 +810,9 @@ void setReplyToSessionId(String replyToSessionId) { * * @param to To property value of this message */ - void setTo(String to) { - this.to = to; - } + /*void setTo(String to) { + amqpAnnotatedMessage.getProperties().setTo(to); + }*/ /** * Sets a via-partition key for sending a message to a destination entity via another partitioned entity @@ -597,7 +821,7 @@ void setTo(String to) { * * @see #getViaPartitionKey() */ - void setViaPartitionKey(String viaPartitionKey) { - this.viaPartitionKey = viaPartitionKey; - } + /*void setViaPartitionKey(String viaPartitionKey) { + amqpAnnotatedMessage.getMessageAnnotations().put(VIA_PARTITION_KEY_NAME, viaPartitionKey); + }*/ } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageContext.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/models/ServiceBusReceivedMessageContext.java similarity index 66% rename from sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageContext.java rename to sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/models/ServiceBusReceivedMessageContext.java index 8d54ec717fbf..9cc4ba409585 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageContext.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/models/ServiceBusReceivedMessageContext.java @@ -1,8 +1,12 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.messaging.servicebus; +package com.azure.messaging.servicebus.models; + +import com.azure.messaging.servicebus.implementation.EntityHelper; +import org.apache.qpid.proton.message.Message; import java.util.Objects; +import java.util.UUID; /** * Represents the result of a receive message operation with context from Service Bus. @@ -12,6 +16,25 @@ public class ServiceBusReceivedMessageContext { private final String sessionId; private final Throwable error; + static { + // This is used by classes in different packages to get access to private and package-private methods. + EntityHelper.setServiceBusReceivedMessageContextAccessor( + new EntityHelper.ServiceBusReceivedMessageContextAccessor() { + @Override + public ServiceBusReceivedMessageContext toModel(ServiceBusReceivedMessage message, String sessionId, + Throwable error) { + System.out.println("!!!! Init ServiceBusReceivedMessageContext toModel "); + ServiceBusReceivedMessageContext messageContext; + if (message != null) { + messageContext = new ServiceBusReceivedMessageContext(message); + } else { + messageContext = new ServiceBusReceivedMessageContext(sessionId, error); + } + return messageContext; + } + }); + } + /** * Creates an instance where a message was successfully received. * diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReadmeSamples.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReadmeSamples.java index d38385814e70..470db7682d9e 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReadmeSamples.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReadmeSamples.java @@ -7,6 +7,9 @@ import com.azure.core.util.IterableStream; import com.azure.identity.DefaultAzureCredentialBuilder; import com.azure.messaging.servicebus.models.ReceiveMode; +import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import com.azure.messaging.servicebus.models.SubQueue; import reactor.core.Disposable; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAndSettleAsyncSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAndSettleAsyncSample.java index 434932a0900a..23082c1909f0 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAndSettleAsyncSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAndSettleAsyncSample.java @@ -3,6 +3,7 @@ package com.azure.messaging.servicebus; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import reactor.core.Disposable; import java.util.concurrent.TimeUnit; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAsyncSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAsyncSample.java index 6cb75b19d8d4..2fad42862bd0 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAsyncSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAsyncSample.java @@ -3,6 +3,7 @@ package com.azure.messaging.servicebus; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import reactor.core.Disposable; import java.time.Instant; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAutoLockRenewal.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAutoLockRenewal.java index 7ff52c49e575..3908cf8ba56e 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAutoLockRenewal.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAutoLockRenewal.java @@ -3,6 +3,7 @@ package com.azure.messaging.servicebus; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import reactor.core.Disposable; import java.time.Duration; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAzureIdentityAsyncSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAzureIdentityAsyncSample.java index 270977e9e572..08fd74e1242b 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAzureIdentityAsyncSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAzureIdentityAsyncSample.java @@ -5,6 +5,7 @@ import com.azure.core.credential.TokenCredential; import com.azure.identity.DefaultAzureCredentialBuilder; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import reactor.core.Disposable; import java.util.concurrent.TimeUnit; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageSyncSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageSyncSample.java index 034b7f2d5e79..5426f797ba16 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageSyncSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageSyncSample.java @@ -4,6 +4,9 @@ package com.azure.messaging.servicebus; import com.azure.core.util.IterableStream; +import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; /** * Sample demonstrates how to receive a batch of {@link ServiceBusReceivedMessage} from an Azure Service Bus Queue using diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveNamedSessionSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveNamedSessionSample.java index ffd2477d92b1..154119732999 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveNamedSessionSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveNamedSessionSample.java @@ -4,6 +4,8 @@ package com.azure.messaging.servicebus; import com.azure.core.util.IterableStream; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import reactor.core.publisher.Mono; import java.time.Duration; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendAndReceiveSessionMessageSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendAndReceiveSessionMessageSample.java index 2e83b7770566..515bf0a611c9 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendAndReceiveSessionMessageSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendAndReceiveSessionMessageSample.java @@ -4,6 +4,8 @@ package com.azure.messaging.servicebus; import com.azure.messaging.servicebus.models.ReceiveMode; +import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import reactor.core.publisher.Mono; import java.util.Arrays; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageAsyncSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageAsyncSample.java index 0d2b7d558dd9..ca0511e901fd 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageAsyncSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageAsyncSample.java @@ -3,6 +3,8 @@ package com.azure.messaging.servicebus; +import com.azure.messaging.servicebus.models.ServiceBusMessage; + import java.util.concurrent.TimeUnit; import static java.nio.charset.StandardCharsets.UTF_8; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageBatchSyncSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageBatchSyncSample.java index 3af5ae300460..3ca0bae9261d 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageBatchSyncSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageBatchSyncSample.java @@ -4,6 +4,7 @@ package com.azure.messaging.servicebus; import com.azure.messaging.servicebus.models.CreateBatchOptions; +import com.azure.messaging.servicebus.models.ServiceBusMessage; import java.util.Arrays; import java.util.List; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageWithAzureIdentityAsyncSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageWithAzureIdentityAsyncSample.java index 11cc4b295543..4da39b794b49 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageWithAzureIdentityAsyncSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageWithAzureIdentityAsyncSample.java @@ -5,6 +5,7 @@ import com.azure.core.credential.TokenCredential; import com.azure.identity.DefaultAzureCredentialBuilder; +import com.azure.messaging.servicebus.models.ServiceBusMessage; import java.util.UUID; import java.util.concurrent.TimeUnit; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendScheduledMessageAndCancelAsyncSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendScheduledMessageAndCancelAsyncSample.java index ecea37ffe80d..e67d27a6fbc5 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendScheduledMessageAndCancelAsyncSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendScheduledMessageAndCancelAsyncSample.java @@ -3,6 +3,8 @@ package com.azure.messaging.servicebus; +import com.azure.messaging.servicebus.models.ServiceBusMessage; + import java.time.OffsetDateTime; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientJavaDocCodeSamples.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientJavaDocCodeSamples.java index 4fa81a2c8c40..1fa2628050c5 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientJavaDocCodeSamples.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientJavaDocCodeSamples.java @@ -5,6 +5,8 @@ import com.azure.identity.DefaultAzureCredentialBuilder; import com.azure.messaging.servicebus.models.ReceiveMode; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import org.reactivestreams.Subscription; import reactor.core.Disposable; import reactor.core.publisher.BaseSubscriber; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientJavaDocCodeSamples.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientJavaDocCodeSamples.java index a9dadc7bc03a..f86659fbc068 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientJavaDocCodeSamples.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientJavaDocCodeSamples.java @@ -5,6 +5,7 @@ import com.azure.identity.DefaultAzureCredentialBuilder; import com.azure.messaging.servicebus.models.CreateBatchOptions; +import com.azure.messaging.servicebus.models.ServiceBusMessage; import reactor.core.Exceptions; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderClientJavaDocCodeSamples.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderClientJavaDocCodeSamples.java index b9506539e082..395c13417020 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderClientJavaDocCodeSamples.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderClientJavaDocCodeSamples.java @@ -4,6 +4,7 @@ package com.azure.messaging.servicebus; import com.azure.messaging.servicebus.models.CreateBatchOptions; +import com.azure.messaging.servicebus.models.ServiceBusMessage; import java.util.Arrays; import java.util.List; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java index 6d34fd642552..4bf671329483 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java @@ -19,6 +19,9 @@ import com.azure.messaging.servicebus.ServiceBusClientBuilder.ServiceBusSessionReceiverClientBuilder; import com.azure.messaging.servicebus.implementation.DispositionStatus; import com.azure.messaging.servicebus.implementation.MessagingEntityType; +import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxyReceiveTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxyReceiveTest.java index e39f6e69b18e..9dc03917125b 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxyReceiveTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxyReceiveTest.java @@ -8,6 +8,7 @@ import com.azure.messaging.servicebus.jproxy.ProxyServer; import com.azure.messaging.servicebus.jproxy.SimpleProxy; import com.azure.messaging.servicebus.models.ReceiveMode; +import com.azure.messaging.servicebus.models.ServiceBusMessage; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxySelectorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxySelectorTest.java index 9b66a3755659..2bb81b7933e7 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxySelectorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxySelectorTest.java @@ -6,6 +6,7 @@ import com.azure.core.amqp.AmqpRetryOptions; import com.azure.core.amqp.AmqpTransportType; import com.azure.core.util.logging.ClientLogger; +import com.azure.messaging.servicebus.models.ServiceBusMessage; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxySendTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxySendTest.java index e6cbc257087b..fe34229751ba 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxySendTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxySendTest.java @@ -8,6 +8,7 @@ import com.azure.core.util.logging.ClientLogger; import com.azure.messaging.servicebus.jproxy.ProxyServer; import com.azure.messaging.servicebus.jproxy.SimpleProxy; +import com.azure.messaging.servicebus.models.ServiceBusMessage; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusAsyncConsumerTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusAsyncConsumerTest.java index aa1ae3a2c413..64cc1ef4ca9a 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusAsyncConsumerTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusAsyncConsumerTest.java @@ -11,6 +11,7 @@ import com.azure.messaging.servicebus.implementation.ServiceBusReceiveLink; import com.azure.messaging.servicebus.implementation.ServiceBusReceiveLinkProcessor; import com.azure.messaging.servicebus.models.ReceiveMode; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import org.apache.qpid.proton.amqp.transport.DeliveryState; import org.apache.qpid.proton.message.Message; import org.junit.jupiter.api.AfterAll; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageBatchTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageBatchTest.java index d5d28cf18fba..7d9873f57076 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageBatchTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageBatchTest.java @@ -9,6 +9,9 @@ import com.azure.core.amqp.implementation.ErrorContextProvider; import com.azure.core.amqp.implementation.MessageSerializer; import com.azure.core.amqp.implementation.TracerProvider; +import com.azure.messaging.servicebus.ServiceBusMessageBatch; +import com.azure.messaging.servicebus.ServiceBusMessageSerializer; +import com.azure.messaging.servicebus.models.ServiceBusMessage; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageSerializerTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageSerializerTest.java index e8c274595573..fa8358254b1c 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageSerializerTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageSerializerTest.java @@ -4,6 +4,9 @@ package com.azure.messaging.servicebus; import com.azure.core.amqp.exception.AmqpResponseCode; +import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.ServiceBusMessageSerializer; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import org.apache.qpid.proton.Proton; import org.apache.qpid.proton.amqp.messaging.AmqpValue; import org.apache.qpid.proton.amqp.messaging.ApplicationProperties; @@ -102,10 +105,10 @@ void deserializeMessage() { assertEquals(message.getCorrelationId(), serviceBusMessage.getCorrelationId()); // Verifying our application properties are the same. - assertEquals(APPLICATION_PROPERTIES.size(), serviceBusMessage.getProperties().size()); + assertEquals(APPLICATION_PROPERTIES.size(), serviceBusMessage.getApplicationProperties().size()); APPLICATION_PROPERTIES.forEach((key, value) -> { - Assertions.assertTrue(serviceBusMessage.getProperties().containsKey(key)); - assertEquals(value, serviceBusMessage.getProperties().get(key)); + Assertions.assertTrue(serviceBusMessage.getApplicationProperties().containsKey(key)); + assertEquals(value, serviceBusMessage.getApplicationProperties().get(key)); }); // Verifying the contents of our message is the same. diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java index 95a29694524b..393b0145d9f5 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java @@ -9,6 +9,9 @@ import com.azure.messaging.servicebus.implementation.MessagingEntityType; import com.azure.messaging.servicebus.models.LockRenewalStatus; import com.azure.messaging.servicebus.models.ReceiveMode; +import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import com.azure.messaging.servicebus.models.SubQueue; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Disabled; @@ -516,7 +519,7 @@ void peekBatchMessages(MessagingEntityType entityType, boolean isSessionEnabled) setSenderAndReceiver(entityType, TestUtils.USE_CASE_PEEK_BATCH_MESSAGES, isSessionEnabled); final BiConsumer checkCorrectMessage = (message, index) -> { - final Map properties = message.getProperties(); + final Map properties = message.getApplicationProperties(); final Object value = properties.get(MESSAGE_POSITION_ID); assertTrue(value instanceof Integer, "Did not contain correct position number: " + value); @@ -870,7 +873,7 @@ void sendReceiveMessageWithVariousPropertyTypes(MessagingEntityType entityType) messagesPending.decrementAndGet(); assertMessageEquals(receivedMessage, messageId, isSessionEnabled); - final Map received = receivedMessage.getMessage().getProperties(); + final Map received = receivedMessage.getMessage().getApplicationProperties(); assertEquals(sentProperties.size(), received.size()); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientTest.java index cae2c7032518..71bb456f6d7e 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientTest.java @@ -24,6 +24,7 @@ import com.azure.messaging.servicebus.implementation.ServiceBusReactorReceiver; import com.azure.messaging.servicebus.models.LockRenewalStatus; import com.azure.messaging.servicebus.models.ReceiveMode; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import org.apache.qpid.proton.amqp.messaging.Rejected; import org.apache.qpid.proton.amqp.transport.DeliveryState.DeliveryStateType; import org.apache.qpid.proton.message.Message; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientIntegrationTest.java index 3148fdc4fc5f..c30420ee54f6 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientIntegrationTest.java @@ -9,6 +9,9 @@ import com.azure.messaging.servicebus.implementation.DispositionStatus; import com.azure.messaging.servicebus.implementation.MessagingEntityType; import com.azure.messaging.servicebus.models.ReceiveMode; +import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -770,7 +773,7 @@ void sendReceiveMessageWithVariousPropertyTypes(MessagingEntityType entityType, messagesPending.decrementAndGet(); assertMessageEquals(receivedMessage, messageId, isSessionEnabled); - final Map received = receivedMessage.getProperties(); + final Map received = receivedMessage.getApplicationProperties(); assertEquals(sentProperties.size(), received.size()); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientTest.java index 9acd797e0fec..ab0a9abc5a34 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientTest.java @@ -6,7 +6,10 @@ import com.azure.core.util.IterableStream; import com.azure.core.util.logging.ClientLogger; import com.azure.messaging.servicebus.administration.models.DeadLetterOptions; +import com.azure.messaging.servicebus.implementation.EntityHelper; import com.azure.messaging.servicebus.models.ReceiveMode; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -450,8 +453,8 @@ void receiveMessagesWithUserSpecifiedTimeout() { } for (int i = 0; i < numberToEmit; i++) { - ServiceBusReceivedMessageContext context = new ServiceBusReceivedMessageContext( - mock(ServiceBusReceivedMessage.class)); + ServiceBusReceivedMessageContext context = EntityHelper.toModel( + mock(ServiceBusReceivedMessage.class), null, null); sink.next(context); final int emit = emittedMessages.incrementAndGet(); @@ -497,7 +500,7 @@ void receiveMessagesMax() { } for (int i = 0; i < numberToEmit; i++) { - sink.next(new ServiceBusReceivedMessageContext(mock(ServiceBusReceivedMessage.class))); + sink.next(EntityHelper.toModel(mock(ServiceBusReceivedMessage.class), null, null)); final int emit = emittedMessages.incrementAndGet(); if (emit >= numberToEmit) { @@ -544,7 +547,7 @@ void receiveMessagesTimeout() { } for (int i = 0; i < numberToEmit; i++) { - sink.next(new ServiceBusReceivedMessageContext(mock(ServiceBusReceivedMessage.class))); + sink.next(EntityHelper.toModel(mock(ServiceBusReceivedMessage.class), null, null)); final int emit = emittedMessages.incrementAndGet(); if (emit >= numberToEmit) { diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientIntegrationTest.java index 8451816b517e..c02de04bfa45 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientIntegrationTest.java @@ -7,6 +7,7 @@ import com.azure.messaging.servicebus.implementation.MessagingEntityType; import com.azure.messaging.servicebus.models.CreateBatchOptions; import com.azure.messaging.servicebus.models.ReceiveMode; +import com.azure.messaging.servicebus.models.ServiceBusMessage; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientTest.java index c7dc1b146126..8b19163629a1 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientTest.java @@ -23,6 +23,8 @@ import com.azure.messaging.servicebus.implementation.ServiceBusConnectionProcessor; import com.azure.messaging.servicebus.implementation.ServiceBusManagementNode; import com.azure.messaging.servicebus.models.CreateBatchOptions; +import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.ServiceBusMessageSerializer; import org.apache.qpid.proton.amqp.messaging.Section; import org.apache.qpid.proton.amqp.transaction.TransactionalState; import org.apache.qpid.proton.amqp.transport.DeliveryState; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderClientIntegrationTest.java index e4440492fc37..9cbd74649000 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderClientIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderClientIntegrationTest.java @@ -7,6 +7,7 @@ import com.azure.messaging.servicebus.implementation.MessagingEntityType; import com.azure.messaging.servicebus.models.CreateBatchOptions; import com.azure.messaging.servicebus.models.ReceiveMode; +import com.azure.messaging.servicebus.models.ServiceBusMessage; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Tag; import org.junit.jupiter.params.ParameterizedTest; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderClientTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderClientTest.java index 0e3b112ad94f..daedd7513d7a 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderClientTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderClientTest.java @@ -4,6 +4,7 @@ package com.azure.messaging.servicebus; import com.azure.messaging.servicebus.models.CreateBatchOptions; +import com.azure.messaging.servicebus.models.ServiceBusMessage; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java index a898c8c2734e..4e540924cc8f 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java @@ -5,6 +5,8 @@ import com.azure.core.amqp.exception.AmqpResponseCode; import com.azure.core.util.CoreUtils; +import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import org.apache.qpid.proton.Proton; import org.apache.qpid.proton.amqp.Binary; import org.apache.qpid.proton.amqp.Symbol; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/UnnamedSessionManagerIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/UnnamedSessionManagerIntegrationTest.java index 64416f9b87c1..e7d030418910 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/UnnamedSessionManagerIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/UnnamedSessionManagerIntegrationTest.java @@ -8,6 +8,9 @@ import com.azure.core.util.logging.ClientLogger; import com.azure.messaging.servicebus.ServiceBusClientBuilder.ServiceBusSessionReceiverClientBuilder; import com.azure.messaging.servicebus.implementation.MessagingEntityType; +import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/UnnamedSessionManagerTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/UnnamedSessionManagerTest.java index d466ca795916..04f3f323d24d 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/UnnamedSessionManagerTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/UnnamedSessionManagerTest.java @@ -19,6 +19,8 @@ import com.azure.messaging.servicebus.implementation.ServiceBusManagementNode; import com.azure.messaging.servicebus.implementation.ServiceBusReceiveLink; import com.azure.messaging.servicebus.models.ReceiveMode; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import org.apache.qpid.proton.amqp.messaging.Accepted; import org.apache.qpid.proton.message.Message; import org.junit.jupiter.api.AfterAll; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/models/ServiceBusMessageTest.java similarity index 95% rename from sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java rename to sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/models/ServiceBusMessageTest.java index 8cd07d85cc0d..6f9ea171ac36 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/models/ServiceBusMessageTest.java @@ -1,8 +1,9 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.messaging.servicebus; +package com.azure.messaging.servicebus.models; +import com.azure.messaging.servicebus.models.ServiceBusMessage; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/models/ServiceBusReceivedMessageTest.java similarity index 82% rename from sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java rename to sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/models/ServiceBusReceivedMessageTest.java index 093c6c189dd2..79865c4af3cd 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/models/ServiceBusReceivedMessageTest.java @@ -1,8 +1,13 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.messaging.servicebus; +package com.azure.messaging.servicebus.models; +import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; +import org.apache.qpid.proton.amqp.Binary; +import org.apache.qpid.proton.amqp.messaging.Data; +import org.apache.qpid.proton.message.Message; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -10,6 +15,8 @@ import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class ServiceBusReceivedMessageTest { @@ -30,7 +37,7 @@ public void messagePropertiesShouldNotBeNull() { // Assert Assertions.assertNotNull(receivedMessage.getBody()); - Assertions.assertNotNull(receivedMessage.getProperties()); + Assertions.assertNotNull(receivedMessage.getApplicationProperties()); } @@ -67,8 +74,12 @@ public void canCreateWithBytePayload() { @Test public void toServiceBusMessageTest() { //Arrange - final ServiceBusReceivedMessage originalMessage = new ServiceBusReceivedMessage(PAYLOAD_BYTES); - originalMessage.setMessageId("mid"); + Message amqpMessage = mock(Message.class); + Data data = new Data(new Binary(PAYLOAD_BYTES)); + when(amqpMessage.getBody()).thenReturn(data); + // + final ServiceBusReceivedMessage originalMessage = new ServiceBusReceivedMessage(amqpMessage); + /*originalMessage.setMessageId("mid"); originalMessage.setContentType("type"); originalMessage.setCorrelationId("cid"); originalMessage.setReplyTo("rto"); @@ -76,7 +87,7 @@ public void toServiceBusMessageTest() { originalMessage.setTimeToLive(Duration.ofSeconds(10)); originalMessage.setReplyToSessionId("rsessionid"); originalMessage.setLabel("label"); - originalMessage.setTo("to"); + originalMessage.setTo("to");*/ // Act final ServiceBusMessage messageToSend = new ServiceBusMessage(originalMessage); @@ -91,7 +102,7 @@ public void toServiceBusMessageTest() { Assertions.assertEquals(originalMessage.getReplyTo(), messageToSend.getReplyTo()); Assertions.assertEquals(originalMessage.getViaPartitionKey(), messageToSend.getViaPartitionKey()); Assertions.assertEquals(originalMessage.getTimeToLive().toMillis(), messageToSend.getTimeToLive().toMillis()); - Assertions.assertEquals(originalMessage.getLabel(), messageToSend.getLabel()); + Assertions.assertEquals(originalMessage.getLabel(), messageToSend.getSubject()); Assertions.assertEquals(originalMessage.getReplyToSessionId(), messageToSend.getReplyToSessionId()); Assertions.assertEquals(originalMessage.getTo(), messageToSend.getTo()); } From 0e3956c3e966e025ba92db4ae33d80dad34d1861 Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Fri, 4 Sep 2020 11:29:37 -0700 Subject: [PATCH 06/27] Continue initial draft implementation: moved sbrm to models --- .../ServiceBusMessageSerializer.java | 123 ++---------------- .../servicebus/IntegrationTestBase.java | 29 +++++ ...BusReceiverAsyncClientIntegrationTest.java | 75 +++++++++++ 3 files changed, 118 insertions(+), 109 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java index 7758274a4549..5be47ddd6f1c 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java @@ -27,8 +27,8 @@ import org.apache.qpid.proton.amqp.messaging.AmqpValue; import org.apache.qpid.proton.amqp.messaging.ApplicationProperties; import org.apache.qpid.proton.amqp.messaging.Data; +import org.apache.qpid.proton.amqp.messaging.DeliveryAnnotations; import org.apache.qpid.proton.amqp.messaging.Footer; -import org.apache.qpid.proton.amqp.messaging.Header; import org.apache.qpid.proton.amqp.messaging.MessageAnnotations; import org.apache.qpid.proton.amqp.messaging.Properties; import org.apache.qpid.proton.amqp.messaging.Section; @@ -45,6 +45,7 @@ import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; @@ -189,6 +190,18 @@ public Message serialize(T object) { amqpMessage.setMessageAnnotations(new MessageAnnotations(messageAnnotationsMap)); + // Set Delivery Annotations. + final Map deliveryAnnotationsMap = new HashMap<>(); + + final Map deliveryAnnotations = brokeredMessage.getAmqpAnnotatedMessage().getDeliveryAnnotations(); + Iterator deliveryAnnotationIterator = deliveryAnnotations.keySet().iterator(); + while (deliveryAnnotationIterator.hasNext()) { + String key = deliveryAnnotationIterator.next(); + deliveryAnnotationsMap.put(Symbol.valueOf(key), deliveryAnnotations.get(key)); + } + + amqpMessage.setDeliveryAnnotations( new DeliveryAnnotations(deliveryAnnotationsMap)); + return amqpMessage; } @@ -342,114 +355,6 @@ private ServiceBusReceivedMessage deserializeMessage(Message amqpMessage) { private ServiceBusReceivedMessage deserializeMessage(Message amqpMessage, UUID lockToken) { return EntityHelper.toModel(amqpMessage, lockToken); } -/* final ServiceBusReceivedMessage brokeredMessage; - final Section body = amqpMessage.getBody(); - if (body != null) { - //TODO (conniey): Support other AMQP types like AmqpValue and AmqpSequence. - if (body instanceof Data) { - final Binary messageData = ((Data) body).getValue(); - final byte[] bytes = messageData.getArray(); - brokeredMessage = new ServiceBusReceivedMessage(bytes); - } else { - logger.warning(String.format(Messages.MESSAGE_NOT_OF_TYPE, body.getType())); - brokeredMessage = new ServiceBusReceivedMessage(EMPTY_BYTE_ARRAY); - } - } else { - logger.warning(String.format(Messages.MESSAGE_NOT_OF_TYPE, "null")); - brokeredMessage = new ServiceBusReceivedMessage(EMPTY_BYTE_ARRAY); - } - - // Application properties - ApplicationProperties applicationProperties = amqpMessage.getApplicationProperties(); - if (applicationProperties != null) { - final Map propertiesValue = applicationProperties.getValue(); - brokeredMessage.getProperties().putAll(propertiesValue); - - if (propertiesValue.containsKey(DEAD_LETTER_REASON)) { - brokeredMessage.setDeadLetterReason(String.valueOf(propertiesValue.get(DEAD_LETTER_REASON))); - } - if (propertiesValue.containsKey(DEAD_LETTER_DESCRIPTION)) { - brokeredMessage.setDeadLetterErrorDescription(String.valueOf( - propertiesValue.get(DEAD_LETTER_DESCRIPTION))); - } - } - - // Header - brokeredMessage.setTimeToLive(Duration.ofMillis(amqpMessage.getTtl())); - brokeredMessage.setDeliveryCount(amqpMessage.getDeliveryCount()); - - // Properties - final Object messageId = amqpMessage.getMessageId(); - if (messageId != null) { - brokeredMessage.setMessageId(messageId.toString()); - } - - brokeredMessage.setContentType(amqpMessage.getContentType()); - final Object correlationId = amqpMessage.getCorrelationId(); - if (correlationId != null) { - brokeredMessage.setCorrelationId(correlationId.toString()); - } - - final Properties properties = amqpMessage.getProperties(); - if (properties != null) { - brokeredMessage.setTo(properties.getTo()); - } - - brokeredMessage.setLabel(amqpMessage.getSubject()); - brokeredMessage.setReplyTo(amqpMessage.getReplyTo()); - brokeredMessage.setReplyToSessionId(amqpMessage.getReplyToGroupId()); - brokeredMessage.setSessionId(amqpMessage.getGroupId()); - - // Message Annotations - final MessageAnnotations messageAnnotations = amqpMessage.getMessageAnnotations(); - if (messageAnnotations != null) { - Map messageAnnotationsMap = messageAnnotations.getValue(); - if (messageAnnotationsMap != null) { - for (Map.Entry entry : messageAnnotationsMap.entrySet()) { - final String key = entry.getKey().toString(); - final Object value = entry.getValue(); - - switch (key) { - case ENQUEUED_TIME_UTC_NAME: - brokeredMessage.setEnqueuedTime(((Date) value).toInstant().atOffset(ZoneOffset.UTC)); - - break; - case SCHEDULED_ENQUEUE_TIME_NAME: - brokeredMessage.setScheduledEnqueueTime(((Date) value).toInstant() - .atOffset(ZoneOffset.UTC)); - break; - case SEQUENCE_NUMBER_NAME: - brokeredMessage.setSequenceNumber((long) value); - break; - case LOCKED_UNTIL_NAME: - brokeredMessage.setLockedUntil(((Date) value).toInstant().atOffset(ZoneOffset.UTC)); - break; - case PARTITION_KEY_NAME: - brokeredMessage.setPartitionKey((String) value); - break; - case VIA_PARTITION_KEY_NAME: - brokeredMessage.setViaPartitionKey((String) value); - break; - case DEAD_LETTER_SOURCE_NAME: - brokeredMessage.setDeadLetterSource((String) value); - break; - case ENQUEUED_SEQUENCE_NUMBER: - brokeredMessage.setEnqueuedSequenceNumber((long) value); - break; - default: - logger.info("Unrecognised key: {}, value: {}", key, value); - break; - } - } - } - } - - if (amqpMessage instanceof MessageWithLockToken) { - brokeredMessage.setLockToken(((MessageWithLockToken) amqpMessage).getLockToken()); - } - - return brokeredMessage; - }*/ private static int getPayloadSize(Message msg) { if (msg == null || msg.getBody() == null) { diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java index 4bf671329483..aa9ec854dd93 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java @@ -7,6 +7,7 @@ import com.azure.core.amqp.ProxyAuthenticationType; import com.azure.core.amqp.ProxyOptions; import com.azure.core.amqp.implementation.ConnectionStringProperties; +import com.azure.core.amqp.models.AmqpAnnotatedMessage; import com.azure.core.test.TestBase; import com.azure.core.test.TestMode; import com.azure.core.util.Configuration; @@ -423,6 +424,34 @@ protected void dispose(AutoCloseable... closeables) { } } + protected ServiceBusMessage getMessage(String messageId, boolean isSessionEnabled, AmqpAnnotatedMessage amqpPropertiesToSet) { + + final ServiceBusMessage message = TestUtils.getServiceBusMessage(CONTENTS_BYTES, messageId); + + message.getAmqpAnnotatedMessage().getMessageAnnotations().putAll(amqpPropertiesToSet.getMessageAnnotations()); + + message.getAmqpAnnotatedMessage().getApplicationProperties().putAll(amqpPropertiesToSet.getApplicationProperties()); + + message.getAmqpAnnotatedMessage().getDeliveryAnnotations().putAll(amqpPropertiesToSet.getDeliveryAnnotations()); + + message.getAmqpAnnotatedMessage().getFooter().putAll(amqpPropertiesToSet.getFooter()); + + message.getAmqpAnnotatedMessage().getHeader().setFirstAcquirer(amqpPropertiesToSet.getHeader().getFirstAcquirer()); + message.getAmqpAnnotatedMessage().getHeader().setDurable(amqpPropertiesToSet.getHeader().getDurable()); + message.getAmqpAnnotatedMessage().getHeader().setDeliveryCount(amqpPropertiesToSet.getHeader().getDeliveryCount()); + message.getAmqpAnnotatedMessage().getHeader().setPriority(amqpPropertiesToSet.getHeader().getPriority()); + + + message.getAmqpAnnotatedMessage().getProperties().setReplyTo((amqpPropertiesToSet.getProperties().getReplyTo())); + message.getAmqpAnnotatedMessage().getProperties().setAbsoluteExpiryTime((amqpPropertiesToSet.getProperties().getAbsoluteExpiryTime())); + message.getAmqpAnnotatedMessage().getProperties().setSubject((amqpPropertiesToSet.getProperties().getSubject())); + message.getAmqpAnnotatedMessage().getProperties().setContentType(amqpPropertiesToSet.getProperties().getContentType()); + message.getAmqpAnnotatedMessage().getProperties().setCorrelationId(amqpPropertiesToSet.getProperties().getCorrelationId()); + + logger.verbose("Message id {}.", messageId); + return isSessionEnabled ? message.setSessionId(sessionId) : message; + } + protected ServiceBusMessage getMessage(String messageId, boolean isSessionEnabled) { final ServiceBusMessage message = TestUtils.getServiceBusMessage(CONTENTS_BYTES, messageId); logger.verbose("Message id {}.", messageId); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java index 5e4e2df714cc..82af6e076d57 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java @@ -3,6 +3,12 @@ package com.azure.messaging.servicebus; +import com.azure.core.amqp.models.AmqpAnnotatedMessage; +import com.azure.core.amqp.models.AmqpBodyType; +import com.azure.core.amqp.models.AmqpDataBody; +import com.azure.core.amqp.models.AmqpMessageBody; +import com.azure.core.amqp.models.BinaryData; +import com.azure.core.util.IterableStream; import com.azure.core.util.logging.ClientLogger; import com.azure.messaging.servicebus.administration.models.DeadLetterOptions; import com.azure.messaging.servicebus.implementation.DispositionStatus; @@ -26,6 +32,8 @@ import java.time.OffsetDateTime; import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.UUID; @@ -956,6 +964,73 @@ void renewMessageLock(MessagingEntityType entityType) throws InterruptedExceptio .verify(Duration.ofMinutes(3)); } + /** + * Verifies that we can receive a message which have different section set (i.e header, footer, annotations, + * application properties etc). + */ + @MethodSource("com.azure.messaging.servicebus.IntegrationTestBase#messagingEntityProvider") + @ParameterizedTest + void receiveAndValidateProperties(MessagingEntityType entityType) { + // Arrange + final boolean isSessionEnabled = false; + final String subject = "subject"; + final Map footer = new HashMap<>(); + footer.put("footer-key-1", "footer-value-1"); + + final Map aplicaitonProperties = new HashMap<>(); + footer.put("ap-key-1", "ap-value-1"); + + final Map deliveryAnnotation = new HashMap<>(); + deliveryAnnotation.put("delivery-annotations-key-1", "delivery-annotations-value-1"); + deliveryAnnotation.put("delivery-annotations-key-2", "delivery-annotations-value-2"); + + setSenderAndReceiver(entityType, 0, isSessionEnabled); + ServiceBusReceiverAsyncClient deadLetterReceiver = getDeadLetterReceiverBuilder(false, entityType, + 0, Function.identity()) + .buildAsyncClient(); + + final String messageId = UUID.randomUUID().toString(); + final AmqpAnnotatedMessage amqpProperties = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList(new BinaryData(CONTENTS_BYTES)))); + amqpProperties.getProperties().setSubject(subject); + amqpProperties.getHeader().setPriority((short)2); + amqpProperties.getFooter().putAll(footer); + amqpProperties.getDeliveryAnnotations().putAll(deliveryAnnotation); + amqpProperties.getApplicationProperties().putAll(aplicaitonProperties); + + + final ServiceBusMessage message = getMessage(messageId, isSessionEnabled, amqpProperties); + + sendMessage(message).block(TIMEOUT); + + StepVerifier.create(receiver.receiveMessages().map(ServiceBusReceivedMessageContext::getMessage)) + .assertNext(received -> { + assertNotNull(received.getLockToken()); + AmqpAnnotatedMessage actual = received.getAmqpAnnotatedMessage(); + try { + assertArrayEquals(CONTENTS_BYTES, message.getBody()); + assertEquals(amqpProperties.getHeader().getPriority(), actual.getHeader().getPriority(), "Header.priority is not equal."); + + assertEquals(amqpProperties.getProperties().getSubject(), actual.getProperties().getSubject(), "Properties.subject is not equal."); + assertEquals(amqpProperties.getProperties().getSubject(), actual.getProperties().getSubject(), "Properties.subject is not equal."); + + Map actualDeliveryAnnotationMap = actual.getDeliveryAnnotations(); + Iterator ite = deliveryAnnotation.keySet().iterator(); + while (ite.hasNext()) { + String key = ite.next(); + assertEquals(amqpProperties.getDeliveryAnnotations().get(key), actualDeliveryAnnotationMap.get(key), "Delivery annotations is not equal for Key " + key); + } + assertEquals(amqpProperties.getProperties().getSubject(), actual.getProperties().getSubject(), "Properties.subject is not equal."); + + } finally { + logger.info("Completing message."); + receiver.complete(received).block(Duration.ofSeconds(15)); + messagesPending.decrementAndGet(); + } + }) + .thenCancel() + .verify(Duration.ofMinutes(2)); + } + /** * Sets the sender and receiver. If session is enabled, then a single-named session receiver is created. */ From 735f657123f374a2c35661fa1c6b0055ae7bbdc8 Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Fri, 4 Sep 2020 14:16:09 -0700 Subject: [PATCH 07/27] Draft implementation --- .../amqp/models/AmqpAnnotatedMessageTest.java | 59 ++++++ .../core/amqp/models/BinaryDataTest.java | 40 ++++ .../servicebus/ServiceBusAsyncConsumer.java | 2 - .../servicebus/ServiceBusClientBuilder.java | 1 - .../{models => }/ServiceBusMessage.java | 5 +- .../servicebus/ServiceBusMessageBatch.java | 1 - .../ServiceBusMessageSerializer.java | 173 ++++++++++++++++-- .../ServiceBusReceivedMessage.java | 118 +++++------- .../ServiceBusReceivedMessageContext.java | 25 +-- .../ServiceBusReceiverAsyncClient.java | 14 +- .../servicebus/ServiceBusReceiverClient.java | 2 - .../ServiceBusSenderAsyncClient.java | 2 - .../servicebus/ServiceBusSenderClient.java | 2 - .../SynchronousMessageSubscriber.java | 1 - .../servicebus/SynchronousReceiveWork.java | 1 - .../servicebus/UnnamedSessionManager.java | 1 - .../servicebus/UnnamedSessionReceiver.java | 8 +- .../models/CorrelationRuleFilter.java | 2 +- .../administration/models/RuleFilter.java | 2 +- .../administration/models/SqlRuleAction.java | 2 +- .../administration/models/SqlRuleFilter.java | 2 +- .../implementation/EntityHelper.java | 147 --------------- .../implementation/ManagementChannel.java | 4 +- .../MessageManagementOperations.java | 2 +- .../ServiceBusManagementNode.java | 4 +- .../messaging/servicebus/ReadmeSamples.java | 3 - .../ReceiveMessageAndSettleAsyncSample.java | 1 - .../servicebus/ReceiveMessageAsyncSample.java | 1 - .../ReceiveMessageAutoLockRenewal.java | 1 - ...eceiveMessageAzureIdentityAsyncSample.java | 1 - .../servicebus/ReceiveMessageSyncSample.java | 3 - .../servicebus/ReceiveNamedSessionSample.java | 2 - .../SendAndReceiveSessionMessageSample.java | 2 - .../servicebus/SendMessageAsyncSample.java | 2 - .../SendMessageBatchSyncSample.java | 1 - ...ndMessageWithAzureIdentityAsyncSample.java | 1 - ...dScheduledMessageAndCancelAsyncSample.java | 2 - ...ReceiverAsyncClientJavaDocCodeSamples.java | 2 - ...usSenderAsyncClientJavaDocCodeSamples.java | 1 - ...viceBusSenderClientJavaDocCodeSamples.java | 1 - .../servicebus/IntegrationTestBase.java | 3 - .../servicebus/ProxyReceiveTest.java | 1 - .../servicebus/ProxySelectorTest.java | 1 - .../messaging/servicebus/ProxySendTest.java | 1 - .../ServiceBusAsyncConsumerTest.java | 1 - .../ServiceBusMessageBatchTest.java | 3 - .../ServiceBusMessageSerializerTest.java | 3 - .../{models => }/ServiceBusMessageTest.java | 4 +- .../ServiceBusReceivedMessageTest.java | 8 +- ...BusReceiverAsyncClientIntegrationTest.java | 7 +- .../ServiceBusReceiverAsyncClientTest.java | 1 - ...rviceBusReceiverClientIntegrationTest.java | 5 +- .../ServiceBusReceiverClientTest.java | 11 +- ...ceBusSenderAsyncClientIntegrationTest.java | 1 - .../ServiceBusSenderAsyncClientTest.java | 2 - ...ServiceBusSenderClientIntegrationTest.java | 1 - .../ServiceBusSenderClientTest.java | 1 - .../azure/messaging/servicebus/TestUtils.java | 2 - .../UnnamedSessionManagerIntegrationTest.java | 3 - .../servicebus/UnnamedSessionManagerTest.java | 2 - 60 files changed, 340 insertions(+), 365 deletions(-) create mode 100644 sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java create mode 100644 sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/BinaryDataTest.java rename sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/{models => }/ServiceBusMessage.java (99%) rename sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/{models => }/ServiceBusReceivedMessage.java (92%) rename sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/{models => }/ServiceBusReceivedMessageContext.java (66%) rename sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/{models => }/ServiceBusMessageTest.java (95%) rename sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/{models => }/ServiceBusReceivedMessageTest.java (95%) diff --git a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java new file mode 100644 index 000000000000..4ee2e21e56ca --- /dev/null +++ b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java @@ -0,0 +1,59 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.core.amqp.models; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Test class for {@link AmqpAnnotatedMessage} + */ +public class AmqpAnnotatedMessageTest { + + private static final byte[] CONTENTS_BYTES = "Some-contents".getBytes(StandardCharsets.UTF_8); + + /** + * Verifies we correctly set values via constructor for {@link AmqpAnnotatedMessage}. + */ + @Test + public void constructorValidValues() { + // Arrange & Act + AmqpAnnotatedMessage actual = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList(new BinaryData(CONTENTS_BYTES)))); + + // Assert + Assertions.assertEquals(AmqpBodyType.DATA, actual.getBody().getBodyType()); + Assertions.assertNotNull(actual.getProperties()); + Assertions.assertNotNull(actual.getHeader()); + Assertions.assertNotNull(actual.getFooter()); + Assertions.assertNotNull(actual.getApplicationProperties()); + Assertions.assertNotNull(actual.getDeliveryAnnotations()); + Assertions.assertNotNull(actual.getMessageAnnotations()); + Assertions.assertNotNull(actual.getApplicationProperties()); + + List dataList = ((AmqpDataBody)actual.getBody()).getData().stream().collect(Collectors.toList()); + assertEquals(1, dataList.size()); + byte[] actualData = dataList.get(0).getData(); + assertArrayEquals(CONTENTS_BYTES, actualData); + } + + /** + * Verifies {@link AmqpAnnotatedMessage} constructor for null valeus. + */ + @Test + public void constructorNullValidValues() { + // Arrange + AmqpDataBody body = null; + + // Act & Assert + Assertions.assertThrows(NullPointerException.class, () -> new AmqpAnnotatedMessage(body)); + } +} diff --git a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/BinaryDataTest.java b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/BinaryDataTest.java new file mode 100644 index 000000000000..ae75a1835da8 --- /dev/null +++ b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/BinaryDataTest.java @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.core.amqp.models; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.nio.charset.StandardCharsets; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +/** + * Test for {@link BinaryData}. + */ +public class BinaryDataTest { + + private static final byte[] CONTENTS_BYTES = "Some-contents".getBytes(StandardCharsets.UTF_8); + + /** + * Verifies we correctly set values via constructor for {@link BinaryData}. + */ + @Test + public void constructorValidValues() { + // Arrange & Act + BinaryData actual = new BinaryData(CONTENTS_BYTES); + + // Assert + assertArrayEquals(CONTENTS_BYTES, actual.getData()); + } + + /** + * Verifies {@link BinaryData} constructor for null valeus. + */ + @Test + public void constructorNullValidValues() { + // Arrange, Act & Assert + Assertions.assertThrows(NullPointerException.class, () -> new BinaryData(null)); + } +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusAsyncConsumer.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusAsyncConsumer.java index c83e9887fd84..d0bd513da33b 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusAsyncConsumer.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusAsyncConsumer.java @@ -8,8 +8,6 @@ import com.azure.messaging.servicebus.implementation.DispositionStatus; import com.azure.messaging.servicebus.implementation.MessageUtils; import com.azure.messaging.servicebus.implementation.ServiceBusReceiveLinkProcessor; -import com.azure.messaging.servicebus.models.ServiceBusMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import org.apache.qpid.proton.amqp.transport.DeliveryState; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusClientBuilder.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusClientBuilder.java index f3e69664419d..6ac47b834d7f 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusClientBuilder.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusClientBuilder.java @@ -31,7 +31,6 @@ import com.azure.messaging.servicebus.implementation.ServiceBusReactorAmqpConnection; import com.azure.messaging.servicebus.implementation.ServiceBusSharedKeyCredential; import com.azure.messaging.servicebus.models.ReceiveMode; -import com.azure.messaging.servicebus.models.ServiceBusMessage; import com.azure.messaging.servicebus.models.SubQueue; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/models/ServiceBusMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java similarity index 99% rename from sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/models/ServiceBusMessage.java rename to sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java index ec7f6f2e61fe..0c07f8378478 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/models/ServiceBusMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java @@ -1,14 +1,13 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.messaging.servicebus.models; +package com.azure.messaging.servicebus; import com.azure.core.amqp.models.AmqpAnnotatedMessage; import com.azure.core.amqp.models.AmqpDataBody; import com.azure.core.amqp.models.BinaryData; import com.azure.core.util.Context; -import com.azure.messaging.servicebus.ServiceBusMessageBatch; import java.nio.charset.StandardCharsets; import java.time.Duration; @@ -468,7 +467,7 @@ public ServiceBusMessage setSessionId(String sessionId) { * * @return the {@link Context} object set on the {@link ServiceBusMessage}. */ - public Context getContext() { + Context getContext() { return context; } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java index 572cc301d038..af085609b6de 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java @@ -11,7 +11,6 @@ import com.azure.core.util.Context; import com.azure.core.util.logging.ClientLogger; import com.azure.core.util.tracing.ProcessKind; -import com.azure.messaging.servicebus.models.ServiceBusMessage; import reactor.core.publisher.Signal; import java.nio.BufferOverflowException; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java index 5be47ddd6f1c..7f530a7afecb 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java @@ -6,13 +6,15 @@ import com.azure.core.amqp.exception.AmqpResponseCode; import com.azure.core.amqp.implementation.MessageSerializer; import com.azure.core.amqp.implementation.RequestResponseUtils; +import com.azure.core.amqp.models.AmqpAnnotatedMessage; +import com.azure.core.amqp.models.AmqpDataBody; import com.azure.core.amqp.models.AmqpMessageHeader; +import com.azure.core.amqp.models.AmqpMessageProperties; +import com.azure.core.amqp.models.BinaryData; import com.azure.core.util.logging.ClientLogger; -import com.azure.messaging.servicebus.implementation.EntityHelper; import com.azure.messaging.servicebus.implementation.ManagementConstants; +import com.azure.messaging.servicebus.implementation.MessageWithLockToken; import com.azure.messaging.servicebus.implementation.Messages; -import com.azure.messaging.servicebus.models.ServiceBusMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import org.apache.qpid.proton.Proton; import org.apache.qpid.proton.amqp.Binary; import org.apache.qpid.proton.amqp.Decimal128; @@ -37,6 +39,7 @@ import org.apache.qpid.proton.message.Message; import java.lang.reflect.Array; +import java.time.Duration; import java.time.Instant; import java.time.OffsetDateTime; import java.time.ZoneOffset; @@ -57,10 +60,16 @@ * Deserializes and serializes messages to and from Azure Service Bus. */ class ServiceBusMessageSerializer implements MessageSerializer { - + private static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; + private static final String ENQUEUED_TIME_UTC_NAME = "x-opt-enqueued-time"; + private static final String SCHEDULED_ENQUEUE_TIME_NAME = "x-opt-scheduled-enqueue-time"; + private static final String SEQUENCE_NUMBER_NAME = "x-opt-sequence-number"; + private static final String LOCKED_UNTIL_NAME = "x-opt-locked-until"; private static final String PARTITION_KEY_NAME = "x-opt-partition-key"; private static final String VIA_PARTITION_KEY_NAME = "x-opt-via-partition-key"; - private static final String SCHEDULED_ENQUEUE_TIME_NAME = "x-opt-scheduled-enqueue-time"; + private static final String DEAD_LETTER_SOURCE_NAME = "x-opt-deadletter-source"; + private static final String DEAD_LETTER_DESCRIPTION = "DeadLetterErrorDescription"; + private static final String DEAD_LETTER_REASON = "DeadLetterReason"; // This one appears to always be 0, but is always returned with each message. private static final String ENQUEUED_SEQUENCE_NUMBER = "x-opt-enqueue-sequence-number"; @@ -334,13 +343,12 @@ private List deserializeListOfMessages(Message amqpMe responseMessage.decode(messagePayLoad.getArray(), messagePayLoad.getArrayOffset(), messagePayLoad.getLength()); - UUID lockToken = null; + final ServiceBusReceivedMessage receivedMessage = deserializeMessage(responseMessage); // if amqp message have lockToken if (((Map) message).containsKey(ManagementConstants.LOCK_TOKEN_KEY)) { - lockToken = (UUID) ((Map) message).get(ManagementConstants.LOCK_TOKEN_KEY); + receivedMessage.setLockToken((UUID) ((Map) message).get(ManagementConstants.LOCK_TOKEN_KEY)); } - final ServiceBusReceivedMessage receivedMessage = deserializeMessage(responseMessage, lockToken); messageList.add(receivedMessage); } @@ -349,11 +357,152 @@ private List deserializeListOfMessages(Message amqpMe } private ServiceBusReceivedMessage deserializeMessage(Message amqpMessage) { - return EntityHelper.toModel(amqpMessage, null); - } + byte[] bytes = null; + final Section body = amqpMessage.getBody(); + if (body != null) { + //TODO (conniey): Support other AMQP types like AmqpValue and AmqpSequence. + if (body instanceof Data) { + final Binary messageData = ((Data) body).getValue(); + bytes = messageData.getArray(); + } else { + logger.warning(String.format(Messages.MESSAGE_NOT_OF_TYPE, body.getType())); + bytes = EMPTY_BYTE_ARRAY; + } + } else { + logger.warning(String.format(Messages.MESSAGE_NOT_OF_TYPE, "null")); + bytes = EMPTY_BYTE_ARRAY; + } + final ServiceBusReceivedMessage brokeredMessage = new ServiceBusReceivedMessage(bytes); + AmqpAnnotatedMessage brokeredAmqpAnnotatedMessage = brokeredMessage.getAmqpAnnotatedMessage(); + + // Application properties + ApplicationProperties applicationProperties = amqpMessage.getApplicationProperties(); + if (applicationProperties != null) { + final Map propertiesValue = applicationProperties.getValue(); + brokeredAmqpAnnotatedMessage.getApplicationProperties().putAll(propertiesValue); + } + + // Header + final AmqpMessageHeader brokeredHeader = brokeredAmqpAnnotatedMessage.getHeader(); + brokeredHeader.setTimeToLive(Duration.ofMillis(amqpMessage.getTtl())); + brokeredHeader.setDeliveryCount(amqpMessage.getDeliveryCount()); + brokeredHeader.setDurable(amqpMessage.getHeader().getDurable()); + brokeredHeader.setFirstAcquirer(amqpMessage.getHeader().getFirstAcquirer()); + brokeredHeader.setPriority(amqpMessage.getPriority()); + + // Footer + final Footer footer = amqpMessage.getFooter(); + if (footer != null && footer.getValue() != null) { + final Map footerValue = footer.getValue(); + brokeredAmqpAnnotatedMessage.getFooter().putAll(footerValue); + + } + + // Properties + final AmqpMessageProperties brokeredProperties = brokeredAmqpAnnotatedMessage.getProperties(); + brokeredProperties.setReplyToGroupId(amqpMessage.getReplyToGroupId()); + brokeredProperties.setReplyTo(amqpMessage.getReplyTo()); + final Object messageId = amqpMessage.getMessageId(); + if (messageId != null) { + brokeredProperties.setMessageId(messageId.toString()); + } + + brokeredProperties.setContentType(amqpMessage.getContentType()); + final Object correlationId = amqpMessage.getCorrelationId(); + if (correlationId != null) { + brokeredProperties.setCorrelationId(correlationId.toString()); + } + + final Properties amqpProperties = amqpMessage.getProperties(); + if (amqpProperties != null) { + brokeredProperties.setTo(amqpProperties.getTo()); + } + + brokeredProperties.setSubject(amqpMessage.getSubject()); + brokeredProperties.setReplyTo(amqpMessage.getReplyTo()); + brokeredProperties.setReplyToGroupId(amqpMessage.getReplyToGroupId()); + brokeredProperties.setGroupId(amqpMessage.getGroupId()); + brokeredProperties.setContentEncoding(amqpMessage.getContentEncoding()); + brokeredProperties.setGroupSequence(amqpMessage.getGroupSequence()); + brokeredProperties.setUserId(amqpMessage.getUserId()); + + // DeliveryAnnotations + final DeliveryAnnotations deliveryAnnotations = amqpMessage.getDeliveryAnnotations(); + if (deliveryAnnotations != null && deliveryAnnotations.getValue() != null) { + final Map deliveryAnnotationMap = deliveryAnnotations.getValue(); + if (deliveryAnnotationMap != null) { + for (Map.Entry entry : deliveryAnnotationMap.entrySet()) { + final String key = entry.getKey().toString(); + final Object value = entry.getValue(); + brokeredAmqpAnnotatedMessage.getDeliveryAnnotations().put(key, value); + } + } + } + + + // Message Annotations + final MessageAnnotations messageAnnotations = amqpMessage.getMessageAnnotations(); + if (messageAnnotations != null) { + Map messageAnnotationsMap = messageAnnotations.getValue(); + if (messageAnnotationsMap != null) { + for (Map.Entry entry : messageAnnotationsMap.entrySet()) { + final String key = entry.getKey().toString(); + final Object value = entry.getValue(); + brokeredAmqpAnnotatedMessage.getMessageAnnotations().put(key, value); + } + } + } + + // Message Annotations + /*final MessageAnnotations messageAnnotations = amqpMessage.getMessageAnnotations(); + if (messageAnnotations != null) { + Map messageAnnotationsMap = messageAnnotations.getValue(); + if (messageAnnotationsMap != null) { + for (Map.Entry entry : messageAnnotationsMap.entrySet()) { + final String key = entry.getKey().toString(); + final Object value = entry.getValue(); + + switch (key) { + case ENQUEUED_TIME_UTC_NAME: + brokeredMessage.setEnqueuedTime(((Date) value).toInstant().atOffset(ZoneOffset.UTC)); + + break; + case SCHEDULED_ENQUEUE_TIME_NAME: + brokeredMessage.setScheduledEnqueueTime(((Date) value).toInstant() + .atOffset(ZoneOffset.UTC)); + break; + case SEQUENCE_NUMBER_NAME: + brokeredMessage.setSequenceNumber((long) value); + break; + case LOCKED_UNTIL_NAME: + brokeredMessage.setLockedUntil(((Date) value).toInstant().atOffset(ZoneOffset.UTC)); + break; + case PARTITION_KEY_NAME: + brokeredMessage.setPartitionKey((String) value); + break; + case VIA_PARTITION_KEY_NAME: + brokeredMessage.setViaPartitionKey((String) value); + break; + case DEAD_LETTER_SOURCE_NAME: + brokeredMessage.setDeadLetterSource((String) value); + break; + case ENQUEUED_SEQUENCE_NUMBER: + brokeredMessage.setEnqueuedSequenceNumber((long) value); + break; + default: + logger.info("Unrecognised key: {}, value: {}", key, value); + break; + } + } + } + } + */ + + if (amqpMessage instanceof MessageWithLockToken) { + brokeredMessage.setLockToken(((MessageWithLockToken) amqpMessage).getLockToken()); + } - private ServiceBusReceivedMessage deserializeMessage(Message amqpMessage, UUID lockToken) { - return EntityHelper.toModel(amqpMessage, lockToken); + return brokeredMessage; } private static int getPayloadSize(Message msg) { diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/models/ServiceBusReceivedMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java similarity index 92% rename from sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/models/ServiceBusReceivedMessage.java rename to sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java index 72e1acecd783..fad614387b3b 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/models/ServiceBusReceivedMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.messaging.servicebus.models; +package com.azure.messaging.servicebus; import com.azure.core.amqp.models.AmqpAnnotatedMessage; import com.azure.core.amqp.models.AmqpDataBody; @@ -9,9 +9,9 @@ import com.azure.core.amqp.models.AmqpMessageProperties; import com.azure.core.amqp.models.BinaryData; import com.azure.core.util.logging.ClientLogger; -import com.azure.messaging.servicebus.implementation.EntityHelper; import com.azure.messaging.servicebus.implementation.MessageWithLockToken; import com.azure.messaging.servicebus.implementation.Messages; +import com.azure.messaging.servicebus.models.ReceiveMode; import org.apache.qpid.proton.amqp.Binary; import org.apache.qpid.proton.amqp.Symbol; import org.apache.qpid.proton.amqp.messaging.ApplicationProperties; @@ -56,33 +56,6 @@ public final class ServiceBusReceivedMessage { private AmqpAnnotatedMessage amqpAnnotatedMessage; private UUID lockToken; - static { - // This is used by classes in different packages to get access to private and package-private methods. - EntityHelper.setServiceBusReceivedMessageAccessor(new EntityHelper.ServiceBusReceivedMessageAccessor() { - - @Override - public ServiceBusReceivedMessage toModel(Message amqpMessage, UUID lockToken) { - ServiceBusReceivedMessage brokeredMessage = new ServiceBusReceivedMessage(amqpMessage); - if (lockToken != null) { - brokeredMessage.setLockToken(lockToken); - } - return brokeredMessage; - } - - @Override - public ServiceBusReceivedMessage toModel(byte[] data, long sequenceNumber) { - ServiceBusReceivedMessage brokeredMessage = new ServiceBusReceivedMessage(data); - brokeredMessage.setSequenceNumber(sequenceNumber); - return brokeredMessage; - } - - @Override - public void setLockedUntil(ServiceBusReceivedMessage message, OffsetDateTime lockedUntil) { - message.setLockedUntil(lockedUntil); - } - }); - } - /** * * @return @@ -627,36 +600,36 @@ public String getViaPartitionKey() { * * @see #getCorrelationId() */ - /*void setCorrelationId(String correlationId) { + void setCorrelationId(String correlationId) { amqpAnnotatedMessage.getProperties().setCorrelationId(correlationId); - }*/ + } /** * Sets the content type of the {@link ServiceBusReceivedMessage}. * * @param contentType of the message. */ - /*void setContentType(String contentType) { + void setContentType(String contentType) { amqpAnnotatedMessage.getProperties().setContentType(contentType); - }*/ + } /** * Sets the dead letter description. * * @param deadLetterErrorDescription Dead letter description. */ - /*void setDeadLetterErrorDescription(String deadLetterErrorDescription) { + void setDeadLetterErrorDescription(String deadLetterErrorDescription) { amqpAnnotatedMessage.getApplicationProperties().put(DEAD_LETTER_DESCRIPTION, deadLetterErrorDescription); - }/* + } /** * Sets the dead letter reason. * * @param deadLetterReason Dead letter reason. */ - /*void setDeadLetterReason(String deadLetterReason) { + void setDeadLetterReason(String deadLetterReason) { amqpAnnotatedMessage.getApplicationProperties().put(DEAD_LETTER_REASON, deadLetterReason); - }*/ + } /** * Sets the name of the queue or subscription that this message was enqueued on, before it was @@ -665,31 +638,34 @@ public String getViaPartitionKey() { * @param deadLetterSource the name of the queue or subscription that this message was enqueued on, * before it was deadlettered. */ - /*void setDeadLetterSource(String deadLetterSource) { + void setDeadLetterSource(String deadLetterSource) { amqpAnnotatedMessage.getApplicationProperties().put(DEAD_LETTER_SOURCE_NAME, deadLetterSource); - }*/ + } /** * Sets the number of the times this message was delivered to clients. * * @param deliveryCount the number of the times this message was delivered to clients. */ - /*void setDeliveryCount(long deliveryCount) { - this.deliveryCount = deliveryCount; - }*/ + void setDeliveryCount(long deliveryCount) { + amqpAnnotatedMessage.getHeader().setDeliveryCount(deliveryCount); + } - /* void setEnqueuedSequenceNumber(long enqueuedSequenceNumber) { + void setEnqueuedSequenceNumber(long enqueuedSequenceNumber) { amqpAnnotatedMessage.getMessageAnnotations().put(ENQUEUED_SEQUENCE_NUMBER, enqueuedSequenceNumber); - }/* + } /** * Sets the datetime at which this message was enqueued in Azure Service Bus. * * @param enqueuedTime the datetime at which this message was enqueued in Azure Service Bus. */ - /*void setEnqueuedTime(OffsetDateTime enqueuedTime) { - this.enqueuedTime = enqueuedTime; - }*/ + void setEnqueuedTime(OffsetDateTime enqueuedTime) { + if (enqueuedTime != null) { + long epochMilli = enqueuedTime.toInstant().toEpochMilli(); + amqpAnnotatedMessage.getMessageAnnotations().put(ENQUEUED_TIME_UTC_NAME, new Date(epochMilli)); + } + } /** * Sets the subject for the message. @@ -715,9 +691,10 @@ void setLockToken(UUID lockToken) { * @param lockedUntil the datetime at which the lock of this message expires. */ void setLockedUntil(OffsetDateTime lockedUntil) { - long epochMilli = lockedUntil.toInstant().toEpochMilli(); - final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - messageAnnotations.put(LOCKED_UNTIL_NAME, new Date(epochMilli)); + if (lockedUntil != null) { + long epochMilli = lockedUntil.toInstant().toEpochMilli(); + amqpAnnotatedMessage.getMessageAnnotations().put(LOCKED_UNTIL_NAME, new Date(epochMilli)); + } } /** @@ -725,9 +702,9 @@ void setLockedUntil(OffsetDateTime lockedUntil) { * * @param messageId to be set. */ - /*void setMessageId(String messageId) { + void setMessageId(String messageId) { amqpAnnotatedMessage.getProperties().setMessageId(messageId); - }*/ + } /** * Sets a partition key for sending a message to a partitioned entity @@ -736,9 +713,9 @@ void setLockedUntil(OffsetDateTime lockedUntil) { * * @see #getPartitionKey() */ - /*void setPartitionKey(String partitionKey) { + void setPartitionKey(String partitionKey) { amqpAnnotatedMessage.getMessageAnnotations().put(PARTITION_KEY_NAME, partitionKey); - }*/ + } /** * Sets the scheduled enqueue time of this message. @@ -747,9 +724,12 @@ void setLockedUntil(OffsetDateTime lockedUntil) { * * @see #getScheduledEnqueueTime() */ - /*void setScheduledEnqueueTime(OffsetDateTime scheduledEnqueueTime) { - this.scheduledEnqueueTime = scheduledEnqueueTime; - }*/ + void setScheduledEnqueueTime(OffsetDateTime scheduledEnqueueTime) { + if (scheduledEnqueueTime != null) { + long epochMilli = scheduledEnqueueTime.toInstant().toEpochMilli(); + amqpAnnotatedMessage.getMessageAnnotations().put(SCHEDULED_ENQUEUE_TIME_NAME, new Date(epochMilli)); + } + } /** * Sets the unique number assigned to a message by Service Bus. @@ -765,9 +745,9 @@ void setSequenceNumber(long sequenceNumber) { * * @param sessionId to be set. */ - /*void setSessionId(String sessionId) { + void setSessionId(String sessionId) { amqpAnnotatedMessage.getProperties().setGroupId(sessionId); - }*/ + } /** * Sets the duration of time before this message expires. @@ -776,9 +756,9 @@ void setSequenceNumber(long sequenceNumber) { * * @see #getTimeToLive() */ - /*void setTimeToLive(Duration timeToLive) { + void setTimeToLive(Duration timeToLive) { amqpAnnotatedMessage.getHeader().setTimeToLive(timeToLive); - }*/ + } /** * Sets the address of an entity to send replies to. @@ -787,18 +767,18 @@ void setSequenceNumber(long sequenceNumber) { * * @see #getReplyTo() */ - /*void setReplyTo(String replyTo) { + void setReplyTo(String replyTo) { amqpAnnotatedMessage.getProperties().setReplyTo(replyTo); - }*/ + } /** * Gets or sets a session identifier augmenting the {@link #getReplyTo() ReplyTo} address. * * @param replyToSessionId ReplyToSessionId property value of this message */ - /*void setReplyToSessionId(String replyToSessionId) { + void setReplyToSessionId(String replyToSessionId) { amqpAnnotatedMessage.getProperties().setReplyToGroupId(replyToSessionId); - }*/ + } /** * Sets the "to" address. @@ -810,9 +790,9 @@ void setSequenceNumber(long sequenceNumber) { * * @param to To property value of this message */ - /*void setTo(String to) { + void setTo(String to) { amqpAnnotatedMessage.getProperties().setTo(to); - }*/ + } /** * Sets a via-partition key for sending a message to a destination entity via another partitioned entity @@ -821,7 +801,7 @@ void setSequenceNumber(long sequenceNumber) { * * @see #getViaPartitionKey() */ - /*void setViaPartitionKey(String viaPartitionKey) { + void setViaPartitionKey(String viaPartitionKey) { amqpAnnotatedMessage.getMessageAnnotations().put(VIA_PARTITION_KEY_NAME, viaPartitionKey); - }*/ + } } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/models/ServiceBusReceivedMessageContext.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageContext.java similarity index 66% rename from sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/models/ServiceBusReceivedMessageContext.java rename to sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageContext.java index 9cc4ba409585..8d54ec717fbf 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/models/ServiceBusReceivedMessageContext.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageContext.java @@ -1,12 +1,8 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.messaging.servicebus.models; - -import com.azure.messaging.servicebus.implementation.EntityHelper; -import org.apache.qpid.proton.message.Message; +package com.azure.messaging.servicebus; import java.util.Objects; -import java.util.UUID; /** * Represents the result of a receive message operation with context from Service Bus. @@ -16,25 +12,6 @@ public class ServiceBusReceivedMessageContext { private final String sessionId; private final Throwable error; - static { - // This is used by classes in different packages to get access to private and package-private methods. - EntityHelper.setServiceBusReceivedMessageContextAccessor( - new EntityHelper.ServiceBusReceivedMessageContextAccessor() { - @Override - public ServiceBusReceivedMessageContext toModel(ServiceBusReceivedMessage message, String sessionId, - Throwable error) { - System.out.println("!!!! Init ServiceBusReceivedMessageContext toModel "); - ServiceBusReceivedMessageContext messageContext; - if (message != null) { - messageContext = new ServiceBusReceivedMessageContext(message); - } else { - messageContext = new ServiceBusReceivedMessageContext(sessionId, error); - } - return messageContext; - } - }); - } - /** * Creates an instance where a message was successfully received. * diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClient.java index f8a7c4f24260..510b877f43f5 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClient.java @@ -17,15 +17,12 @@ import com.azure.messaging.servicebus.ServiceBusClientBuilder.ServiceBusSessionReceiverClientBuilder; import com.azure.messaging.servicebus.administration.models.DeadLetterOptions; import com.azure.messaging.servicebus.implementation.DispositionStatus; -import com.azure.messaging.servicebus.implementation.EntityHelper; import com.azure.messaging.servicebus.implementation.LockContainer; import com.azure.messaging.servicebus.implementation.MessagingEntityType; import com.azure.messaging.servicebus.implementation.ServiceBusConnectionProcessor; import com.azure.messaging.servicebus.implementation.ServiceBusReceiveLink; import com.azure.messaging.servicebus.implementation.ServiceBusReceiveLinkProcessor; import com.azure.messaging.servicebus.models.ReceiveMode; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import reactor.core.publisher.BaseSubscriber; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -660,7 +657,9 @@ public Flux peekMessages(int maxMessages, String sess // the same sequence number. final Mono handle = messages .switchIfEmpty(Mono.fromCallable(() -> { - return EntityHelper.toModel(new byte[0], lastPeekedSequenceNumber.get()); + ServiceBusReceivedMessage emptyMessage = new ServiceBusReceivedMessage(new byte[0]); + emptyMessage.setSequenceNumber(lastPeekedSequenceNumber.get()); + return emptyMessage; })) .last() .handle((last, sink) -> { @@ -731,8 +730,7 @@ public Flux receiveMessages() { if (unnamedSessionManager != null) { return unnamedSessionManager.receive(); } else { - return getOrCreateConsumer().receive() - .map(message -> EntityHelper.toModel(message, null, null)); + return getOrCreateConsumer().receive().map(ServiceBusReceivedMessageContext::new); } } @@ -769,7 +767,7 @@ sessionId, getLinkName(sessionId), Collections.singleton(sequenceNumber)).last() return receivedMessage; } if (receiverOptions.getReceiveMode() == ReceiveMode.PEEK_LOCK) { - EntityHelper.setLockedUntil(receivedMessage, managementNodeLocks.addOrUpdate(receivedMessage.getLockToken(), + receivedMessage.setLockedUntil(managementNodeLocks.addOrUpdate(receivedMessage.getLockToken(), receivedMessage.getLockedUntil().toInstant(), receivedMessage.getLockedUntil()).atOffset(ZoneOffset.UTC)); } @@ -815,7 +813,7 @@ sessionId, getLinkName(sessionId), sequenceNumbers)) return receivedMessage; } if (receiverOptions.getReceiveMode() == ReceiveMode.PEEK_LOCK) { - EntityHelper.setLockedUntil(receivedMessage, managementNodeLocks.addOrUpdate(receivedMessage.getLockToken(), + receivedMessage.setLockedUntil(managementNodeLocks.addOrUpdate(receivedMessage.getLockToken(), receivedMessage.getLockedUntil().toInstant(), receivedMessage.getLockedUntil()).atOffset(ZoneOffset.UTC)); } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverClient.java index e7374448356b..6b68488da526 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceiverClient.java @@ -9,8 +9,6 @@ import com.azure.messaging.servicebus.ServiceBusClientBuilder.ServiceBusReceiverClientBuilder; import com.azure.messaging.servicebus.administration.models.DeadLetterOptions; import com.azure.messaging.servicebus.models.ReceiveMode; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import reactor.core.publisher.Flux; import reactor.core.publisher.FluxSink; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java index c134195bcf80..ffb3985056c0 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClient.java @@ -20,8 +20,6 @@ import com.azure.messaging.servicebus.implementation.MessagingEntityType; import com.azure.messaging.servicebus.implementation.ServiceBusConnectionProcessor; import com.azure.messaging.servicebus.models.CreateBatchOptions; -import com.azure.messaging.servicebus.models.ServiceBusMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import org.apache.qpid.proton.amqp.Binary; import org.apache.qpid.proton.amqp.messaging.MessageAnnotations; import org.apache.qpid.proton.amqp.transaction.TransactionalState; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderClient.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderClient.java index 51903769036b..ea978360464b 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderClient.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusSenderClient.java @@ -6,8 +6,6 @@ import com.azure.core.amqp.exception.AmqpException; import com.azure.core.annotation.ServiceClient; import com.azure.messaging.servicebus.models.CreateBatchOptions; -import com.azure.messaging.servicebus.models.ServiceBusMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import java.time.Duration; import java.time.OffsetDateTime; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/SynchronousMessageSubscriber.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/SynchronousMessageSubscriber.java index bbaee1389ea6..e296fb35b60a 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/SynchronousMessageSubscriber.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/SynchronousMessageSubscriber.java @@ -4,7 +4,6 @@ package com.azure.messaging.servicebus; import com.azure.core.util.logging.ClientLogger; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import org.reactivestreams.Subscription; import reactor.core.Disposable; import reactor.core.publisher.BaseSubscriber; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/SynchronousReceiveWork.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/SynchronousReceiveWork.java index 7042765d5d2a..afb2c04ca963 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/SynchronousReceiveWork.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/SynchronousReceiveWork.java @@ -4,7 +4,6 @@ package com.azure.messaging.servicebus; import com.azure.core.util.logging.ClientLogger; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import reactor.core.Disposable; import reactor.core.publisher.DirectProcessor; import reactor.core.publisher.Flux; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/UnnamedSessionManager.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/UnnamedSessionManager.java index 4d391b4ace0f..38a29130650a 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/UnnamedSessionManager.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/UnnamedSessionManager.java @@ -17,7 +17,6 @@ import com.azure.messaging.servicebus.implementation.ServiceBusConnectionProcessor; import com.azure.messaging.servicebus.implementation.ServiceBusManagementNode; import com.azure.messaging.servicebus.implementation.ServiceBusReceiveLink; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import org.apache.qpid.proton.amqp.transport.DeliveryState; import reactor.core.publisher.EmitterProcessor; import reactor.core.publisher.Flux; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/UnnamedSessionReceiver.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/UnnamedSessionReceiver.java index 1da872967631..cdd095b0b835 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/UnnamedSessionReceiver.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/UnnamedSessionReceiver.java @@ -6,12 +6,9 @@ import com.azure.core.amqp.implementation.MessageSerializer; import com.azure.core.util.CoreUtils; import com.azure.core.util.logging.ClientLogger; -import com.azure.messaging.servicebus.implementation.EntityHelper; import com.azure.messaging.servicebus.implementation.LockContainer; import com.azure.messaging.servicebus.implementation.ServiceBusConstants; import com.azure.messaging.servicebus.implementation.ServiceBusReceiveLink; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import org.apache.qpid.proton.amqp.transport.DeliveryState; import reactor.core.Disposable; import reactor.core.Disposables; @@ -88,12 +85,11 @@ class UnnamedSessionReceiver implements AutoCloseable { deserialized.getSessionId(), deserialized.getMessageId()); } - return EntityHelper.toModel(deserialized, null, null); + return new ServiceBusReceivedMessageContext(deserialized); }) .onErrorResume(error -> { logger.warning("sessionId[{}]. Error occurred. Ending session.", sessionId, error); - ; - return Mono.just(EntityHelper.toModel(null, getSessionId(), error)); + return Mono.just(new ServiceBusReceivedMessageContext(getSessionId(), error)); }) .doOnNext(context -> { if (context.hasError()) { diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CorrelationRuleFilter.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CorrelationRuleFilter.java index 8fd6cc39e17b..da66d912e9ad 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CorrelationRuleFilter.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CorrelationRuleFilter.java @@ -5,7 +5,7 @@ import com.azure.core.annotation.Fluent; import com.azure.core.util.logging.ClientLogger; -import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.ServiceBusMessage; import java.util.HashMap; import java.util.Map; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/RuleFilter.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/RuleFilter.java index 3797858f4423..a5158119f7cd 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/RuleFilter.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/RuleFilter.java @@ -3,7 +3,7 @@ package com.azure.messaging.servicebus.administration.models; -import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.ServiceBusMessage; /** * Describes a filter expression that is evaluated against a {@link ServiceBusMessage}. Filter is an abstract class with diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleAction.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleAction.java index c306d5290903..ecfe30598dab 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleAction.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleAction.java @@ -4,7 +4,7 @@ package com.azure.messaging.servicebus.administration.models; import com.azure.core.util.logging.ClientLogger; -import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.ServiceBusMessage; import java.util.HashMap; import java.util.Map; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleFilter.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleFilter.java index c1c05affacf1..32630779325c 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleFilter.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/SqlRuleFilter.java @@ -4,7 +4,7 @@ package com.azure.messaging.servicebus.administration.models; import com.azure.core.util.logging.ClientLogger; -import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.ServiceBusMessage; import java.util.HashMap; import java.util.Map; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/EntityHelper.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/EntityHelper.java index c38cea9eccc2..f92bc31b5169 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/EntityHelper.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/EntityHelper.java @@ -19,13 +19,8 @@ import com.azure.messaging.servicebus.implementation.models.RuleFilterImpl; import com.azure.messaging.servicebus.implementation.models.SubscriptionDescription; import com.azure.messaging.servicebus.implementation.models.TopicDescription; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; -import org.apache.qpid.proton.message.Message; -import java.time.OffsetDateTime; import java.util.Objects; -import java.util.UUID; /** * Used to access internal methods on {@link QueueProperties}. @@ -35,8 +30,6 @@ public final class EntityHelper { private static SubscriptionAccessor subscriptionAccessor; private static TopicAccessor topicAccessor; private static RuleAccessor ruleAccessor; - private static ServiceBusReceivedMessageAccessor receivedMessageAccessor; - private static ServiceBusReceivedMessageContextAccessor messageContextAccessor; static { try { @@ -45,10 +38,6 @@ public final class EntityHelper { SubscriptionProperties.class.getClassLoader()); Class.forName(TopicProperties.class.getName(), true, TopicProperties.class.getClassLoader()); Class.forName(RuleProperties.class.getName(), true, RuleProperties.class.getClassLoader()); - Class.forName(ServiceBusReceivedMessage.class.getName(), true, - ServiceBusReceivedMessage.class.getClassLoader()); - Class.forName(ServiceBusReceivedMessageContext.class.getName(), true, - ServiceBusReceivedMessageContext.class.getClassLoader()); } catch (ClassNotFoundException e) { throw new ClientLogger(EntityHelper.class).logExceptionAsError(new IllegalStateException(e)); } @@ -323,68 +312,6 @@ public static TopicProperties toModel(TopicDescription description) { return topicAccessor.toModel(description); } - /** - * Creates a new {@link ServiceBusReceivedMessage} given the options. - * - * @param amqpMessage to create {@link ServiceBusReceivedMessage} with. - * - * @return A new {@link ServiceBusReceivedMessage} with the set options. - */ - public static ServiceBusReceivedMessage toModel(Message amqpMessage, UUID lockToken) { - Objects.requireNonNull(amqpMessage, "'amqpMessage' cannot be null."); - - if (receivedMessageAccessor == null) { - throw new ClientLogger(EntityHelper.class).logExceptionAsError( - new IllegalStateException("'topicAccessor' should not be null.")); - } - - return receivedMessageAccessor.toModel(amqpMessage, lockToken); - } - - /** - * Creates a new {@link ServiceBusReceivedMessage} given the options. - * - * @param message to create {@link ServiceBusReceivedMessage} with. - * - * @return A new {@link ServiceBusReceivedMessage} with the set options. - */ - public static ServiceBusReceivedMessageContext toModel(ServiceBusReceivedMessage message, String sessionId, Throwable error) { - - if (messageContextAccessor == null) { - throw new ClientLogger(EntityHelper.class).logExceptionAsError( - new IllegalStateException("'topicAccessor' should not be null.")); - } - - return messageContextAccessor.toModel(message, sessionId, error); - } - - /** - * Creates a new {@link ServiceBusReceivedMessage} given the options. - * - * @param data to create {@link ServiceBusReceivedMessage} with. - * - * @return A new {@link ServiceBusReceivedMessage} with the set options. - */ - public static ServiceBusReceivedMessage toModel(byte[] data, long sequenceNumber) { - - if (receivedMessageAccessor == null) { - throw new ClientLogger(EntityHelper.class).logExceptionAsError( - new IllegalStateException("'topicAccessor' should not be null.")); - } - - return receivedMessageAccessor.toModel(data, sequenceNumber); - } - - public static void setLockedUntil(ServiceBusReceivedMessage message, - OffsetDateTime lockedUntil) { - - if (receivedMessageAccessor == null) { - throw new ClientLogger(EntityHelper.class).logExceptionAsError( - new IllegalStateException("'topicAccessor' should not be null.")); - } - - receivedMessageAccessor.setLockedUntil(message, lockedUntil); - } /** * Sets the queue accessor. * @@ -479,38 +406,6 @@ public static void setTopicAccessor(TopicAccessor accessor) { EntityHelper.topicAccessor = accessor; } - /** - * Sets the ServiceBusReceivedMessage accessor. - * - * @param accessor The ServiceBusReceivedMessage accessor to set. - */ - public static void setServiceBusReceivedMessageContextAccessor(ServiceBusReceivedMessageContextAccessor accessor) { - Objects.requireNonNull(accessor, "'accessor' cannot be null."); - - if (EntityHelper.messageContextAccessor != null) { - throw new ClientLogger(EntityHelper.class).logExceptionAsError(new IllegalStateException( - "'receivedMessageAccessor' is already set.")); - } - - EntityHelper.messageContextAccessor = accessor; - } - - - /** - * Sets the ServiceBusReceivedMessage accessor. - * - * @param accessor The ServiceBusReceivedMessage accessor to set. - */ - public static void setServiceBusReceivedMessageAccessor(ServiceBusReceivedMessageAccessor accessor) { - Objects.requireNonNull(accessor, "'accessor' cannot be null."); - - if (EntityHelper.receivedMessageAccessor != null) { - throw new ClientLogger(EntityHelper.class).logExceptionAsError(new IllegalStateException( - "'receivedMessageAccessor' is already set.")); - } - - EntityHelper.receivedMessageAccessor = accessor; - } /** * Sets the topic name on a {@link SubscriptionProperties}. * @@ -658,46 +553,4 @@ public interface TopicAccessor { */ void setName(TopicProperties topicProperties, String name); } - - /** - * Interface for accessing methods on a ServiceBusReceivedMessage. - */ - public interface ServiceBusReceivedMessageAccessor { - /** - * Sets properties on the ServiceBusReceivedMessage based on the TODO. - * - * @param amqpMessage The implementation topic. - * - * @return A new {@link ServiceBusReceivedMessage} with the properties set. - */ - ServiceBusReceivedMessage toModel(Message amqpMessage, UUID lockToken); - - /** - * - * @param data - * @param sequenceNumber - * @return - */ - ServiceBusReceivedMessage toModel(byte[] data, long sequenceNumber); - - /** - * - * @param lockedUntil - */ - void setLockedUntil(ServiceBusReceivedMessage message, OffsetDateTime lockedUntil); - } - - /** - * Interface for accessing methods on a ServiceBusReceivedMessage. - */ - public interface ServiceBusReceivedMessageContextAccessor { - /** - * Sets properties on the ServiceBusReceivedMessage based on the TODO. - * - * @param message The {@link ServiceBusReceivedMessage} message. - * - * @return A new {@link ServiceBusReceivedMessage} with the properties set. - */ - ServiceBusReceivedMessageContext toModel(ServiceBusReceivedMessage message, String sessionId, Throwable error); - } } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/ManagementChannel.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/ManagementChannel.java index 5d6900ee84f1..a190f6ac64f4 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/ManagementChannel.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/ManagementChannel.java @@ -14,8 +14,8 @@ import com.azure.core.amqp.implementation.TokenManager; import com.azure.core.util.CoreUtils; import com.azure.core.util.logging.ClientLogger; -import com.azure.messaging.servicebus.models.ServiceBusMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.ServiceBusMessage; +import com.azure.messaging.servicebus.ServiceBusReceivedMessage; import com.azure.messaging.servicebus.ServiceBusTransactionContext; import com.azure.messaging.servicebus.models.ReceiveMode; import org.apache.qpid.proton.Proton; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/MessageManagementOperations.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/MessageManagementOperations.java index bbbc003532bb..28f355b2689b 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/MessageManagementOperations.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/MessageManagementOperations.java @@ -2,7 +2,7 @@ // Licensed under the MIT License. package com.azure.messaging.servicebus.implementation; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.ServiceBusReceivedMessage; import com.azure.messaging.servicebus.models.ReceiveMode; import org.apache.qpid.proton.amqp.transport.DeliveryState; import reactor.core.publisher.Mono; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/ServiceBusManagementNode.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/ServiceBusManagementNode.java index 8b058b60820f..2e9013600bd9 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/ServiceBusManagementNode.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/implementation/ServiceBusManagementNode.java @@ -3,8 +3,8 @@ package com.azure.messaging.servicebus.implementation; -import com.azure.messaging.servicebus.models.ServiceBusMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.ServiceBusMessage; +import com.azure.messaging.servicebus.ServiceBusReceivedMessage; import com.azure.messaging.servicebus.ServiceBusTransactionContext; import com.azure.messaging.servicebus.models.ReceiveMode; import reactor.core.publisher.Flux; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReadmeSamples.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReadmeSamples.java index 4f6eb3055100..0cfba9e9b9b9 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReadmeSamples.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReadmeSamples.java @@ -7,9 +7,6 @@ import com.azure.core.util.IterableStream; import com.azure.identity.DefaultAzureCredentialBuilder; import com.azure.messaging.servicebus.models.ReceiveMode; -import com.azure.messaging.servicebus.models.ServiceBusMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import com.azure.messaging.servicebus.models.SubQueue; import reactor.core.Disposable; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAndSettleAsyncSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAndSettleAsyncSample.java index f63d43e42bcb..ec726665da7e 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAndSettleAsyncSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAndSettleAsyncSample.java @@ -3,7 +3,6 @@ package com.azure.messaging.servicebus; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import reactor.core.Disposable; import java.util.concurrent.TimeUnit; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAsyncSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAsyncSample.java index 1b104f092f67..15f86ff3f671 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAsyncSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAsyncSample.java @@ -3,7 +3,6 @@ package com.azure.messaging.servicebus; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import reactor.core.Disposable; import java.time.Instant; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAutoLockRenewal.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAutoLockRenewal.java index a9b5f77e8000..39ca5c8138d3 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAutoLockRenewal.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAutoLockRenewal.java @@ -3,7 +3,6 @@ package com.azure.messaging.servicebus; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import reactor.core.Disposable; import java.time.Duration; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAzureIdentityAsyncSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAzureIdentityAsyncSample.java index 9e8785d0a466..48266a9c9b0f 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAzureIdentityAsyncSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageAzureIdentityAsyncSample.java @@ -5,7 +5,6 @@ import com.azure.core.credential.TokenCredential; import com.azure.identity.DefaultAzureCredentialBuilder; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import reactor.core.Disposable; import java.util.concurrent.TimeUnit; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageSyncSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageSyncSample.java index 885fadb13e77..487b6ed02f11 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageSyncSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveMessageSyncSample.java @@ -4,9 +4,6 @@ package com.azure.messaging.servicebus; import com.azure.core.util.IterableStream; -import com.azure.messaging.servicebus.models.ServiceBusMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; /** * Sample demonstrates how to receive a batch of {@link ServiceBusReceivedMessage} from an Azure Service Bus Queue using diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveNamedSessionSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveNamedSessionSample.java index 8d231debbb33..7e71405c23bf 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveNamedSessionSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ReceiveNamedSessionSample.java @@ -4,8 +4,6 @@ package com.azure.messaging.servicebus; import com.azure.core.util.IterableStream; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import reactor.core.publisher.Mono; import java.time.Duration; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendAndReceiveSessionMessageSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendAndReceiveSessionMessageSample.java index d921ecbdefa6..a6cbef6fb3bb 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendAndReceiveSessionMessageSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendAndReceiveSessionMessageSample.java @@ -4,8 +4,6 @@ package com.azure.messaging.servicebus; import com.azure.messaging.servicebus.models.ReceiveMode; -import com.azure.messaging.servicebus.models.ServiceBusMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import reactor.core.publisher.Mono; import java.util.Arrays; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageAsyncSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageAsyncSample.java index ca0511e901fd..0d2b7d558dd9 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageAsyncSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageAsyncSample.java @@ -3,8 +3,6 @@ package com.azure.messaging.servicebus; -import com.azure.messaging.servicebus.models.ServiceBusMessage; - import java.util.concurrent.TimeUnit; import static java.nio.charset.StandardCharsets.UTF_8; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageBatchSyncSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageBatchSyncSample.java index 3ca0bae9261d..3af5ae300460 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageBatchSyncSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageBatchSyncSample.java @@ -4,7 +4,6 @@ package com.azure.messaging.servicebus; import com.azure.messaging.servicebus.models.CreateBatchOptions; -import com.azure.messaging.servicebus.models.ServiceBusMessage; import java.util.Arrays; import java.util.List; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageWithAzureIdentityAsyncSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageWithAzureIdentityAsyncSample.java index 4da39b794b49..11cc4b295543 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageWithAzureIdentityAsyncSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendMessageWithAzureIdentityAsyncSample.java @@ -5,7 +5,6 @@ import com.azure.core.credential.TokenCredential; import com.azure.identity.DefaultAzureCredentialBuilder; -import com.azure.messaging.servicebus.models.ServiceBusMessage; import java.util.UUID; import java.util.concurrent.TimeUnit; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendScheduledMessageAndCancelAsyncSample.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendScheduledMessageAndCancelAsyncSample.java index e67d27a6fbc5..ecea37ffe80d 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendScheduledMessageAndCancelAsyncSample.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/SendScheduledMessageAndCancelAsyncSample.java @@ -3,8 +3,6 @@ package com.azure.messaging.servicebus; -import com.azure.messaging.servicebus.models.ServiceBusMessage; - import java.time.OffsetDateTime; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientJavaDocCodeSamples.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientJavaDocCodeSamples.java index 30808039bba3..5ac5b56af161 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientJavaDocCodeSamples.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientJavaDocCodeSamples.java @@ -5,8 +5,6 @@ import com.azure.identity.DefaultAzureCredentialBuilder; import com.azure.messaging.servicebus.models.ReceiveMode; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import org.reactivestreams.Subscription; import reactor.core.Disposable; import reactor.core.publisher.BaseSubscriber; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientJavaDocCodeSamples.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientJavaDocCodeSamples.java index f86659fbc068..a9dadc7bc03a 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientJavaDocCodeSamples.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientJavaDocCodeSamples.java @@ -5,7 +5,6 @@ import com.azure.identity.DefaultAzureCredentialBuilder; import com.azure.messaging.servicebus.models.CreateBatchOptions; -import com.azure.messaging.servicebus.models.ServiceBusMessage; import reactor.core.Exceptions; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderClientJavaDocCodeSamples.java b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderClientJavaDocCodeSamples.java index 395c13417020..b9506539e082 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderClientJavaDocCodeSamples.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/samples/java/com/azure/messaging/servicebus/ServiceBusSenderClientJavaDocCodeSamples.java @@ -4,7 +4,6 @@ package com.azure.messaging.servicebus; import com.azure.messaging.servicebus.models.CreateBatchOptions; -import com.azure.messaging.servicebus.models.ServiceBusMessage; import java.util.Arrays; import java.util.List; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java index aa9ec854dd93..53d079509be5 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java @@ -20,9 +20,6 @@ import com.azure.messaging.servicebus.ServiceBusClientBuilder.ServiceBusSessionReceiverClientBuilder; import com.azure.messaging.servicebus.implementation.DispositionStatus; import com.azure.messaging.servicebus.implementation.MessagingEntityType; -import com.azure.messaging.servicebus.models.ServiceBusMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxyReceiveTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxyReceiveTest.java index 9dc03917125b..e39f6e69b18e 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxyReceiveTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxyReceiveTest.java @@ -8,7 +8,6 @@ import com.azure.messaging.servicebus.jproxy.ProxyServer; import com.azure.messaging.servicebus.jproxy.SimpleProxy; import com.azure.messaging.servicebus.models.ReceiveMode; -import com.azure.messaging.servicebus.models.ServiceBusMessage; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxySelectorTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxySelectorTest.java index 2bb81b7933e7..9b66a3755659 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxySelectorTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxySelectorTest.java @@ -6,7 +6,6 @@ import com.azure.core.amqp.AmqpRetryOptions; import com.azure.core.amqp.AmqpTransportType; import com.azure.core.util.logging.ClientLogger; -import com.azure.messaging.servicebus.models.ServiceBusMessage; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxySendTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxySendTest.java index fe34229751ba..e6cbc257087b 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxySendTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ProxySendTest.java @@ -8,7 +8,6 @@ import com.azure.core.util.logging.ClientLogger; import com.azure.messaging.servicebus.jproxy.ProxyServer; import com.azure.messaging.servicebus.jproxy.SimpleProxy; -import com.azure.messaging.servicebus.models.ServiceBusMessage; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusAsyncConsumerTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusAsyncConsumerTest.java index 64cc1ef4ca9a..aa1ae3a2c413 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusAsyncConsumerTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusAsyncConsumerTest.java @@ -11,7 +11,6 @@ import com.azure.messaging.servicebus.implementation.ServiceBusReceiveLink; import com.azure.messaging.servicebus.implementation.ServiceBusReceiveLinkProcessor; import com.azure.messaging.servicebus.models.ReceiveMode; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import org.apache.qpid.proton.amqp.transport.DeliveryState; import org.apache.qpid.proton.message.Message; import org.junit.jupiter.api.AfterAll; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageBatchTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageBatchTest.java index 7d9873f57076..d5d28cf18fba 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageBatchTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageBatchTest.java @@ -9,9 +9,6 @@ import com.azure.core.amqp.implementation.ErrorContextProvider; import com.azure.core.amqp.implementation.MessageSerializer; import com.azure.core.amqp.implementation.TracerProvider; -import com.azure.messaging.servicebus.ServiceBusMessageBatch; -import com.azure.messaging.servicebus.ServiceBusMessageSerializer; -import com.azure.messaging.servicebus.models.ServiceBusMessage; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageSerializerTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageSerializerTest.java index fa8358254b1c..dc514c03606d 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageSerializerTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageSerializerTest.java @@ -4,9 +4,6 @@ package com.azure.messaging.servicebus; import com.azure.core.amqp.exception.AmqpResponseCode; -import com.azure.messaging.servicebus.models.ServiceBusMessage; -import com.azure.messaging.servicebus.ServiceBusMessageSerializer; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import org.apache.qpid.proton.Proton; import org.apache.qpid.proton.amqp.messaging.AmqpValue; import org.apache.qpid.proton.amqp.messaging.ApplicationProperties; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/models/ServiceBusMessageTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java similarity index 95% rename from sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/models/ServiceBusMessageTest.java rename to sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java index 6f9ea171ac36..ff9385243e53 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/models/ServiceBusMessageTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java @@ -1,9 +1,9 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.messaging.servicebus.models; +package com.azure.messaging.servicebus; -import com.azure.messaging.servicebus.models.ServiceBusMessage; +import com.azure.messaging.servicebus.ServiceBusMessage; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/models/ServiceBusReceivedMessageTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java similarity index 95% rename from sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/models/ServiceBusReceivedMessageTest.java rename to sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java index 79865c4af3cd..9e3155cdf1e8 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/models/ServiceBusReceivedMessageTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java @@ -1,18 +1,16 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. -package com.azure.messaging.servicebus.models; +package com.azure.messaging.servicebus; -import com.azure.messaging.servicebus.models.ServiceBusMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; +import com.azure.messaging.servicebus.ServiceBusMessage; +import com.azure.messaging.servicebus.ServiceBusReceivedMessage; import org.apache.qpid.proton.amqp.Binary; import org.apache.qpid.proton.amqp.messaging.Data; import org.apache.qpid.proton.message.Message; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import java.time.Duration; - import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java index 82af6e076d57..4cdd65e4f4e2 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java @@ -4,19 +4,13 @@ package com.azure.messaging.servicebus; import com.azure.core.amqp.models.AmqpAnnotatedMessage; -import com.azure.core.amqp.models.AmqpBodyType; import com.azure.core.amqp.models.AmqpDataBody; -import com.azure.core.amqp.models.AmqpMessageBody; import com.azure.core.amqp.models.BinaryData; -import com.azure.core.util.IterableStream; import com.azure.core.util.logging.ClientLogger; import com.azure.messaging.servicebus.administration.models.DeadLetterOptions; import com.azure.messaging.servicebus.implementation.DispositionStatus; import com.azure.messaging.servicebus.implementation.MessagingEntityType; import com.azure.messaging.servicebus.models.ReceiveMode; -import com.azure.messaging.servicebus.models.ServiceBusMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import com.azure.messaging.servicebus.models.SubQueue; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Disabled; @@ -979,6 +973,7 @@ void receiveAndValidateProperties(MessagingEntityType entityType) { final Map aplicaitonProperties = new HashMap<>(); footer.put("ap-key-1", "ap-value-1"); + footer.put("ap-key-2", "ap-value-2"); final Map deliveryAnnotation = new HashMap<>(); deliveryAnnotation.put("delivery-annotations-key-1", "delivery-annotations-value-1"); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientTest.java index 3ea1c6f814db..a0e6f6d2ef81 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientTest.java @@ -23,7 +23,6 @@ import com.azure.messaging.servicebus.implementation.ServiceBusManagementNode; import com.azure.messaging.servicebus.implementation.ServiceBusReactorReceiver; import com.azure.messaging.servicebus.models.ReceiveMode; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import org.apache.qpid.proton.amqp.messaging.Rejected; import org.apache.qpid.proton.amqp.transport.DeliveryState.DeliveryStateType; import org.apache.qpid.proton.message.Message; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientIntegrationTest.java index 62986900c7ec..3ca0041e90ff 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientIntegrationTest.java @@ -9,9 +9,6 @@ import com.azure.messaging.servicebus.implementation.DispositionStatus; import com.azure.messaging.servicebus.implementation.MessagingEntityType; import com.azure.messaging.servicebus.models.ReceiveMode; -import com.azure.messaging.servicebus.models.ServiceBusMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; @@ -38,7 +35,7 @@ import static org.junit.jupiter.api.Assertions.fail; /** - * Integration tests for {@link ServiceBusReceiverClient} from queues or subscriptions. + * Integration tests for {@link com.azure.messaging.servicebus.ServiceBusReceiverClient} from queues or subscriptions. */ @Tag("integration") class ServiceBusReceiverClientIntegrationTest extends IntegrationTestBase { diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientTest.java index 5ee93749a877..c200b1f0fcf5 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverClientTest.java @@ -6,10 +6,7 @@ import com.azure.core.util.IterableStream; import com.azure.core.util.logging.ClientLogger; import com.azure.messaging.servicebus.administration.models.DeadLetterOptions; -import com.azure.messaging.servicebus.implementation.EntityHelper; import com.azure.messaging.servicebus.models.ReceiveMode; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -587,8 +584,8 @@ void receiveMessagesWithUserSpecifiedTimeout() { } for (int i = 0; i < numberToEmit; i++) { - ServiceBusReceivedMessageContext context = EntityHelper.toModel( - mock(ServiceBusReceivedMessage.class), null, null); + ServiceBusReceivedMessageContext context = new ServiceBusReceivedMessageContext( + mock(ServiceBusReceivedMessage.class)); sink.next(context); final int emit = emittedMessages.incrementAndGet(); @@ -634,7 +631,7 @@ void receiveMessagesMax() { } for (int i = 0; i < numberToEmit; i++) { - sink.next(EntityHelper.toModel(mock(ServiceBusReceivedMessage.class), null, null)); + sink.next(new ServiceBusReceivedMessageContext(mock(ServiceBusReceivedMessage.class))); final int emit = emittedMessages.incrementAndGet(); if (emit >= numberToEmit) { @@ -681,7 +678,7 @@ void receiveMessagesTimeout() { } for (int i = 0; i < numberToEmit; i++) { - sink.next(EntityHelper.toModel(mock(ServiceBusReceivedMessage.class), null, null)); + sink.next(new ServiceBusReceivedMessageContext(mock(ServiceBusReceivedMessage.class))); final int emit = emittedMessages.incrementAndGet(); if (emit >= numberToEmit) { diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientIntegrationTest.java index c02de04bfa45..8451816b517e 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientIntegrationTest.java @@ -7,7 +7,6 @@ import com.azure.messaging.servicebus.implementation.MessagingEntityType; import com.azure.messaging.servicebus.models.CreateBatchOptions; import com.azure.messaging.servicebus.models.ReceiveMode; -import com.azure.messaging.servicebus.models.ServiceBusMessage; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientTest.java index 8b19163629a1..c7dc1b146126 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientTest.java @@ -23,8 +23,6 @@ import com.azure.messaging.servicebus.implementation.ServiceBusConnectionProcessor; import com.azure.messaging.servicebus.implementation.ServiceBusManagementNode; import com.azure.messaging.servicebus.models.CreateBatchOptions; -import com.azure.messaging.servicebus.models.ServiceBusMessage; -import com.azure.messaging.servicebus.ServiceBusMessageSerializer; import org.apache.qpid.proton.amqp.messaging.Section; import org.apache.qpid.proton.amqp.transaction.TransactionalState; import org.apache.qpid.proton.amqp.transport.DeliveryState; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderClientIntegrationTest.java index 9cbd74649000..e4440492fc37 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderClientIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderClientIntegrationTest.java @@ -7,7 +7,6 @@ import com.azure.messaging.servicebus.implementation.MessagingEntityType; import com.azure.messaging.servicebus.models.CreateBatchOptions; import com.azure.messaging.servicebus.models.ReceiveMode; -import com.azure.messaging.servicebus.models.ServiceBusMessage; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Tag; import org.junit.jupiter.params.ParameterizedTest; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderClientTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderClientTest.java index daedd7513d7a..0e3b112ad94f 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderClientTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderClientTest.java @@ -4,7 +4,6 @@ package com.azure.messaging.servicebus; import com.azure.messaging.servicebus.models.CreateBatchOptions; -import com.azure.messaging.servicebus.models.ServiceBusMessage; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java index 4e540924cc8f..a898c8c2734e 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java @@ -5,8 +5,6 @@ import com.azure.core.amqp.exception.AmqpResponseCode; import com.azure.core.util.CoreUtils; -import com.azure.messaging.servicebus.models.ServiceBusMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; import org.apache.qpid.proton.Proton; import org.apache.qpid.proton.amqp.Binary; import org.apache.qpid.proton.amqp.Symbol; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/UnnamedSessionManagerIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/UnnamedSessionManagerIntegrationTest.java index 56a355e4dc58..bc6497a1320a 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/UnnamedSessionManagerIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/UnnamedSessionManagerIntegrationTest.java @@ -8,9 +8,6 @@ import com.azure.core.util.logging.ClientLogger; import com.azure.messaging.servicebus.ServiceBusClientBuilder.ServiceBusSessionReceiverClientBuilder; import com.azure.messaging.servicebus.implementation.MessagingEntityType; -import com.azure.messaging.servicebus.models.ServiceBusMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/UnnamedSessionManagerTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/UnnamedSessionManagerTest.java index 04f3f323d24d..d466ca795916 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/UnnamedSessionManagerTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/UnnamedSessionManagerTest.java @@ -19,8 +19,6 @@ import com.azure.messaging.servicebus.implementation.ServiceBusManagementNode; import com.azure.messaging.servicebus.implementation.ServiceBusReceiveLink; import com.azure.messaging.servicebus.models.ReceiveMode; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessage; -import com.azure.messaging.servicebus.models.ServiceBusReceivedMessageContext; import org.apache.qpid.proton.amqp.messaging.Accepted; import org.apache.qpid.proton.message.Message; import org.junit.jupiter.api.AfterAll; From a4100f01734e60d08ba45e9403fc908a72f22ea2 Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Fri, 4 Sep 2020 14:31:26 -0700 Subject: [PATCH 08/27] Draft implementation --- .../servicebus/ServiceBusMessage.java | 13 +++++++-- .../servicebus/IntegrationTestBase.java | 28 ------------------- ...BusReceiverAsyncClientIntegrationTest.java | 28 +++++++++++++++++++ 3 files changed, 39 insertions(+), 30 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java index 0c07f8378478..6a1918d82654 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java @@ -8,6 +8,7 @@ import com.azure.core.amqp.models.AmqpDataBody; import com.azure.core.amqp.models.BinaryData; import com.azure.core.util.Context; +import com.azure.core.util.logging.ClientLogger; import java.nio.charset.StandardCharsets; import java.time.Duration; @@ -44,8 +45,11 @@ public class ServiceBusMessage { private static final String SCHEDULED_ENQUEUE_TIME_NAME = "x-opt-scheduled-enqueue-time"; private static final String VIA_PARTITION_KEY_NAME = "x-opt-via-partition-key"; - private Context context; + private static final String PARTITION_KEY_NAME = "x-opt-partition-key"; private final AmqpAnnotatedMessage amqpAnnotatedMessage; + private final ClientLogger logger = new ClientLogger(ServiceBusMessage.class); + + private Context context; /** * Creates a {@link ServiceBusMessage} with a {@link java.nio.charset.StandardCharsets#UTF_8 UTF_8} encoded body. @@ -140,7 +144,13 @@ public byte[] getBody() { body = Arrays.copyOf(firstData, firstData.length); } break; + case SEQUENCE: + case VALUE: + throw logger.logThrowableAsError(new UnsupportedOperationException("Not supported AmqpBodyType: " + + amqpAnnotatedMessage.getBody().getBodyType())); default: + throw logger.logThrowableAsError(new IllegalArgumentException("Unknown AmqpBodyType: " + + amqpAnnotatedMessage.getBody().getBodyType())); } return body; } @@ -247,7 +257,6 @@ public ServiceBusMessage setMessageId(String messageId) { * @see Partitioned * entities */ - private static final String PARTITION_KEY_NAME = "x-opt-partition-key"; public String getPartitionKey() { return (String)amqpAnnotatedMessage.getMessageAnnotations().get(PARTITION_KEY_NAME); } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java index 53d079509be5..495dccf0386c 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java @@ -421,34 +421,6 @@ protected void dispose(AutoCloseable... closeables) { } } - protected ServiceBusMessage getMessage(String messageId, boolean isSessionEnabled, AmqpAnnotatedMessage amqpPropertiesToSet) { - - final ServiceBusMessage message = TestUtils.getServiceBusMessage(CONTENTS_BYTES, messageId); - - message.getAmqpAnnotatedMessage().getMessageAnnotations().putAll(amqpPropertiesToSet.getMessageAnnotations()); - - message.getAmqpAnnotatedMessage().getApplicationProperties().putAll(amqpPropertiesToSet.getApplicationProperties()); - - message.getAmqpAnnotatedMessage().getDeliveryAnnotations().putAll(amqpPropertiesToSet.getDeliveryAnnotations()); - - message.getAmqpAnnotatedMessage().getFooter().putAll(amqpPropertiesToSet.getFooter()); - - message.getAmqpAnnotatedMessage().getHeader().setFirstAcquirer(amqpPropertiesToSet.getHeader().getFirstAcquirer()); - message.getAmqpAnnotatedMessage().getHeader().setDurable(amqpPropertiesToSet.getHeader().getDurable()); - message.getAmqpAnnotatedMessage().getHeader().setDeliveryCount(amqpPropertiesToSet.getHeader().getDeliveryCount()); - message.getAmqpAnnotatedMessage().getHeader().setPriority(amqpPropertiesToSet.getHeader().getPriority()); - - - message.getAmqpAnnotatedMessage().getProperties().setReplyTo((amqpPropertiesToSet.getProperties().getReplyTo())); - message.getAmqpAnnotatedMessage().getProperties().setAbsoluteExpiryTime((amqpPropertiesToSet.getProperties().getAbsoluteExpiryTime())); - message.getAmqpAnnotatedMessage().getProperties().setSubject((amqpPropertiesToSet.getProperties().getSubject())); - message.getAmqpAnnotatedMessage().getProperties().setContentType(amqpPropertiesToSet.getProperties().getContentType()); - message.getAmqpAnnotatedMessage().getProperties().setCorrelationId(amqpPropertiesToSet.getProperties().getCorrelationId()); - - logger.verbose("Message id {}.", messageId); - return isSessionEnabled ? message.setSessionId(sessionId) : message; - } - protected ServiceBusMessage getMessage(String messageId, boolean isSessionEnabled) { final ServiceBusMessage message = TestUtils.getServiceBusMessage(CONTENTS_BYTES, messageId); logger.verbose("Message id {}.", messageId); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java index 4cdd65e4f4e2..345f2a5a67fe 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java @@ -1121,4 +1121,32 @@ private ServiceBusClientBuilder.ServiceBusReceiverClientBuilder getDeadLetterRec } } + + protected ServiceBusMessage getMessage(String messageId, boolean isSessionEnabled, AmqpAnnotatedMessage amqpPropertiesToSet) { + + final ServiceBusMessage message = TestUtils.getServiceBusMessage(CONTENTS_BYTES, messageId); + + message.getAmqpAnnotatedMessage().getMessageAnnotations().putAll(amqpPropertiesToSet.getMessageAnnotations()); + + message.getAmqpAnnotatedMessage().getApplicationProperties().putAll(amqpPropertiesToSet.getApplicationProperties()); + + message.getAmqpAnnotatedMessage().getDeliveryAnnotations().putAll(amqpPropertiesToSet.getDeliveryAnnotations()); + + message.getAmqpAnnotatedMessage().getFooter().putAll(amqpPropertiesToSet.getFooter()); + + message.getAmqpAnnotatedMessage().getHeader().setFirstAcquirer(amqpPropertiesToSet.getHeader().getFirstAcquirer()); + message.getAmqpAnnotatedMessage().getHeader().setDurable(amqpPropertiesToSet.getHeader().getDurable()); + message.getAmqpAnnotatedMessage().getHeader().setDeliveryCount(amqpPropertiesToSet.getHeader().getDeliveryCount()); + message.getAmqpAnnotatedMessage().getHeader().setPriority(amqpPropertiesToSet.getHeader().getPriority()); + + + message.getAmqpAnnotatedMessage().getProperties().setReplyTo((amqpPropertiesToSet.getProperties().getReplyTo())); + message.getAmqpAnnotatedMessage().getProperties().setAbsoluteExpiryTime((amqpPropertiesToSet.getProperties().getAbsoluteExpiryTime())); + message.getAmqpAnnotatedMessage().getProperties().setSubject((amqpPropertiesToSet.getProperties().getSubject())); + message.getAmqpAnnotatedMessage().getProperties().setContentType(amqpPropertiesToSet.getProperties().getContentType()); + message.getAmqpAnnotatedMessage().getProperties().setCorrelationId(amqpPropertiesToSet.getProperties().getCorrelationId()); + + logger.verbose("Message id {}.", messageId); + return isSessionEnabled ? message.setSessionId(sessionId) : message; + } } From 6614ebdb7d7c11eebf8c709d42386a6be0eeaece Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Fri, 4 Sep 2020 14:45:14 -0700 Subject: [PATCH 09/27] Removed commented code --- .../azure/core/amqp/models/AmqpDataBody.java | 7 +-- .../core/amqp/models/AmqpMessageHeader.java | 4 +- .../azure/core/amqp/models/BinaryData.java | 2 +- .../amqp/models/AmqpAnnotatedMessageTest.java | 4 +- .../ServiceBusMessageSerializer.java | 45 ------------------- 5 files changed, 10 insertions(+), 52 deletions(-) diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java index 237388304008..734dbef05e6d 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java @@ -5,18 +5,20 @@ import com.azure.core.util.IterableStream; +import java.util.Objects; + /** * */ -public class AmqpDataBody implements AmqpMessageBody { +public final class AmqpDataBody implements AmqpMessageBody { private final AmqpBodyType bodyType; private final IterableStream data; /** - * * @param data to be set. */ public AmqpDataBody(Iterable data) { + Objects.requireNonNull(data, "'data' cannot be null."); this.data = new IterableStream<>(data); this.bodyType = AmqpBodyType.DATA; } @@ -27,7 +29,6 @@ public AmqpBodyType getBodyType() { } /** - * * @return data. */ public IterableStream getData() { diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java index 689af2eff605..8d0a4312b093 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java @@ -16,7 +16,7 @@ public class AmqpMessageHeader { private Long deliveryCount; private Boolean durable; private Boolean firstAcquirer; - private short priority; + private Short priority; private Duration timeToLive; AmqpMessageHeader() { @@ -87,7 +87,7 @@ public AmqpMessageHeader setFirstAcquirer(Boolean firstAcquirer) { * Gets the priority on {@code amqpMessage}. * @return the priority. */ - public short getPriority() { + public Short getPriority() { return this.priority; } diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java index 67955aaa2952..c808c26958b7 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java @@ -9,7 +9,7 @@ /** * Binary representation of amqp message body. */ -public class BinaryData { +public final class BinaryData { private final byte[] data; /** *Create {@link BinaryData} instance with given byte array data. diff --git a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java index 4ee2e21e56ca..556e64eda361 100644 --- a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java +++ b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java @@ -39,7 +39,9 @@ public void constructorValidValues() { Assertions.assertNotNull(actual.getMessageAnnotations()); Assertions.assertNotNull(actual.getApplicationProperties()); - List dataList = ((AmqpDataBody)actual.getBody()).getData().stream().collect(Collectors.toList()); + // Validate Message Body + Assertions.assertNotNull(actual.getBody()); + List dataList = ((AmqpDataBody) actual.getBody()).getData().stream().collect(Collectors.toList()); assertEquals(1, dataList.size()); byte[] actualData = dataList.get(0).getData(); assertArrayEquals(CONTENTS_BYTES, actualData); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java index 7f530a7afecb..5a37f0b5d210 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java @@ -453,51 +453,6 @@ private ServiceBusReceivedMessage deserializeMessage(Message amqpMessage) { } } - // Message Annotations - /*final MessageAnnotations messageAnnotations = amqpMessage.getMessageAnnotations(); - if (messageAnnotations != null) { - Map messageAnnotationsMap = messageAnnotations.getValue(); - if (messageAnnotationsMap != null) { - for (Map.Entry entry : messageAnnotationsMap.entrySet()) { - final String key = entry.getKey().toString(); - final Object value = entry.getValue(); - - switch (key) { - case ENQUEUED_TIME_UTC_NAME: - brokeredMessage.setEnqueuedTime(((Date) value).toInstant().atOffset(ZoneOffset.UTC)); - - break; - case SCHEDULED_ENQUEUE_TIME_NAME: - brokeredMessage.setScheduledEnqueueTime(((Date) value).toInstant() - .atOffset(ZoneOffset.UTC)); - break; - case SEQUENCE_NUMBER_NAME: - brokeredMessage.setSequenceNumber((long) value); - break; - case LOCKED_UNTIL_NAME: - brokeredMessage.setLockedUntil(((Date) value).toInstant().atOffset(ZoneOffset.UTC)); - break; - case PARTITION_KEY_NAME: - brokeredMessage.setPartitionKey((String) value); - break; - case VIA_PARTITION_KEY_NAME: - brokeredMessage.setViaPartitionKey((String) value); - break; - case DEAD_LETTER_SOURCE_NAME: - brokeredMessage.setDeadLetterSource((String) value); - break; - case ENQUEUED_SEQUENCE_NUMBER: - brokeredMessage.setEnqueuedSequenceNumber((long) value); - break; - default: - logger.info("Unrecognised key: {}, value: {}", key, value); - break; - } - } - } - } - */ - if (amqpMessage instanceof MessageWithLockToken) { brokeredMessage.setLockToken(((MessageWithLockToken) amqpMessage).getLockToken()); } From 00f7a829969ca332b201d32ebedf58c90dfc20a2 Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Sat, 5 Sep 2020 20:02:50 -0700 Subject: [PATCH 10/27] Added more implementation --- .../amqp/models/AmqpAnnotatedMessage.java | 77 +++++----- .../azure/core/amqp/models/AmqpBodyType.java | 37 +---- .../azure/core/amqp/models/AmqpDataBody.java | 15 +- .../core/amqp/models/AmqpMessageBody.java | 1 + .../core/amqp/models/AmqpMessageHeader.java | 41 ++++-- .../amqp/models/AmqpMessageProperties.java | 119 ++++++++------- .../azure/core/amqp/models/BinaryData.java | 2 + .../amqp/models/AmqpAnnotatedMessageTest.java | 61 +++++--- .../core/amqp/models/AmqpDataBodyTest.java | 56 +++++++ .../ServiceBusMessageSerializer.java | 53 ++++--- .../servicebus/ServiceBusReceivedMessage.java | 138 ++---------------- .../ServiceBusReceivedMessageTest.java | 8 +- ...BusReceiverAsyncClientIntegrationTest.java | 93 ++++++++---- 13 files changed, 361 insertions(+), 340 deletions(-) create mode 100644 sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java index fe02c7386fb1..dd884186605d 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java @@ -8,39 +8,55 @@ import java.util.Objects; /** - * Amqp representation of the message. + * The representation of message as defined by AMQP protocol. + * + * @see + * Amqp Message Format. */ public final class AmqpAnnotatedMessage { private final AmqpMessageBody amqpMessageBody; - private Map applicationProperties; - private Map deliveryAnnotations; - private Map messageAnnotations; - private Map footer; - private AmqpMessageHeader header; - private AmqpMessageProperties properties; + private final Map applicationProperties; + private final Map deliveryAnnotations; + private final Map messageAnnotations; + private final Map footer; + private final AmqpMessageHeader header; + private final AmqpMessageProperties properties; /** * Creates instance of {@link AmqpAnnotatedMessage} with given {@link AmqpMessageBody}. * * @param body to be set on amqp message. + * + * @throws NullPointerException if {@code body} is null. */ public AmqpAnnotatedMessage(AmqpMessageBody body) { - this.amqpMessageBody = Objects.requireNonNull(body, "'body' cannot be null."); + amqpMessageBody = Objects.requireNonNull(body, "'body' cannot be null."); + + applicationProperties = new HashMap<>(); + deliveryAnnotations = new HashMap<>(); + messageAnnotations = new HashMap<>(); + footer = new HashMap<>(); + header = new AmqpMessageHeader(); + properties = new AmqpMessageProperties(); } /** - * Creates instance of {@link AmqpAnnotatedMessage} with given {@link AmqpAnnotatedMessage}. + * Creates instance of {@link AmqpAnnotatedMessage} with given {@link AmqpAnnotatedMessage} instance. * * @param message used to create another instance of {@link AmqpAnnotatedMessage}. + * + * @throws NullPointerException if {@code message} or {@link AmqpAnnotatedMessage#getBody() body} is null. */ public AmqpAnnotatedMessage(AmqpAnnotatedMessage message) { Objects.requireNonNull(message, "'message' cannot be null."); - this.amqpMessageBody = Objects.requireNonNull(message.getBody(), "'message.body' cannot be null."); - this.applicationProperties = message.getApplicationProperties(); - this.deliveryAnnotations = message.getDeliveryAnnotations(); - this.messageAnnotations = message.getMessageAnnotations(); - this.header = message.getHeader(); - this.properties = message.getProperties(); + amqpMessageBody = Objects.requireNonNull(message.getBody(), "'message.body' cannot be null."); + + applicationProperties = message.getApplicationProperties(); + deliveryAnnotations = message.getDeliveryAnnotations(); + messageAnnotations = message.getMessageAnnotations(); + header = message.getHeader(); + properties = message.getProperties(); + footer = message.getFooter(); } /** @@ -48,14 +64,11 @@ public AmqpAnnotatedMessage(AmqpAnnotatedMessage message) { * @return The application properties. */ public Map getApplicationProperties() { - if (this.applicationProperties == null) { - this.applicationProperties = new HashMap<>(); - } return applicationProperties; } /** - * Gets the {@link AmqpMessageBody}. + * Gets the {@link AmqpMessageBody} of an amqp message. * * @return the {@link AmqpMessageBody} object. */ @@ -64,63 +77,47 @@ public AmqpMessageBody getBody() { } /** - * Gets the {@link Map} representation of delivery annotations. + * Gets the {@link Map} representation of delivery annotations defined on an amqp message. * * @return the {@link Map} representation of delivery annotations. */ public Map getDeliveryAnnotations() { - if (deliveryAnnotations == null) { - this.deliveryAnnotations = new HashMap<>(); - } - return deliveryAnnotations; } /** - * Gets the {@link Map} representation of footer. + * Gets the {@link Map} representation of footer defined on an amqp message. * * @return the {@link Map} representation of footer. */ public Map getFooter() { - if (this.footer == null) { - this.footer = new HashMap<>(); - } return footer; } /** - * Gets the {@link AmqpMessageHeader}. + * Gets the {@link AmqpMessageHeader} defined on an amqp message. * * @return the {@link AmqpMessageHeader} object. */ public AmqpMessageHeader getHeader() { - if (this.header == null) { - this.header = new AmqpMessageHeader(); - } return header; } /** - * Gets the {@link Map} representation of message annotations. + * Gets the {@link Map} representation of message annotations defined on an amqp message. * * @return the {@link Map} representation of message annotations. */ public Map getMessageAnnotations() { - if (messageAnnotations == null) { - this.messageAnnotations = new HashMap<>(); - } return messageAnnotations; } /** - * Gets the {@link AmqpMessageProperties}. + * Gets the {@link AmqpMessageProperties} defined on an amqp message. * * @return the {@link AmqpMessageProperties} object. */ public AmqpMessageProperties getProperties() { - if (properties == null) { - this.properties = new AmqpMessageProperties(); - } return properties; } } diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpBodyType.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpBodyType.java index 8046f30c3354..80c66af35608 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpBodyType.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpBodyType.java @@ -3,8 +3,6 @@ package com.azure.core.amqp.models; -import java.util.Locale; - /** * All AmqpBodyType available for AMQP Message. */ @@ -12,43 +10,14 @@ public enum AmqpBodyType { /** * Represent Amqp Data type */ - DATA("Data"), + DATA, /** * Represent Amqp Value type */ - VALUE("Value"), + VALUE, /** * Represent Amqp Sequence type */ - SEQUENCE("Sequence"); - - private final String value; - - AmqpBodyType(final String value) { - this.value = value; - } - - /** - * {@inheritDoc} - */ - @Override - public String toString() { - return this.value; - } - /** - * Creates an AmqpBodyType from its display value. - * - * @param value The string value of the AmqpBodyType. - * @return The AmqpBodyType represented by the value. - * @throws IllegalArgumentException If a AmqpBodyType cannot be parsed from the string value. - */ - public static AmqpBodyType fromString(final String value) { - for (AmqpBodyType bodyType : values()) { - if (bodyType.value.equalsIgnoreCase(value)) { - return bodyType; - } - } + SEQUENCE; - throw new IllegalArgumentException(String.format(Locale.US, "Could not convert %s to a AmqpBodyType", value)); - } } diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java index 734dbef05e6d..d39dcd7cdb5f 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java @@ -8,28 +8,31 @@ import java.util.Objects; /** - * + * This is amqp message body which represents {@link AmqpBodyType#DATA} type. */ public final class AmqpDataBody implements AmqpMessageBody { - private final AmqpBodyType bodyType; private final IterableStream data; /** - * @param data to be set. + * Creates instance of {@link AmqpDataBody} with given {@link Iterable} of {@link BinaryData}. + * + * @param data to be set on amqp body. + * + * @throws NullPointerException if {@code data} is null. */ public AmqpDataBody(Iterable data) { Objects.requireNonNull(data, "'data' cannot be null."); this.data = new IterableStream<>(data); - this.bodyType = AmqpBodyType.DATA; } @Override public AmqpBodyType getBodyType() { - return bodyType; + return AmqpBodyType.DATA; } /** - * @return data. + * Gets {@link BinaryData} set on this {@link AmqpDataBody}. + * @return data set on {@link AmqpDataBody}. */ public IterableStream getData() { return data; diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageBody.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageBody.java index 8fe504edc51a..a984fb566720 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageBody.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageBody.java @@ -8,6 +8,7 @@ */ public interface AmqpMessageBody { /** + * Type representing various supported amqp body types. * * @return The {@link AmqpBodyType}. */ diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java index 8d0a4312b093..e34a470b5d49 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java @@ -8,7 +8,10 @@ import java.time.Duration; /** - * Represents Header from Amqp message. + * The representation of message header as defined by AMQP protocol. + * + * @see + * Amqp Message Format. */ @Fluent public class AmqpMessageHeader { @@ -24,9 +27,9 @@ public class AmqpMessageHeader { } /** - * Gets delivery count. + * Gets the delivery count from amqp message header. * - * @return delivery count. + * @return the delivery count value. */ public Long getDeliveryCount() { return deliveryCount; @@ -44,18 +47,19 @@ public AmqpMessageHeader setDeliveryCount(Long deliveryCount) { } /** - * Gets durable boolean flag. + * Gets durable boolean flag from amqp message header. * - * @return The durable. + * @return the durable flag. */ - public Boolean getDurable() { - return this.durable; + public Boolean isDurable() { + return durable; } /** * Sets the given {@code durable} value on {@link AmqpMessageHeader} object. * * @param durable to set on {@link AmqpMessageHeader}. + * * @return updated {@link AmqpMessageHeader} object. */ public AmqpMessageHeader setDurable(Boolean durable) { @@ -64,11 +68,11 @@ public AmqpMessageHeader setDurable(Boolean durable) { } /** - * Gets boolean flag for {@code firstAcquirer} + * Gets boolean flag for {@code firstAcquirer} from amqp message header. * - * @return The {@code firstAcquirer}. + * @return the {@code firstAcquirer} value. */ - public Boolean getFirstAcquirer() { + public Boolean isFirstAcquirer() { return this.firstAcquirer; } @@ -76,6 +80,7 @@ public Boolean getFirstAcquirer() { * Sets the given {@code firstAcquirer} value on {@link AmqpMessageHeader} object. * * @param firstAcquirer to set on {@link AmqpMessageHeader}. + * * @return updated {@link AmqpMessageHeader} object. */ public AmqpMessageHeader setFirstAcquirer(Boolean firstAcquirer) { @@ -84,17 +89,19 @@ public AmqpMessageHeader setFirstAcquirer(Boolean firstAcquirer) { } /** - * Gets the priority on {@code amqpMessage}. - * @return the priority. + * Gets the priority on {@code amqpMessage} from amqp message header. + * + * @return the {@code priority} value. */ public Short getPriority() { - return this.priority; + return priority; } /** * Sets the given {@code priority} value on {@link AmqpMessageHeader} object. * * @param priority to set on {@link AmqpMessageHeader}. + * * @return updated {@link AmqpMessageHeader} object. */ public AmqpMessageHeader setPriority(short priority) { @@ -103,17 +110,19 @@ public AmqpMessageHeader setPriority(short priority) { } /** - * Gets {@code timeToLive}. - * @return {@code timeToLive}. + * Gets {@code timeToLive} from amqp message header. + * + * @return the {@code timeToLive} value. */ public Duration getTimeToLive() { - return this.timeToLive; + return timeToLive; } /** * Sets the given {@code timeToLive} value on {@link AmqpMessageHeader} object. * * @param timeToLive to set on {@link AmqpMessageHeader}. + * * @return updated {@link AmqpMessageHeader} object. */ public AmqpMessageHeader setTimeToLive(Duration timeToLive) { diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java index d3c3b127d43d..550e551776db 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java @@ -9,7 +9,10 @@ import java.util.Arrays; /** - * Represents properties from Amqp message. + * The representation of message properties as defined by AMQP protocol. + * + * @see + * Amqp Message Format. */ @Fluent public class AmqpMessageProperties { @@ -28,19 +31,22 @@ public class AmqpMessageProperties { private String subject; private byte[] userId; + AmqpMessageProperties() { + // This class does not have any public constructors, and is not able to be instantiated using 'new'. + } /** - * Gets AbsoluteExpiryTime from Amqp message. + * Gets {@code absoluteExpiryTime} from amqp message properties. * - * @return The {@code absoluteExpiryTime}. + * @return the {@code absoluteExpiryTime} value. */ public OffsetDateTime getAbsoluteExpiryTime() { - return this.absoluteExpiryTime; + return absoluteExpiryTime; } /** * Sets the given {@code absoluteExpiryTime} value on {@link AmqpMessageProperties} object. * - * @param absoluteExpiryTime to be set . + * @param absoluteExpiryTime to be set. * @return updated {@link AmqpMessageProperties} object. */ public AmqpMessageProperties setAbsoluteExpiryTime(OffsetDateTime absoluteExpiryTime) { @@ -49,18 +55,19 @@ public AmqpMessageProperties setAbsoluteExpiryTime(OffsetDateTime absoluteExpiry } /** - * Gets AbsoluteExpiryTime from Amqp message. + * Gets AbsoluteExpiryTime from amqp message properties. * - * @return The {@code absoluteExpiryTime}. + * @return the {@code absoluteExpiryTime} value. */ public String getContentEncoding() { - return this.contentEncoding; + return contentEncoding; } /** * Sets the given {@code contentEncoding} value on {@link AmqpMessageProperties} object. * - * @param contentEncoding to be set . + * @param contentEncoding to be set. + * * @return updated {@link AmqpMessageProperties} object. */ public AmqpMessageProperties setContentEncoding(String contentEncoding) { @@ -69,9 +76,9 @@ public AmqpMessageProperties setContentEncoding(String contentEncoding) { } /** - * Gets {@code contentType} from the Amqp message. + * Gets {@code contentType} from amqp message properties. * - * @return The {@code contentType}. + * @return the {@code contentType} value. */ public String getContentType() { return contentType; @@ -80,7 +87,8 @@ public String getContentType() { /** * Sets the given {@code contentType} value on {@link AmqpMessageProperties} object. * - * @param contentType to be set . + * @param contentType to be set. + * * @return updated {@link AmqpMessageProperties} object. */ public AmqpMessageProperties setContentType(String contentType) { @@ -89,18 +97,19 @@ public AmqpMessageProperties setContentType(String contentType) { } /** - * Gets {@code correlationId} from the Amqp message. + * Gets {@code correlationId} from amqp message properties. * - * @return The {@code correlationId}. + * @return the {@code correlationId} value. */ public String getCorrelationId() { - return this.correlationId; + return correlationId; } /** * Sets the given {@code correlationId} value on {@link AmqpMessageProperties} object. * - * @param correlationId to be set . + * @param correlationId to be set. + * * @return updated {@link AmqpMessageProperties} object. */ public AmqpMessageProperties setCorrelationId(String correlationId) { @@ -109,18 +118,19 @@ public AmqpMessageProperties setCorrelationId(String correlationId) { } /** - * Gets {@code creationTime} from the Amqp message. + * Gets {@code creationTime} from amqp message properties. * - * @return The {@code creationTime}. + * @return the {@code creationTime} value. */ public OffsetDateTime getCreationTime() { - return this.creationTime; + return creationTime; } /** * Sets the given {@code creationTime} value on {@link AmqpMessageProperties} object. * - * @param creationTime to be set . + * @param creationTime to be set. + * * @return updated {@link AmqpMessageProperties} object. */ public AmqpMessageProperties setCreationTime(OffsetDateTime creationTime) { @@ -129,18 +139,19 @@ public AmqpMessageProperties setCreationTime(OffsetDateTime creationTime) { } /** - * Gets {@code groupId} from the Amqp message. + * Gets {@code groupId} from amqp message properties. * - * @return The {@code groupId}. + * @return the {@code groupId} value. */ public String getGroupId() { - return this.groupId; + return groupId; } /** * Sets the given {@code groupId} value on {@link AmqpMessageProperties} object. * - * @param groupId to be set . + * @param groupId to be set. + * * @return updated {@link AmqpMessageProperties} object. */ public AmqpMessageProperties setGroupId(String groupId) { @@ -149,18 +160,19 @@ public AmqpMessageProperties setGroupId(String groupId) { } /** - * Gets {@code groupSequence} from the Amqp message. + * Gets {@code groupSequence} from amqp message properties. * - * @return The {@code groupSequence}. + * @return the {@code groupSequence} value. */ public long getGroupSequence() { - return this.groupSequence; + return groupSequence; } /** * Sets the given {@code groupSequence} value on {@link AmqpMessageProperties} object. * - * @param groupSequence to be set . + * @param groupSequence to be set. + * * @return updated {@link AmqpMessageProperties} object. */ public AmqpMessageProperties setGroupSequence(long groupSequence) { @@ -169,18 +181,19 @@ public AmqpMessageProperties setGroupSequence(long groupSequence) { } /** - * Gets {@code messageId} from the Amqp message. + * Gets {@code messageId} from amqp message properties. * - * @return The {@code messageId}. + * @return the {@code messageId} value. */ public String getMessageId() { - return this.messageId; + return messageId; } /** * Sets the given {@code messageId} value on {@link AmqpMessageProperties} object. * * @param messageId to be set . + * * @return updated {@link AmqpMessageProperties} object. */ public AmqpMessageProperties setMessageId(String messageId) { @@ -189,18 +202,19 @@ public AmqpMessageProperties setMessageId(String messageId) { } /** - * Gets {@code replyTo} from the Amqp message. + * Gets {@code replyTo} from amqp message properties. * - * @return The {@code replyTo}. + * @return The {@code replyTo} value. */ public String getReplyTo() { - return this.replyTo; + return replyTo; } /** * Sets the given {@code replyTo} value on {@link AmqpMessageProperties} object. * - * @param replyTo to be set . + * @param replyTo to be set. + * * @return updated {@link AmqpMessageProperties} object. */ public AmqpMessageProperties setReplyTo(String replyTo) { @@ -209,18 +223,19 @@ public AmqpMessageProperties setReplyTo(String replyTo) { } /** - * Gets {@code replyToGroupId} from the Amqp message. + * Gets {@code replyToGroupId} from amqp message properties. * - * @return The {@code replyToGroupId}. + * @return The {@code replyToGroupId} value. */ public String getReplyToGroupId() { - return this.replyToGroupId; + return replyToGroupId; } /** * Sets the given {@code replyToGroupId} value on {@link AmqpMessageProperties} object. * - * @param replyToGroupId to be set . + * @param replyToGroupId to be set. + * * @return updated {@link AmqpMessageProperties} object. */ public AmqpMessageProperties setReplyToGroupId(String replyToGroupId) { @@ -229,18 +244,19 @@ public AmqpMessageProperties setReplyToGroupId(String replyToGroupId) { } /** - * Gets {@code subject} from the Amqp message. + * Gets {@code subject} from amqp message properties. * - * @return The {@code subject}. + * @return the {@code subject} value. */ public String getSubject() { - return this.subject; + return subject; } /** * Sets the given {@code subject} value on {@link AmqpMessageProperties} object. * - * @param subject to be set . + * @param subject to be set. + * * @return updated {@link AmqpMessageProperties} object. */ public AmqpMessageProperties setSubject(String subject) { @@ -249,18 +265,19 @@ public AmqpMessageProperties setSubject(String subject) { } /** - * Gets {@code to} from the Amqp message. + * Gets {@code to} from amqp message properties. * - * @return The {@code to}. + * @return the {@code to} value. */ public String getTo() { - return this.to; + return to; } /** * Sets the given {@code to} value on {@link AmqpMessageProperties} object. * - * @param to to be set . + * @param to to be set. + * * @return updated {@link AmqpMessageProperties} object. */ public AmqpMessageProperties setTo(String to) { @@ -269,12 +286,12 @@ public AmqpMessageProperties setTo(String to) { } /** - * Gets {@code userId} from Amqp message. + * Gets {@code userId} from amqp message properties. * - * @return The {@code userId}. + * @return the {@code userId} value. */ public byte[] getUserId() { - return userId != null ? Arrays.copyOf(this.userId, userId.length) : new byte[0]; + return userId != null ? Arrays.copyOf(userId, userId.length) : new byte[0]; } /** @@ -287,6 +304,4 @@ public AmqpMessageProperties setUserId(byte[] userId) { this.userId = userId != null ? Arrays.copyOf(userId, userId.length) : new byte[0]; return this; } - - } diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java index c808c26958b7..63d77531dfd4 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java @@ -11,6 +11,7 @@ */ public final class BinaryData { private final byte[] data; + /** *Create {@link BinaryData} instance with given byte array data. * @@ -22,6 +23,7 @@ public BinaryData(byte[] data) { } /** + * Gets the data. * * @return byte array representing {@link BinaryData}. */ diff --git a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java index 556e64eda361..1b9724c4ea78 100644 --- a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java +++ b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java @@ -13,6 +13,7 @@ import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; /** * Test class for {@link AmqpAnnotatedMessage} @@ -20,35 +21,42 @@ public class AmqpAnnotatedMessageTest { private static final byte[] CONTENTS_BYTES = "Some-contents".getBytes(StandardCharsets.UTF_8); + private static final BinaryData DATA_BYTES = new BinaryData(CONTENTS_BYTES); /** * Verifies we correctly set values via constructor for {@link AmqpAnnotatedMessage}. */ @Test public void constructorValidValues() { - // Arrange & Act - AmqpAnnotatedMessage actual = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList(new BinaryData(CONTENTS_BYTES)))); + // Arrange + final List binaryDataList = Collections.singletonList(DATA_BYTES); + final AmqpDataBody amqpDataBody = new AmqpDataBody(binaryDataList); + + // Act + AmqpAnnotatedMessage actual = new AmqpAnnotatedMessage(amqpDataBody); // Assert - Assertions.assertEquals(AmqpBodyType.DATA, actual.getBody().getBodyType()); - Assertions.assertNotNull(actual.getProperties()); - Assertions.assertNotNull(actual.getHeader()); - Assertions.assertNotNull(actual.getFooter()); - Assertions.assertNotNull(actual.getApplicationProperties()); - Assertions.assertNotNull(actual.getDeliveryAnnotations()); - Assertions.assertNotNull(actual.getMessageAnnotations()); - Assertions.assertNotNull(actual.getApplicationProperties()); + assertMessageCreation(actual, AmqpBodyType.DATA, binaryDataList.size()); + } - // Validate Message Body - Assertions.assertNotNull(actual.getBody()); - List dataList = ((AmqpDataBody) actual.getBody()).getData().stream().collect(Collectors.toList()); - assertEquals(1, dataList.size()); - byte[] actualData = dataList.get(0).getData(); - assertArrayEquals(CONTENTS_BYTES, actualData); + /** + * Verifies we correctly set values via constructor for {@link AmqpAnnotatedMessage}. + */ + @Test + public void constructorAmqpValidValues() { + // Arrange + final List listBinaryData = Collections.singletonList(DATA_BYTES); + final AmqpDataBody amqpDataBody = new AmqpDataBody(listBinaryData); + AmqpAnnotatedMessage expected = new AmqpAnnotatedMessage(amqpDataBody); + // Act + AmqpAnnotatedMessage actual = new AmqpAnnotatedMessage(expected); + + // Assert + assertMessageCreation(actual, AmqpBodyType.DATA, listBinaryData.size()); } /** - * Verifies {@link AmqpAnnotatedMessage} constructor for null valeus. + * Verifies {@link AmqpAnnotatedMessage} constructor for null values. */ @Test public void constructorNullValidValues() { @@ -58,4 +66,23 @@ public void constructorNullValidValues() { // Act & Assert Assertions.assertThrows(NullPointerException.class, () -> new AmqpAnnotatedMessage(body)); } + + private void assertMessageCreation(AmqpAnnotatedMessage actual, AmqpBodyType expectedType, + int messageSizeExpected) { + assertEquals(expectedType, actual.getBody().getBodyType()); + assertNotNull(actual.getProperties()); + assertNotNull(actual.getHeader()); + assertNotNull(actual.getFooter()); + assertNotNull(actual.getApplicationProperties()); + assertNotNull(actual.getDeliveryAnnotations()); + assertNotNull(actual.getMessageAnnotations()); + assertNotNull(actual.getApplicationProperties()); + + // Validate Message Body + assertNotNull(actual.getBody()); + List dataList = ((AmqpDataBody) actual.getBody()).getData().stream().collect(Collectors.toList()); + assertEquals(messageSizeExpected, dataList.size()); + byte[] actualData = dataList.get(0).getData(); + assertArrayEquals(CONTENTS_BYTES, actualData); + } } diff --git a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java new file mode 100644 index 000000000000..f6005b6c92a7 --- /dev/null +++ b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java @@ -0,0 +1,56 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT License. + +package com.azure.core.amqp.models; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; + +/** + * Test for {@link AmqpDataBody}. + */ +public class AmqpDataBodyTest { + private static final byte[] CONTENTS_BYTES = "Some-contents".getBytes(StandardCharsets.UTF_8); + private static final BinaryData DATA_BYTES = new BinaryData(CONTENTS_BYTES); + + /** + * Verifies we correctly set values via constructor for {@link AmqpAnnotatedMessage}. + */ + @Test + public void constructorValidValues() { + // Arrange + final List binaryDataList = Collections.singletonList(DATA_BYTES); + + // Act + AmqpDataBody actual = new AmqpDataBody(binaryDataList); + + // Assert + assertEquals(AmqpBodyType.DATA, actual.getBodyType()); + + // Validate Message Body + List dataList = actual.getData().stream().collect(Collectors.toList()); + assertEquals(binaryDataList.size(), dataList.size()); + byte[] actualData = dataList.get(0).getData(); + assertArrayEquals(CONTENTS_BYTES, actualData); + } + + /** + * Verifies {@link BinaryData} constructor for null values. + */ + @Test + public void constructorNullValidValues() { + // Arrange + final List listBinaryData = null; + + // Act & Assert + Assertions.assertThrows(NullPointerException.class, () -> new AmqpDataBody(listBinaryData)); + } +} diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java index 5a37f0b5d210..4448b64ae7b0 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java @@ -7,10 +7,8 @@ import com.azure.core.amqp.implementation.MessageSerializer; import com.azure.core.amqp.implementation.RequestResponseUtils; import com.azure.core.amqp.models.AmqpAnnotatedMessage; -import com.azure.core.amqp.models.AmqpDataBody; import com.azure.core.amqp.models.AmqpMessageHeader; import com.azure.core.amqp.models.AmqpMessageProperties; -import com.azure.core.amqp.models.BinaryData; import com.azure.core.util.logging.ClientLogger; import com.azure.messaging.servicebus.implementation.ManagementConstants; import com.azure.messaging.servicebus.implementation.MessageWithLockToken; @@ -61,18 +59,9 @@ */ class ServiceBusMessageSerializer implements MessageSerializer { private static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; - private static final String ENQUEUED_TIME_UTC_NAME = "x-opt-enqueued-time"; private static final String SCHEDULED_ENQUEUE_TIME_NAME = "x-opt-scheduled-enqueue-time"; - private static final String SEQUENCE_NUMBER_NAME = "x-opt-sequence-number"; - private static final String LOCKED_UNTIL_NAME = "x-opt-locked-until"; private static final String PARTITION_KEY_NAME = "x-opt-partition-key"; private static final String VIA_PARTITION_KEY_NAME = "x-opt-via-partition-key"; - private static final String DEAD_LETTER_SOURCE_NAME = "x-opt-deadletter-source"; - private static final String DEAD_LETTER_DESCRIPTION = "DeadLetterErrorDescription"; - private static final String DEAD_LETTER_REASON = "DeadLetterReason"; - - // This one appears to always be 0, but is always returned with each message. - private static final String ENQUEUED_SEQUENCE_NUMBER = "x-opt-enqueue-sequence-number"; private final ClientLogger logger = new ClientLogger(ServiceBusMessageSerializer.class); @@ -151,15 +140,25 @@ public Message serialize(T object) { if (amqpMessage.getProperties() == null) { amqpMessage.setProperties(new Properties()); } - + AmqpMessageProperties brokeredProperties = brokeredMessage.getAmqpAnnotatedMessage().getProperties(); amqpMessage.setMessageId(brokeredMessage.getMessageId()); amqpMessage.setContentType(brokeredMessage.getContentType()); amqpMessage.setCorrelationId(brokeredMessage.getCorrelationId()); amqpMessage.setSubject(brokeredMessage.getSubject()); - amqpMessage.getProperties().setTo(brokeredMessage.getTo()); amqpMessage.setReplyTo(brokeredMessage.getReplyTo()); amqpMessage.setReplyToGroupId(brokeredMessage.getReplyToSessionId()); amqpMessage.setGroupId(brokeredMessage.getSessionId()); + amqpMessage.setContentEncoding(brokeredProperties.getContentEncoding()); + amqpMessage.setGroupSequence(brokeredProperties.getGroupSequence()); + amqpMessage.getProperties().setTo(brokeredMessage.getTo()); + amqpMessage.getProperties().setUserId(new Binary(brokeredProperties.getUserId())); + + if (brokeredProperties.getAbsoluteExpiryTime() != null) { + amqpMessage.getProperties().setAbsoluteExpiryTime(Date.from(brokeredProperties.getAbsoluteExpiryTime().toInstant())); + } + if (brokeredProperties.getCreationTime() != null) { + amqpMessage.getProperties().setCreationTime(Date.from(brokeredProperties.getCreationTime().toInstant())); + } //set footer amqpMessage.setFooter(new Footer(brokeredMessage.getAmqpAnnotatedMessage().getFooter())); @@ -170,17 +169,16 @@ public Message serialize(T object) { amqpMessage.setDeliveryCount(brokeredMessage.getAmqpAnnotatedMessage().getHeader().getDeliveryCount()); } amqpMessage.setPriority(brokeredMessage.getAmqpAnnotatedMessage().getHeader().getPriority()); - if (header.getDurable() != null) { - amqpMessage.setDurable(brokeredMessage.getAmqpAnnotatedMessage().getHeader().getDurable()); + if (header.isDurable() != null) { + amqpMessage.setDurable(brokeredMessage.getAmqpAnnotatedMessage().getHeader().isDurable()); } - if (header.getFirstAcquirer() != null) { - amqpMessage.setFirstAcquirer(brokeredMessage.getAmqpAnnotatedMessage().getHeader().getFirstAcquirer()); + if (header.isFirstAcquirer() != null) { + amqpMessage.setFirstAcquirer(brokeredMessage.getAmqpAnnotatedMessage().getHeader().isFirstAcquirer()); } if (header.getTimeToLive() != null) { amqpMessage.setTtl(brokeredMessage.getAmqpAnnotatedMessage().getHeader().getTimeToLive().toMillis()); } - final Map messageAnnotationsMap = new HashMap<>(); if (brokeredMessage.getScheduledEnqueueTime() != null) { messageAnnotationsMap.put(Symbol.valueOf(SCHEDULED_ENQUEUE_TIME_NAME), @@ -393,9 +391,12 @@ private ServiceBusReceivedMessage deserializeMessage(Message amqpMessage) { // Footer final Footer footer = amqpMessage.getFooter(); if (footer != null && footer.getValue() != null) { - final Map footerValue = footer.getValue(); - brokeredAmqpAnnotatedMessage.getFooter().putAll(footerValue); - + final Map footerValue = footer.getValue(); + Iterator footerKeys = footerValue.keySet().iterator(); + while (footerKeys.hasNext()) { + Symbol key = footerKeys.next(); + brokeredAmqpAnnotatedMessage.getFooter().put(key.toString(), footerValue.get(key)); + } } // Properties @@ -419,12 +420,18 @@ private ServiceBusReceivedMessage deserializeMessage(Message amqpMessage) { } brokeredProperties.setSubject(amqpMessage.getSubject()); - brokeredProperties.setReplyTo(amqpMessage.getReplyTo()); - brokeredProperties.setReplyToGroupId(amqpMessage.getReplyToGroupId()); brokeredProperties.setGroupId(amqpMessage.getGroupId()); brokeredProperties.setContentEncoding(amqpMessage.getContentEncoding()); brokeredProperties.setGroupSequence(amqpMessage.getGroupSequence()); brokeredProperties.setUserId(amqpMessage.getUserId()); + if (amqpProperties.getAbsoluteExpiryTime() != null) { + brokeredProperties.setAbsoluteExpiryTime(amqpProperties.getAbsoluteExpiryTime().toInstant() + .atOffset(ZoneOffset.UTC)); + } + if (amqpProperties.getCreationTime() != null) { + brokeredProperties.setCreationTime(amqpProperties.getCreationTime().toInstant() + .atOffset(ZoneOffset.UTC)); + } // DeliveryAnnotations final DeliveryAnnotations deliveryAnnotations = amqpMessage.getDeliveryAnnotations(); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java index fad614387b3b..01e619df1626 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java @@ -4,24 +4,11 @@ package com.azure.messaging.servicebus; import com.azure.core.amqp.models.AmqpAnnotatedMessage; +import com.azure.core.amqp.models.AmqpBodyType; import com.azure.core.amqp.models.AmqpDataBody; -import com.azure.core.amqp.models.AmqpMessageHeader; -import com.azure.core.amqp.models.AmqpMessageProperties; import com.azure.core.amqp.models.BinaryData; import com.azure.core.util.logging.ClientLogger; -import com.azure.messaging.servicebus.implementation.MessageWithLockToken; -import com.azure.messaging.servicebus.implementation.Messages; import com.azure.messaging.servicebus.models.ReceiveMode; -import org.apache.qpid.proton.amqp.Binary; -import org.apache.qpid.proton.amqp.Symbol; -import org.apache.qpid.proton.amqp.messaging.ApplicationProperties; -import org.apache.qpid.proton.amqp.messaging.Data; -import org.apache.qpid.proton.amqp.messaging.DeliveryAnnotations; -import org.apache.qpid.proton.amqp.messaging.Footer; -import org.apache.qpid.proton.amqp.messaging.MessageAnnotations; -import org.apache.qpid.proton.amqp.messaging.Properties; -import org.apache.qpid.proton.amqp.messaging.Section; -import org.apache.qpid.proton.message.Message; import java.time.Duration; import java.time.OffsetDateTime; @@ -38,7 +25,8 @@ * This class represents a received message from Service Bus. */ public final class ServiceBusReceivedMessage { - private static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; + private final ClientLogger logger = new ClientLogger(ServiceBusReceivedMessage.class); + private static final String ENQUEUED_TIME_UTC_NAME = "x-opt-enqueued-time"; private static final String SEQUENCE_NUMBER_NAME = "x-opt-sequence-number"; private static final String LOCKED_UNTIL_NAME = "x-opt-locked-until"; @@ -51,13 +39,15 @@ public final class ServiceBusReceivedMessage { // This one appears to always be 0, but is always returned with each message. private static final String ENQUEUED_SEQUENCE_NUMBER = "x-opt-enqueue-sequence-number"; - private static final ClientLogger logger = new ClientLogger(ServiceBusReceivedMessage.class); private AmqpAnnotatedMessage amqpAnnotatedMessage; private UUID lockToken; /** + * The representation of message as defined by AMQP protocol. * + * @see + * Amqp Message Format. * @return */ public AmqpAnnotatedMessage getAmqpAnnotatedMessage() { @@ -68,111 +58,6 @@ public AmqpAnnotatedMessage getAmqpAnnotatedMessage() { amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList(new BinaryData(body)))); } - ServiceBusReceivedMessage(Message amqpMessage) { - - //final ServiceBusReceivedMessage brokeredMessage; - byte[] bytes = null; - final Section body = amqpMessage.getBody(); - if (body != null) { - //TODO (conniey): Support other AMQP types like AmqpValue and AmqpSequence. - if (body instanceof Data) { - final Binary messageData = ((Data) body).getValue(); - bytes = messageData.getArray(); - //brokeredMessage = new ServiceBusReceivedMessage(bytes); - } else { - logger.warning(String.format(Messages.MESSAGE_NOT_OF_TYPE, body.getType())); - bytes = EMPTY_BYTE_ARRAY; - //brokeredMessage = new ServiceBusReceivedMessage(EMPTY_BYTE_ARRAY); - } - } else { - logger.warning(String.format(Messages.MESSAGE_NOT_OF_TYPE, "null")); - bytes = EMPTY_BYTE_ARRAY; - //brokeredMessage = new ServiceBusReceivedMessage(EMPTY_BYTE_ARRAY); - } - amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList(new BinaryData(bytes)))); - - // Application properties - ApplicationProperties applicationProperties = amqpMessage.getApplicationProperties(); - if (applicationProperties != null) { - final Map propertiesValue = applicationProperties.getValue(); - amqpAnnotatedMessage.getApplicationProperties().putAll(propertiesValue); - } - - // Header - final AmqpMessageHeader header = amqpAnnotatedMessage.getHeader(); - header.setTimeToLive(Duration.ofMillis(amqpMessage.getTtl())); - header.setDeliveryCount(amqpMessage.getDeliveryCount()); - header.setDurable(amqpMessage.getHeader().getDurable()); - header.setFirstAcquirer(amqpMessage.getHeader().getFirstAcquirer()); - header.setPriority(amqpMessage.getPriority()); - - // Footer - final Footer footer = amqpMessage.getFooter(); - if (footer != null && footer.getValue() != null) { - final Map footerValue = footer.getValue(); - amqpAnnotatedMessage.getFooter().putAll(footerValue); - - } - - // Properties - final AmqpMessageProperties properties = amqpAnnotatedMessage.getProperties(); - properties.setReplyToGroupId(amqpMessage.getReplyToGroupId()); - properties.setReplyTo(amqpMessage.getReplyTo()); - final Object messageId = amqpMessage.getMessageId(); - if (messageId != null) { - properties.setMessageId(messageId.toString()); - } - - properties.setContentType(amqpMessage.getContentType()); - final Object correlationId = amqpMessage.getCorrelationId(); - if (correlationId != null) { - properties.setCorrelationId(correlationId.toString()); - } - - final Properties amqpProperties = amqpMessage.getProperties(); - if (amqpProperties != null) { - properties.setTo(amqpProperties.getTo()); - } - - properties.setSubject(amqpMessage.getSubject()); - properties.setReplyTo(amqpMessage.getReplyTo()); - properties.setReplyToGroupId(amqpMessage.getReplyToGroupId()); - properties.setGroupId(amqpMessage.getGroupId()); - properties.setContentEncoding(amqpMessage.getContentEncoding()); - properties.setGroupSequence(amqpMessage.getGroupSequence()); - properties.setUserId(amqpMessage.getUserId()); - - // DeliveryAnnotations - final DeliveryAnnotations deliveryAnnotations = amqpMessage.getDeliveryAnnotations(); - if (deliveryAnnotations != null && deliveryAnnotations.getValue() != null) { - final Map deliveryAnnotationMap = deliveryAnnotations.getValue(); - if (deliveryAnnotationMap != null) { - for (Map.Entry entry : deliveryAnnotationMap.entrySet()) { - final String key = entry.getKey().toString(); - final Object value = entry.getValue(); - amqpAnnotatedMessage.getDeliveryAnnotations().put(key, value); - } - } - } - - // Message Annotations - final MessageAnnotations messageAnnotations = amqpMessage.getMessageAnnotations(); - if (messageAnnotations != null) { - Map messageAnnotationsMap = messageAnnotations.getValue(); - if (messageAnnotationsMap != null) { - for (Map.Entry entry : messageAnnotationsMap.entrySet()) { - final String key = entry.getKey().toString(); - final Object value = entry.getValue(); - amqpAnnotatedMessage.getMessageAnnotations().put(key, value); - } - } - } - - if (amqpMessage instanceof MessageWithLockToken) { - this.lockToken = ((MessageWithLockToken) amqpMessage).getLockToken(); - } - } - /** * Gets the actual payload/data wrapped by the {@link ServiceBusReceivedMessage}. * @@ -186,7 +71,8 @@ public AmqpAnnotatedMessage getAmqpAnnotatedMessage() { */ public byte[] getBody() { byte[] body = null; - switch(amqpAnnotatedMessage.getBody().getBodyType()) { + final AmqpBodyType bodyType = amqpAnnotatedMessage.getBody().getBodyType(); + switch(bodyType) { case DATA: List binaryData = ((AmqpDataBody)amqpAnnotatedMessage.getBody()).getData().stream() .collect(Collectors.toList()); @@ -194,8 +80,14 @@ public byte[] getBody() { byte[] firstData = binaryData.get(0).getData(); body = Arrays.copyOf(firstData, firstData.length); } - break; + case SEQUENCE: + case VALUE: + throw logger.logThrowableAsError(new UnsupportedOperationException("Body type not supported " + + bodyType)); default: + logger.warning("Invalid body type {}.", bodyType); + throw logger.logThrowableAsError(new IllegalStateException("Body type not valid " + + bodyType)); } return body; } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java index 9e3155cdf1e8..3eaa6e99ac6e 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java @@ -11,6 +11,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.time.Duration; + import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; @@ -77,15 +79,15 @@ public void toServiceBusMessageTest() { when(amqpMessage.getBody()).thenReturn(data); // final ServiceBusReceivedMessage originalMessage = new ServiceBusReceivedMessage(amqpMessage); - /*originalMessage.setMessageId("mid"); + originalMessage.setMessageId("mid"); originalMessage.setContentType("type"); originalMessage.setCorrelationId("cid"); originalMessage.setReplyTo("rto"); originalMessage.setViaPartitionKey("something"); originalMessage.setTimeToLive(Duration.ofSeconds(10)); originalMessage.setReplyToSessionId("rsessionid"); - originalMessage.setLabel("label"); - originalMessage.setTo("to");*/ + originalMessage.setSubject("subject"); + originalMessage.setTo("to"); // Act final ServiceBusMessage messageToSend = new ServiceBusMessage(originalMessage); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java index 345f2a5a67fe..367f6850117e 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java @@ -970,10 +970,11 @@ void receiveAndValidateProperties(MessagingEntityType entityType) { final String subject = "subject"; final Map footer = new HashMap<>(); footer.put("footer-key-1", "footer-value-1"); + footer.put("footer-key-2", "footer-value-2"); final Map aplicaitonProperties = new HashMap<>(); - footer.put("ap-key-1", "ap-value-1"); - footer.put("ap-key-2", "ap-value-2"); + aplicaitonProperties.put("ap-key-1", "ap-value-1"); + aplicaitonProperties.put("ap-key-2", "ap-value-2"); final Map deliveryAnnotation = new HashMap<>(); deliveryAnnotation.put("delivery-annotations-key-1", "delivery-annotations-value-1"); @@ -985,15 +986,29 @@ void receiveAndValidateProperties(MessagingEntityType entityType) { .buildAsyncClient(); final String messageId = UUID.randomUUID().toString(); - final AmqpAnnotatedMessage amqpProperties = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList(new BinaryData(CONTENTS_BYTES)))); - amqpProperties.getProperties().setSubject(subject); - amqpProperties.getHeader().setPriority((short)2); - amqpProperties.getFooter().putAll(footer); - amqpProperties.getDeliveryAnnotations().putAll(deliveryAnnotation); - amqpProperties.getApplicationProperties().putAll(aplicaitonProperties); - - - final ServiceBusMessage message = getMessage(messageId, isSessionEnabled, amqpProperties); + final AmqpAnnotatedMessage expectedAmqpProperties = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList(new BinaryData(CONTENTS_BYTES)))); + expectedAmqpProperties.getProperties().setSubject(subject); + expectedAmqpProperties.getProperties().setReplyToGroupId("r-gid"); + expectedAmqpProperties.getProperties().setReplyTo("replyto"); + expectedAmqpProperties.getProperties().setContentType("content-type"); + expectedAmqpProperties.getProperties().setCorrelationId("corelation-id"); + expectedAmqpProperties.getProperties().setTo("to"); + expectedAmqpProperties.getProperties().setAbsoluteExpiryTime(OffsetDateTime.now().plusSeconds(60)); + expectedAmqpProperties.getProperties().setUserId("user-id-1".getBytes()); + expectedAmqpProperties.getProperties().setContentEncoding("string"); + expectedAmqpProperties.getProperties().setGroupSequence(2); + expectedAmqpProperties.getProperties().setCreationTime(OffsetDateTime.now().plusSeconds(30)); + + expectedAmqpProperties.getHeader().setPriority((short)2); + expectedAmqpProperties.getHeader().setFirstAcquirer(true); + expectedAmqpProperties.getHeader().setDurable(true); + + expectedAmqpProperties.getFooter().putAll(footer); + expectedAmqpProperties.getDeliveryAnnotations().putAll(deliveryAnnotation); + expectedAmqpProperties.getApplicationProperties().putAll(aplicaitonProperties); + + + final ServiceBusMessage message = getMessage(messageId, isSessionEnabled, expectedAmqpProperties); sendMessage(message).block(TIMEOUT); @@ -1003,19 +1018,27 @@ void receiveAndValidateProperties(MessagingEntityType entityType) { AmqpAnnotatedMessage actual = received.getAmqpAnnotatedMessage(); try { assertArrayEquals(CONTENTS_BYTES, message.getBody()); - assertEquals(amqpProperties.getHeader().getPriority(), actual.getHeader().getPriority(), "Header.priority is not equal."); - - assertEquals(amqpProperties.getProperties().getSubject(), actual.getProperties().getSubject(), "Properties.subject is not equal."); - assertEquals(amqpProperties.getProperties().getSubject(), actual.getProperties().getSubject(), "Properties.subject is not equal."); - - Map actualDeliveryAnnotationMap = actual.getDeliveryAnnotations(); - Iterator ite = deliveryAnnotation.keySet().iterator(); - while (ite.hasNext()) { - String key = ite.next(); - assertEquals(amqpProperties.getDeliveryAnnotations().get(key), actualDeliveryAnnotationMap.get(key), "Delivery annotations is not equal for Key " + key); - } - assertEquals(amqpProperties.getProperties().getSubject(), actual.getProperties().getSubject(), "Properties.subject is not equal."); - + assertEquals(expectedAmqpProperties.getHeader().getPriority(), actual.getHeader().getPriority(), "Header.priority is not equal."); + assertEquals(expectedAmqpProperties.getHeader().isFirstAcquirer(), actual.getHeader().isFirstAcquirer(), "Header.FirstAcquirer is not equal."); + assertEquals(expectedAmqpProperties.getHeader().isDurable(), actual.getHeader().isDurable(), "Header.Durable is not equal."); + + assertEquals(expectedAmqpProperties.getProperties().getSubject(), actual.getProperties().getSubject(), "Properties.subject is not equal."); + assertEquals(expectedAmqpProperties.getProperties().getReplyToGroupId(), actual.getProperties().getReplyToGroupId(), "Properties.ReplyToGroupId is not equal."); + assertEquals(expectedAmqpProperties.getProperties().getReplyTo(), actual.getProperties().getReplyTo(), "Properties.replyTo is not equal."); + assertEquals(expectedAmqpProperties.getProperties().getContentType(), actual.getProperties().getContentType(), "Properties.contentType is not equal."); + assertEquals(expectedAmqpProperties.getProperties().getCorrelationId(), actual.getProperties().getCorrelationId(), "Properties.correlationId is not equal."); + assertEquals(expectedAmqpProperties.getProperties().getTo(), actual.getProperties().getTo(), "Properties.to is not equal."); + assertEquals(expectedAmqpProperties.getProperties().getAbsoluteExpiryTime().toEpochSecond(), actual.getProperties().getAbsoluteExpiryTime().toEpochSecond(), "Properties.absoluteExpiryTime is not equal."); + assertEquals(expectedAmqpProperties.getProperties().getSubject(), actual.getProperties().getSubject(), "Properties.subject is not equal."); + assertEquals(expectedAmqpProperties.getProperties().getContentEncoding(), actual.getProperties().getContentEncoding(), "Properties.contentEncoding is not equal."); + assertEquals(expectedAmqpProperties.getProperties().getGroupSequence(), actual.getProperties().getGroupSequence(), "Properties.groupSequence is not equal."); + assertEquals(expectedAmqpProperties.getProperties().getCreationTime().toEpochSecond(), actual.getProperties().getCreationTime().toEpochSecond(), "Properties.absoluteExpiryTime is not equal."); + assertArrayEquals(expectedAmqpProperties.getProperties().getUserId(), actual.getProperties().getUserId(), "Properties.userId is not equal."); + + assertMapValues(expectedAmqpProperties.getDeliveryAnnotations(), actual.getDeliveryAnnotations()); + assertMapValues(expectedAmqpProperties.getMessageAnnotations(), actual.getMessageAnnotations()); + assertMapValues(expectedAmqpProperties.getApplicationProperties(), actual.getApplicationProperties()); + assertMapValues(expectedAmqpProperties.getFooter(), actual.getFooter()); } finally { logger.info("Completing message."); receiver.complete(received).block(Duration.ofSeconds(15)); @@ -1026,6 +1049,15 @@ void receiveAndValidateProperties(MessagingEntityType entityType) { .verify(Duration.ofMinutes(2)); } + private void assertMapValues(Map expectedMap, Map actualMap) { + assertTrue(actualMap.size() >= expectedMap.size()); + Iterator expectedKeys = expectedMap.keySet().iterator(); + while (expectedKeys.hasNext()) { + String key = expectedKeys.next(); + assertEquals(expectedMap.get(key), actualMap.get(key), "Value is not equal for Key " + key); + } + } + /** * Sets the sender and receiver. If session is enabled, then a single-named session receiver is created. */ @@ -1134,17 +1166,26 @@ protected ServiceBusMessage getMessage(String messageId, boolean isSessionEnable message.getAmqpAnnotatedMessage().getFooter().putAll(amqpPropertiesToSet.getFooter()); - message.getAmqpAnnotatedMessage().getHeader().setFirstAcquirer(amqpPropertiesToSet.getHeader().getFirstAcquirer()); - message.getAmqpAnnotatedMessage().getHeader().setDurable(amqpPropertiesToSet.getHeader().getDurable()); + message.getAmqpAnnotatedMessage().getHeader().setFirstAcquirer(amqpPropertiesToSet.getHeader().isFirstAcquirer()); + message.getAmqpAnnotatedMessage().getHeader().setTimeToLive(amqpPropertiesToSet.getHeader().getTimeToLive()); + message.getAmqpAnnotatedMessage().getHeader().setDurable(amqpPropertiesToSet.getHeader().isDurable()); message.getAmqpAnnotatedMessage().getHeader().setDeliveryCount(amqpPropertiesToSet.getHeader().getDeliveryCount()); message.getAmqpAnnotatedMessage().getHeader().setPriority(amqpPropertiesToSet.getHeader().getPriority()); message.getAmqpAnnotatedMessage().getProperties().setReplyTo((amqpPropertiesToSet.getProperties().getReplyTo())); + message.getAmqpAnnotatedMessage().getProperties().setContentEncoding((amqpPropertiesToSet.getProperties().getContentEncoding())); message.getAmqpAnnotatedMessage().getProperties().setAbsoluteExpiryTime((amqpPropertiesToSet.getProperties().getAbsoluteExpiryTime())); message.getAmqpAnnotatedMessage().getProperties().setSubject((amqpPropertiesToSet.getProperties().getSubject())); message.getAmqpAnnotatedMessage().getProperties().setContentType(amqpPropertiesToSet.getProperties().getContentType()); message.getAmqpAnnotatedMessage().getProperties().setCorrelationId(amqpPropertiesToSet.getProperties().getCorrelationId()); + message.getAmqpAnnotatedMessage().getProperties().setTo(amqpPropertiesToSet.getProperties().getTo()); + message.getAmqpAnnotatedMessage().getProperties().setGroupSequence(amqpPropertiesToSet.getProperties().getGroupSequence()); + message.getAmqpAnnotatedMessage().getProperties().setUserId(amqpPropertiesToSet.getProperties().getUserId()); + message.getAmqpAnnotatedMessage().getProperties().setAbsoluteExpiryTime(amqpPropertiesToSet.getProperties().getAbsoluteExpiryTime()); + message.getAmqpAnnotatedMessage().getProperties().setCreationTime(amqpPropertiesToSet.getProperties().getCreationTime()); + message.getAmqpAnnotatedMessage().getProperties().setReplyToGroupId(amqpPropertiesToSet.getProperties().getReplyToGroupId()); + logger.verbose("Message id {}.", messageId); return isSessionEnabled ? message.setSessionId(sessionId) : message; From ec6758bbd4aca4850a66a5a07f7574623c45db0f Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Mon, 7 Sep 2020 23:12:07 -0700 Subject: [PATCH 11/27] Incorporated Review comments --- .../azure/core/amqp/AmqpMessageConstant.java | 10 ++- .../azure/core/amqp/models/AmqpDataBody.java | 24 ++++++ .../amqp/models/AmqpMessageProperties.java | 6 +- .../azure/core/amqp/models/BinaryData.java | 2 +- .../amqp/models/AmqpAnnotatedMessageTest.java | 12 +-- .../core/amqp/models/AmqpDataBodyTest.java | 31 +++++++- .../core/amqp/models/BinaryDataTest.java | 2 +- .../eventhubs/EventHubAsyncClient.java | 2 +- .../servicebus/ServiceBusMessage.java | 58 ++++++++------- .../servicebus/ServiceBusMessageBatch.java | 3 +- .../ServiceBusMessageSerializer.java | 57 ++++++++------- .../servicebus/ServiceBusReceivedMessage.java | 73 +++++++++---------- .../servicebus/IntegrationTestBase.java | 1 - .../servicebus/ServiceBusMessageTest.java | 1 - .../ServiceBusReceivedMessageTest.java | 4 +- ...BusReceiverAsyncClientIntegrationTest.java | 4 +- 16 files changed, 171 insertions(+), 119 deletions(-) diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java index 4f250ca9719f..a1f48a78059d 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java @@ -93,7 +93,15 @@ public enum AmqpMessageConstant { /** * The name of the entity that published a message. */ - PUBLISHER_ANNOTATION_NAME("x-opt-publisher"); + PUBLISHER_ANNOTATION_NAME("x-opt-publisher"), + /** + * The name representing scheduled enqueue time. + */ + SCHEDULED_ENQUEUE_UTC_TIME_NAME("x-opt-scheduled-enqueue-time"), + /** + * The identifier associated with a given via-partition. + */ + VIA_PARTITION_KEY_ANNOTATION_NAME("x-opt-via-partition-key"); private static final Map RESERVED_CONSTANTS_MAP = new HashMap<>(); private final String constant; diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java index d39dcd7cdb5f..af6a78dd7623 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java @@ -12,6 +12,7 @@ */ public final class AmqpDataBody implements AmqpMessageBody { private final IterableStream data; + private final BinaryData binaryData; /** * Creates instance of {@link AmqpDataBody} with given {@link Iterable} of {@link BinaryData}. @@ -23,6 +24,19 @@ public final class AmqpDataBody implements AmqpMessageBody { public AmqpDataBody(Iterable data) { Objects.requireNonNull(data, "'data' cannot be null."); this.data = new IterableStream<>(data); + this.binaryData = null; + } + + /** + * Creates instance of {@link AmqpDataBody} with given instance of {@link BinaryData}. + * + * @param binaryData to be set on amqp body. + * + * @throws NullPointerException if {@code data} is null. + */ + public AmqpDataBody(BinaryData binaryData) { + this.binaryData = Objects.requireNonNull(binaryData, "'binaryData' cannot be null."); + this.data = null; } @Override @@ -32,9 +46,19 @@ public AmqpBodyType getBodyType() { /** * Gets {@link BinaryData} set on this {@link AmqpDataBody}. + * * @return data set on {@link AmqpDataBody}. */ public IterableStream getData() { return data; } + + /** + * Gets {@link BinaryData} set on this {@link AmqpDataBody}. + * + * @return data set on {@link AmqpDataBody}. + */ + public BinaryData getBinaryData() { + return binaryData; + } } diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java index 550e551776db..0798d882ec12 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java @@ -23,7 +23,7 @@ public class AmqpMessageProperties { private String correlationId; private OffsetDateTime creationTime; private String groupId; - private long groupSequence; + private Long groupSequence; private String messageId; private String replyToGroupId; private String replyTo; @@ -164,7 +164,7 @@ public AmqpMessageProperties setGroupId(String groupId) { * * @return the {@code groupSequence} value. */ - public long getGroupSequence() { + public Long getGroupSequence() { return groupSequence; } @@ -175,7 +175,7 @@ public long getGroupSequence() { * * @return updated {@link AmqpMessageProperties} object. */ - public AmqpMessageProperties setGroupSequence(long groupSequence) { + public AmqpMessageProperties setGroupSequence(Long groupSequence) { this.groupSequence = groupSequence; return this; } diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java index 63d77531dfd4..218e1eed10a3 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/BinaryData.java @@ -13,7 +13,7 @@ public final class BinaryData { private final byte[] data; /** - *Create {@link BinaryData} instance with given byte array data. + * Create {@link BinaryData} instance with given byte array data. * * @param data to use. */ diff --git a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java index 1b9724c4ea78..2440fcfc066a 100644 --- a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java +++ b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java @@ -33,7 +33,7 @@ public void constructorValidValues() { final AmqpDataBody amqpDataBody = new AmqpDataBody(binaryDataList); // Act - AmqpAnnotatedMessage actual = new AmqpAnnotatedMessage(amqpDataBody); + final AmqpAnnotatedMessage actual = new AmqpAnnotatedMessage(amqpDataBody); // Assert assertMessageCreation(actual, AmqpBodyType.DATA, binaryDataList.size()); @@ -47,9 +47,10 @@ public void constructorAmqpValidValues() { // Arrange final List listBinaryData = Collections.singletonList(DATA_BYTES); final AmqpDataBody amqpDataBody = new AmqpDataBody(listBinaryData); - AmqpAnnotatedMessage expected = new AmqpAnnotatedMessage(amqpDataBody); + final AmqpAnnotatedMessage expected = new AmqpAnnotatedMessage(amqpDataBody); + // Act - AmqpAnnotatedMessage actual = new AmqpAnnotatedMessage(expected); + final AmqpAnnotatedMessage actual = new AmqpAnnotatedMessage(expected); // Assert assertMessageCreation(actual, AmqpBodyType.DATA, listBinaryData.size()); @@ -61,7 +62,7 @@ public void constructorAmqpValidValues() { @Test public void constructorNullValidValues() { // Arrange - AmqpDataBody body = null; + final AmqpDataBody body = null; // Act & Assert Assertions.assertThrows(NullPointerException.class, () -> new AmqpAnnotatedMessage(body)); @@ -82,7 +83,6 @@ private void assertMessageCreation(AmqpAnnotatedMessage actual, AmqpBodyType exp assertNotNull(actual.getBody()); List dataList = ((AmqpDataBody) actual.getBody()).getData().stream().collect(Collectors.toList()); assertEquals(messageSizeExpected, dataList.size()); - byte[] actualData = dataList.get(0).getData(); - assertArrayEquals(CONTENTS_BYTES, actualData); + assertArrayEquals(CONTENTS_BYTES, dataList.get(0).getData()); } } diff --git a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java index f6005b6c92a7..9d2fedec65a9 100644 --- a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java +++ b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java @@ -13,6 +13,8 @@ import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; /** * Test for {@link AmqpDataBody}. @@ -30,16 +32,37 @@ public void constructorValidValues() { final List binaryDataList = Collections.singletonList(DATA_BYTES); // Act - AmqpDataBody actual = new AmqpDataBody(binaryDataList); + final AmqpDataBody actual = new AmqpDataBody(binaryDataList); // Assert assertEquals(AmqpBodyType.DATA, actual.getBodyType()); // Validate Message Body - List dataList = actual.getData().stream().collect(Collectors.toList()); + final BinaryData actualBinaryData = actual.getBinaryData(); + assertNull(actualBinaryData); + + final List dataList = actual.getData().stream().collect(Collectors.toList()); assertEquals(binaryDataList.size(), dataList.size()); - byte[] actualData = dataList.get(0).getData(); - assertArrayEquals(CONTENTS_BYTES, actualData); + assertArrayEquals(CONTENTS_BYTES, dataList.get(0).getData()); + } + + /** + * Verifies we correctly set values via constructor for {@link AmqpAnnotatedMessage}. + */ + @Test + public void constructorValidBinaryDataValue() { + + // Act & Arrange + final AmqpDataBody actual = new AmqpDataBody(DATA_BYTES); + + // Assert + assertEquals(AmqpBodyType.DATA, actual.getBodyType()); + + // Validate Message Body + final BinaryData actualBinaryData = actual.getBinaryData(); + assertNotNull(actualBinaryData); + + assertArrayEquals(CONTENTS_BYTES, actualBinaryData.getData()); } /** diff --git a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/BinaryDataTest.java b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/BinaryDataTest.java index ae75a1835da8..ba52eb9c996c 100644 --- a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/BinaryDataTest.java +++ b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/BinaryDataTest.java @@ -23,7 +23,7 @@ public class BinaryDataTest { @Test public void constructorValidValues() { // Arrange & Act - BinaryData actual = new BinaryData(CONTENTS_BYTES); + final BinaryData actual = new BinaryData(CONTENTS_BYTES); // Assert assertArrayEquals(CONTENTS_BYTES, actual.getData()); diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubAsyncClient.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubAsyncClient.java index 3a0598a08da5..12bdf1e311c2 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubAsyncClient.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubAsyncClient.java @@ -80,7 +80,7 @@ Mono getProperties() { * @return A Flux of identifiers for the partitions of an Event Hub. */ Flux getPartitionIds() { - return getProperties().flatMapMany(properties -> Flux.fromIterable(properties.getPartitionIds())); + return getProperties().flatMapMany(properties -> Flux.fromIterable(properties.Arrays.copyOfgetPartitionIds())); } /** diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java index 6a1918d82654..0f639f607aa8 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java @@ -3,8 +3,11 @@ package com.azure.messaging.servicebus; - +import static com.azure.core.amqp.AmqpMessageConstant.PARTITION_KEY_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.SCHEDULED_ENQUEUE_UTC_TIME_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.VIA_PARTITION_KEY_ANNOTATION_NAME; import com.azure.core.amqp.models.AmqpAnnotatedMessage; +import com.azure.core.amqp.models.AmqpBodyType; import com.azure.core.amqp.models.AmqpDataBody; import com.azure.core.amqp.models.BinaryData; import com.azure.core.util.Context; @@ -43,9 +46,6 @@ * @see ServiceBusMessageBatch */ public class ServiceBusMessage { - private static final String SCHEDULED_ENQUEUE_TIME_NAME = "x-opt-scheduled-enqueue-time"; - private static final String VIA_PARTITION_KEY_NAME = "x-opt-via-partition-key"; - private static final String PARTITION_KEY_NAME = "x-opt-partition-key"; private final AmqpAnnotatedMessage amqpAnnotatedMessage; private final ClientLogger logger = new ClientLogger(ServiceBusMessage.class); @@ -71,7 +71,8 @@ public ServiceBusMessage(String body) { */ public ServiceBusMessage(byte[] body) { this.context = Context.NONE; - amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList(new BinaryData(body)))); + amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(Collections + .singletonList(new BinaryData(body)))); } /** @@ -103,8 +104,9 @@ public ServiceBusMessage(ServiceBusReceivedMessage receivedMessage) { } /** + * Gets the {@link AmqpAnnotatedMessage}. * - * @return + * @return the amqp message. */ public AmqpAnnotatedMessage getAmqpAnnotatedMessage() { return amqpAnnotatedMessage; @@ -127,30 +129,29 @@ public Map getApplicationProperties() { * *

* If the means for deserializing the raw data is not apparent to consumers, a common technique is to make use of - * {@link #getApplicationProperties()} when creating the event, to associate serialization hints as an aid to consumers who - * wish to deserialize the binary data. + * {@link #getApplicationProperties()} when creating the event, to associate serialization hints as an aid to + * consumers who wish to deserialize the binary data. *

* * @return A byte array representing the data. */ public byte[] getBody() { byte[] body = null; - switch(amqpAnnotatedMessage.getBody().getBodyType()) { + final AmqpBodyType type = amqpAnnotatedMessage.getBody().getBodyType(); + switch (type) { case DATA: - List binaryData = ((AmqpDataBody)amqpAnnotatedMessage.getBody()).getData().stream() - .collect(Collectors.toList()); - if (binaryData != null && binaryData.size() > 0) { - byte[] firstData = binaryData.get(0).getData(); - body = Arrays.copyOf(firstData, firstData.length); + final BinaryData binaryData = ((AmqpDataBody) amqpAnnotatedMessage.getBody()).getBinaryData(); + if (binaryData != null) { + body = binaryData.getData(); } break; case SEQUENCE: case VALUE: - throw logger.logThrowableAsError(new UnsupportedOperationException("Not supported AmqpBodyType: " - + amqpAnnotatedMessage.getBody().getBodyType())); + throw logger.logExceptionAsError(new UnsupportedOperationException("Not supported AmqpBodyType: " + + amqpAnnotatedMessage.getBody().getBodyType().toString())); default: - throw logger.logThrowableAsError(new IllegalArgumentException("Unknown AmqpBodyType: " - + amqpAnnotatedMessage.getBody().getBodyType())); + throw logger.logExceptionAsError(new IllegalArgumentException("Unknown AmqpBodyType: " + + amqpAnnotatedMessage.getBody().getBodyType().toString())); } return body; } @@ -258,7 +259,7 @@ public ServiceBusMessage setMessageId(String messageId) { * entities */ public String getPartitionKey() { - return (String)amqpAnnotatedMessage.getMessageAnnotations().get(PARTITION_KEY_NAME); + return (String) amqpAnnotatedMessage.getMessageAnnotations().get(PARTITION_KEY_ANNOTATION_NAME.toString()); } /** @@ -270,7 +271,7 @@ public String getPartitionKey() { * @see #getPartitionKey() */ public ServiceBusMessage setPartitionKey(String partitionKey) { - amqpAnnotatedMessage.getMessageAnnotations().put(PARTITION_KEY_NAME, partitionKey); + amqpAnnotatedMessage.getMessageAnnotations().put(PARTITION_KEY_ANNOTATION_NAME.toString(), partitionKey); return this; } @@ -373,11 +374,10 @@ public ServiceBusMessage setTimeToLive(Duration timeToLive) { public OffsetDateTime getScheduledEnqueueTime() { OffsetDateTime scheduledEnqueueTime = null; Map messageAnnotationMap = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotationMap.containsKey(SCHEDULED_ENQUEUE_TIME_NAME)) { - scheduledEnqueueTime = ((Date) messageAnnotationMap.get(SCHEDULED_ENQUEUE_TIME_NAME)).toInstant() - .atOffset(ZoneOffset.UTC) ; + if (messageAnnotationMap.containsKey(SCHEDULED_ENQUEUE_UTC_TIME_NAME.toString())) { + scheduledEnqueueTime = ((Date) messageAnnotationMap.get(SCHEDULED_ENQUEUE_UTC_TIME_NAME.toString())) + .toInstant().atOffset(ZoneOffset.UTC); } - return scheduledEnqueueTime; } @@ -390,8 +390,10 @@ public OffsetDateTime getScheduledEnqueueTime() { * @see #getScheduledEnqueueTime() */ public ServiceBusMessage setScheduledEnqueueTime(OffsetDateTime scheduledEnqueueTime) { - Objects.requireNonNull(scheduledEnqueueTime, "'scheduledEnqueueTime' cannot be null."); - amqpAnnotatedMessage.getMessageAnnotations().put(SCHEDULED_ENQUEUE_TIME_NAME, scheduledEnqueueTime); + if (scheduledEnqueueTime != null) { + amqpAnnotatedMessage.getMessageAnnotations().put(SCHEDULED_ENQUEUE_UTC_TIME_NAME.toString(), + scheduledEnqueueTime); + } return this; } @@ -433,7 +435,7 @@ public ServiceBusMessage setReplyToSessionId(String replyToSessionId) { * and Send Via */ public String getViaPartitionKey() { - return (String)amqpAnnotatedMessage.getMessageAnnotations().get(VIA_PARTITION_KEY_NAME); + return (String) amqpAnnotatedMessage.getMessageAnnotations().get(VIA_PARTITION_KEY_ANNOTATION_NAME.toString()); } /** @@ -445,7 +447,7 @@ public String getViaPartitionKey() { * @see #getViaPartitionKey() */ public ServiceBusMessage setViaPartitionKey(String viaPartitionKey) { - amqpAnnotatedMessage.getMessageAnnotations().put(VIA_PARTITION_KEY_NAME, viaPartitionKey); + amqpAnnotatedMessage.getMessageAnnotations().put(VIA_PARTITION_KEY_ANNOTATION_NAME.toString(), viaPartitionKey); return this; } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java index af085609b6de..57d5f363fc8d 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageBatch.java @@ -144,7 +144,8 @@ private ServiceBusMessage traceMessageSpan(ServiceBusMessage serviceBusMessage) Context eventSpanContext = tracerProvider.startSpan(serviceBusMessage.getContext(), ProcessKind.MESSAGE); Optional eventDiagnosticIdOptional = eventSpanContext.getData(DIAGNOSTIC_ID_KEY); if (eventDiagnosticIdOptional.isPresent()) { - serviceBusMessage.getApplicationProperties().put(DIAGNOSTIC_ID_KEY, eventDiagnosticIdOptional.get().toString()); + serviceBusMessage.getApplicationProperties().put(DIAGNOSTIC_ID_KEY, eventDiagnosticIdOptional.get() + .toString()); tracerProvider.endSpan(eventSpanContext, Signal.complete()); serviceBusMessage.addContext(SPAN_CONTEXT_KEY, eventSpanContext); } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java index 4448b64ae7b0..4105e949fc4c 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java @@ -3,6 +3,9 @@ package com.azure.messaging.servicebus; +import static com.azure.core.amqp.AmqpMessageConstant.SCHEDULED_ENQUEUE_UTC_TIME_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.PARTITION_KEY_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.VIA_PARTITION_KEY_ANNOTATION_NAME; import com.azure.core.amqp.exception.AmqpResponseCode; import com.azure.core.amqp.implementation.MessageSerializer; import com.azure.core.amqp.implementation.RequestResponseUtils; @@ -59,9 +62,6 @@ */ class ServiceBusMessageSerializer implements MessageSerializer { private static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; - private static final String SCHEDULED_ENQUEUE_TIME_NAME = "x-opt-scheduled-enqueue-time"; - private static final String PARTITION_KEY_NAME = "x-opt-partition-key"; - private static final String VIA_PARTITION_KEY_NAME = "x-opt-via-partition-key"; private final ClientLogger logger = new ClientLogger(ServiceBusMessageSerializer.class); @@ -154,7 +154,8 @@ public Message serialize(T object) { amqpMessage.getProperties().setUserId(new Binary(brokeredProperties.getUserId())); if (brokeredProperties.getAbsoluteExpiryTime() != null) { - amqpMessage.getProperties().setAbsoluteExpiryTime(Date.from(brokeredProperties.getAbsoluteExpiryTime().toInstant())); + amqpMessage.getProperties().setAbsoluteExpiryTime(Date.from(brokeredProperties.getAbsoluteExpiryTime(). + toInstant())); } if (brokeredProperties.getCreationTime() != null) { amqpMessage.getProperties().setCreationTime(Date.from(brokeredProperties.getCreationTime().toInstant())); @@ -181,18 +182,19 @@ public Message serialize(T object) { final Map messageAnnotationsMap = new HashMap<>(); if (brokeredMessage.getScheduledEnqueueTime() != null) { - messageAnnotationsMap.put(Symbol.valueOf(SCHEDULED_ENQUEUE_TIME_NAME), + messageAnnotationsMap.put(Symbol.valueOf(SCHEDULED_ENQUEUE_UTC_TIME_NAME.toString()), Date.from(brokeredMessage.getScheduledEnqueueTime().toInstant())); } final String partitionKey = brokeredMessage.getPartitionKey(); if (partitionKey != null && !partitionKey.isEmpty()) { - messageAnnotationsMap.put(Symbol.valueOf(PARTITION_KEY_NAME), brokeredMessage.getPartitionKey()); + messageAnnotationsMap.put(Symbol.valueOf(PARTITION_KEY_ANNOTATION_NAME.toString()), + brokeredMessage.getPartitionKey()); } final String viaPartitionKey = brokeredMessage.getViaPartitionKey(); if (viaPartitionKey != null && !viaPartitionKey.isEmpty()) { - messageAnnotationsMap.put(Symbol.valueOf(VIA_PARTITION_KEY_NAME), viaPartitionKey); + messageAnnotationsMap.put(Symbol.valueOf(VIA_PARTITION_KEY_ANNOTATION_NAME.toString()), viaPartitionKey); } amqpMessage.setMessageAnnotations(new MessageAnnotations(messageAnnotationsMap)); @@ -200,14 +202,15 @@ public Message serialize(T object) { // Set Delivery Annotations. final Map deliveryAnnotationsMap = new HashMap<>(); - final Map deliveryAnnotations = brokeredMessage.getAmqpAnnotatedMessage().getDeliveryAnnotations(); - Iterator deliveryAnnotationIterator = deliveryAnnotations.keySet().iterator(); - while (deliveryAnnotationIterator.hasNext()) { - String key = deliveryAnnotationIterator.next(); - deliveryAnnotationsMap.put(Symbol.valueOf(key), deliveryAnnotations.get(key)); + final Map deliveryAnnotations = brokeredMessage.getAmqpAnnotatedMessage() + .getDeliveryAnnotations(); + Iterator> deliveryEntries = deliveryAnnotations.entrySet().iterator(); + while (deliveryEntries.hasNext()) { + Map.Entry deliveryEntry = deliveryEntries.next(); + deliveryAnnotationsMap.put(Symbol.valueOf(deliveryEntry.getKey()), deliveryEntry.getValue()); } - amqpMessage.setDeliveryAnnotations( new DeliveryAnnotations(deliveryAnnotationsMap)); + amqpMessage.setDeliveryAnnotations(new DeliveryAnnotations(deliveryAnnotationsMap)); return amqpMessage; } @@ -391,11 +394,12 @@ private ServiceBusReceivedMessage deserializeMessage(Message amqpMessage) { // Footer final Footer footer = amqpMessage.getFooter(); if (footer != null && footer.getValue() != null) { - final Map footerValue = footer.getValue(); - Iterator footerKeys = footerValue.keySet().iterator(); - while (footerKeys.hasNext()) { - Symbol key = footerKeys.next(); - brokeredAmqpAnnotatedMessage.getFooter().put(key.toString(), footerValue.get(key)); + @SuppressWarnings("unchecked") final Map footerValue = footer.getValue(); + Iterator> footerEntries = footerValue.entrySet().iterator(); + + while (footerEntries.hasNext()) { + Map.Entry footerEntry = footerEntries.next(); + brokeredAmqpAnnotatedMessage.getFooter().put(footerEntry.getKey().toString(), footerEntry.getValue()); } } @@ -417,6 +421,15 @@ private ServiceBusReceivedMessage deserializeMessage(Message amqpMessage) { final Properties amqpProperties = amqpMessage.getProperties(); if (amqpProperties != null) { brokeredProperties.setTo(amqpProperties.getTo()); + + if (amqpProperties.getAbsoluteExpiryTime() != null) { + brokeredProperties.setAbsoluteExpiryTime(amqpProperties.getAbsoluteExpiryTime().toInstant() + .atOffset(ZoneOffset.UTC)); + } + if (amqpProperties.getCreationTime() != null) { + brokeredProperties.setCreationTime(amqpProperties.getCreationTime().toInstant() + .atOffset(ZoneOffset.UTC)); + } } brokeredProperties.setSubject(amqpMessage.getSubject()); @@ -424,14 +437,6 @@ private ServiceBusReceivedMessage deserializeMessage(Message amqpMessage) { brokeredProperties.setContentEncoding(amqpMessage.getContentEncoding()); brokeredProperties.setGroupSequence(amqpMessage.getGroupSequence()); brokeredProperties.setUserId(amqpMessage.getUserId()); - if (amqpProperties.getAbsoluteExpiryTime() != null) { - brokeredProperties.setAbsoluteExpiryTime(amqpProperties.getAbsoluteExpiryTime().toInstant() - .atOffset(ZoneOffset.UTC)); - } - if (amqpProperties.getCreationTime() != null) { - brokeredProperties.setCreationTime(amqpProperties.getCreationTime().toInstant() - .atOffset(ZoneOffset.UTC)); - } // DeliveryAnnotations final DeliveryAnnotations deliveryAnnotations = amqpMessage.getDeliveryAnnotations(); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java index 01e619df1626..9a81d18df2d8 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java @@ -3,6 +3,10 @@ package com.azure.messaging.servicebus; +import static com.azure.core.amqp.AmqpMessageConstant.ENQUEUED_TIME_UTC_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.PARTITION_KEY_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.SCHEDULED_ENQUEUE_UTC_TIME_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.VIA_PARTITION_KEY_ANNOTATION_NAME; import com.azure.core.amqp.models.AmqpAnnotatedMessage; import com.azure.core.amqp.models.AmqpBodyType; import com.azure.core.amqp.models.AmqpDataBody; @@ -27,20 +31,16 @@ public final class ServiceBusReceivedMessage { private final ClientLogger logger = new ClientLogger(ServiceBusReceivedMessage.class); - private static final String ENQUEUED_TIME_UTC_NAME = "x-opt-enqueued-time"; private static final String SEQUENCE_NUMBER_NAME = "x-opt-sequence-number"; private static final String LOCKED_UNTIL_NAME = "x-opt-locked-until"; private static final String DEAD_LETTER_SOURCE_NAME = "x-opt-deadletter-source"; private static final String DEAD_LETTER_DESCRIPTION = "DeadLetterErrorDescription"; private static final String DEAD_LETTER_REASON = "DeadLetterReason"; - private static final String PARTITION_KEY_NAME = "x-opt-partition-key"; - private static final String VIA_PARTITION_KEY_NAME = "x-opt-via-partition-key"; - private static final String SCHEDULED_ENQUEUE_TIME_NAME = "x-opt-scheduled-enqueue-time"; // This one appears to always be 0, but is always returned with each message. private static final String ENQUEUED_SEQUENCE_NUMBER = "x-opt-enqueue-sequence-number"; - private AmqpAnnotatedMessage amqpAnnotatedMessage; + private final AmqpAnnotatedMessage amqpAnnotatedMessage; private UUID lockToken; /** @@ -48,14 +48,16 @@ public final class ServiceBusReceivedMessage { * * @see * Amqp Message Format. - * @return + * + * @return the {@link AmqpAnnotatedMessage} representing amqp message. */ public AmqpAnnotatedMessage getAmqpAnnotatedMessage() { return amqpAnnotatedMessage; } ServiceBusReceivedMessage(byte[] body) { - amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList(new BinaryData(body)))); + BinaryData binaryData = new BinaryData(body); + amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList(binaryData))); } /** @@ -72,22 +74,23 @@ public AmqpAnnotatedMessage getAmqpAnnotatedMessage() { public byte[] getBody() { byte[] body = null; final AmqpBodyType bodyType = amqpAnnotatedMessage.getBody().getBodyType(); - switch(bodyType) { + switch (bodyType) { case DATA: - List binaryData = ((AmqpDataBody)amqpAnnotatedMessage.getBody()).getData().stream() + final List binaryData = ((AmqpDataBody) amqpAnnotatedMessage.getBody()).getData().stream() .collect(Collectors.toList()); - if (binaryData != null && binaryData.size() > 0) { - byte[] firstData = binaryData.get(0).getData(); + if (binaryData.size() > 0) { + final byte[] firstData = binaryData.get(0).getData(); body = Arrays.copyOf(firstData, firstData.length); } + break; case SEQUENCE: case VALUE: - throw logger.logThrowableAsError(new UnsupportedOperationException("Body type not supported " - + bodyType)); + throw logger.logExceptionAsError(new UnsupportedOperationException("Body type not supported " + + bodyType.toString())); default: logger.warning("Invalid body type {}.", bodyType); - throw logger.logThrowableAsError(new IllegalStateException("Body type not valid " - + bodyType)); + throw logger.logExceptionAsError(new IllegalStateException("Body type not valid " + + bodyType.toString())); } return body; } @@ -123,7 +126,6 @@ public String getCorrelationId() { * @return The description for a message that has been dead-lettered. */ public String getDeadLetterErrorDescription() { - final Map properties = amqpAnnotatedMessage.getApplicationProperties(); if (properties.containsKey(DEAD_LETTER_DESCRIPTION)) { return String.valueOf(properties.get(DEAD_LETTER_DESCRIPTION)); @@ -193,13 +195,11 @@ public long getDeliveryCount() { */ public long getEnqueuedSequenceNumber() { long enqueuedSequenceNumber = 0; - final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); if (messageAnnotations.containsKey(ENQUEUED_SEQUENCE_NUMBER)) { Object value = messageAnnotations.get(ENQUEUED_SEQUENCE_NUMBER); enqueuedSequenceNumber = (long) value; } - return enqueuedSequenceNumber; } @@ -218,11 +218,10 @@ public long getEnqueuedSequenceNumber() { public OffsetDateTime getEnqueuedTime() { OffsetDateTime enqueuedTime = null; final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotations.containsKey(ENQUEUED_TIME_UTC_NAME)) { - Object value = messageAnnotations.get(ENQUEUED_TIME_UTC_NAME); + if (messageAnnotations.containsKey(ENQUEUED_TIME_UTC_ANNOTATION_NAME.toString())) { + Object value = messageAnnotations.get(ENQUEUED_TIME_UTC_ANNOTATION_NAME.toString()); enqueuedTime = ((Date) value).toInstant().atOffset(ZoneOffset.UTC); } - return enqueuedTime; } @@ -297,7 +296,6 @@ public OffsetDateTime getLockedUntil() { Object value = messageAnnotations.get(LOCKED_UNTIL_NAME); lockedUntil = ((Date) value).toInstant().atOffset(ZoneOffset.UTC); } - return lockedUntil; } @@ -325,11 +323,10 @@ public String getMessageId() { public String getPartitionKey() { String partitionKey = null; final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotations.containsKey(PARTITION_KEY_NAME)) { - Object value = messageAnnotations.get(PARTITION_KEY_NAME); + if (messageAnnotations.containsKey(PARTITION_KEY_ANNOTATION_NAME.toString())) { + Object value = messageAnnotations.get(PARTITION_KEY_ANNOTATION_NAME.toString()); partitionKey = (String) value; } - return partitionKey; } @@ -391,14 +388,12 @@ public String getReplyToSessionId() { * Timestamps */ public OffsetDateTime getScheduledEnqueueTime() { - OffsetDateTime scheduledEnqueueTime = null; final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotations.containsKey(SCHEDULED_ENQUEUE_TIME_NAME)) { - scheduledEnqueueTime = ((Date) messageAnnotations.get(SCHEDULED_ENQUEUE_TIME_NAME)).toInstant() - .atOffset(ZoneOffset.UTC); + if (messageAnnotations.containsKey(SCHEDULED_ENQUEUE_UTC_TIME_NAME.toString())) { + scheduledEnqueueTime = ((Date) messageAnnotations.get(SCHEDULED_ENQUEUE_UTC_TIME_NAME.toString())) + .toInstant().atOffset(ZoneOffset.UTC); } - return scheduledEnqueueTime; } @@ -416,15 +411,12 @@ public OffsetDateTime getScheduledEnqueueTime() { * Timestamps */ public long getSequenceNumber() { - long sequenceNumber = 0; - final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); if (messageAnnotations.containsKey(SEQUENCE_NUMBER_NAME)) { Object value = messageAnnotations.get(SEQUENCE_NUMBER_NAME); sequenceNumber = (long) value; } - return sequenceNumber; } @@ -477,11 +469,10 @@ public String getTo() { public String getViaPartitionKey() { String viaPartitionKey = null; final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotations.containsKey(VIA_PARTITION_KEY_NAME)) { - Object value = messageAnnotations.get(VIA_PARTITION_KEY_NAME); + if (messageAnnotations.containsKey(VIA_PARTITION_KEY_ANNOTATION_NAME.toString())) { + Object value = messageAnnotations.get(VIA_PARTITION_KEY_ANNOTATION_NAME.toString()); viaPartitionKey = (String) value; } - return viaPartitionKey; } @@ -555,7 +546,8 @@ void setEnqueuedSequenceNumber(long enqueuedSequenceNumber) { void setEnqueuedTime(OffsetDateTime enqueuedTime) { if (enqueuedTime != null) { long epochMilli = enqueuedTime.toInstant().toEpochMilli(); - amqpAnnotatedMessage.getMessageAnnotations().put(ENQUEUED_TIME_UTC_NAME, new Date(epochMilli)); + amqpAnnotatedMessage.getMessageAnnotations().put(ENQUEUED_TIME_UTC_ANNOTATION_NAME.toString(), + new Date(epochMilli)); } } @@ -606,7 +598,7 @@ void setMessageId(String messageId) { * @see #getPartitionKey() */ void setPartitionKey(String partitionKey) { - amqpAnnotatedMessage.getMessageAnnotations().put(PARTITION_KEY_NAME, partitionKey); + amqpAnnotatedMessage.getMessageAnnotations().put(PARTITION_KEY_ANNOTATION_NAME.toString(), partitionKey); } /** @@ -619,7 +611,8 @@ void setPartitionKey(String partitionKey) { void setScheduledEnqueueTime(OffsetDateTime scheduledEnqueueTime) { if (scheduledEnqueueTime != null) { long epochMilli = scheduledEnqueueTime.toInstant().toEpochMilli(); - amqpAnnotatedMessage.getMessageAnnotations().put(SCHEDULED_ENQUEUE_TIME_NAME, new Date(epochMilli)); + amqpAnnotatedMessage.getMessageAnnotations().put(SCHEDULED_ENQUEUE_UTC_TIME_NAME.toString(), + new Date(epochMilli)); } } @@ -694,6 +687,6 @@ void setTo(String to) { * @see #getViaPartitionKey() */ void setViaPartitionKey(String viaPartitionKey) { - amqpAnnotatedMessage.getMessageAnnotations().put(VIA_PARTITION_KEY_NAME, viaPartitionKey); + amqpAnnotatedMessage.getMessageAnnotations().put(VIA_PARTITION_KEY_ANNOTATION_NAME.toString(), viaPartitionKey); } } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java index 495dccf0386c..6d34fd642552 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/IntegrationTestBase.java @@ -7,7 +7,6 @@ import com.azure.core.amqp.ProxyAuthenticationType; import com.azure.core.amqp.ProxyOptions; import com.azure.core.amqp.implementation.ConnectionStringProperties; -import com.azure.core.amqp.models.AmqpAnnotatedMessage; import com.azure.core.test.TestBase; import com.azure.core.test.TestMode; import com.azure.core.util.Configuration; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java index ff9385243e53..8cd07d85cc0d 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java @@ -3,7 +3,6 @@ package com.azure.messaging.servicebus; -import com.azure.messaging.servicebus.ServiceBusMessage; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java index 3eaa6e99ac6e..4d5f8c897858 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java @@ -3,8 +3,6 @@ package com.azure.messaging.servicebus; -import com.azure.messaging.servicebus.ServiceBusMessage; -import com.azure.messaging.servicebus.ServiceBusReceivedMessage; import org.apache.qpid.proton.amqp.Binary; import org.apache.qpid.proton.amqp.messaging.Data; import org.apache.qpid.proton.message.Message; @@ -78,7 +76,7 @@ public void toServiceBusMessageTest() { Data data = new Data(new Binary(PAYLOAD_BYTES)); when(amqpMessage.getBody()).thenReturn(data); // - final ServiceBusReceivedMessage originalMessage = new ServiceBusReceivedMessage(amqpMessage); + final ServiceBusReceivedMessage originalMessage = new ServiceBusReceivedMessage(PAYLOAD_BYTES); originalMessage.setMessageId("mid"); originalMessage.setContentType("type"); originalMessage.setCorrelationId("cid"); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java index 367f6850117e..846fa097a61a 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java @@ -996,10 +996,10 @@ void receiveAndValidateProperties(MessagingEntityType entityType) { expectedAmqpProperties.getProperties().setAbsoluteExpiryTime(OffsetDateTime.now().plusSeconds(60)); expectedAmqpProperties.getProperties().setUserId("user-id-1".getBytes()); expectedAmqpProperties.getProperties().setContentEncoding("string"); - expectedAmqpProperties.getProperties().setGroupSequence(2); + expectedAmqpProperties.getProperties().setGroupSequence(Long.valueOf(2)); expectedAmqpProperties.getProperties().setCreationTime(OffsetDateTime.now().plusSeconds(30)); - expectedAmqpProperties.getHeader().setPriority((short)2); + expectedAmqpProperties.getHeader().setPriority(Short.valueOf((short) 2)); expectedAmqpProperties.getHeader().setFirstAcquirer(true); expectedAmqpProperties.getHeader().setDurable(true); From 587d2e9d82a47e6198ac6340924466c8e3a1d4d7 Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Mon, 7 Sep 2020 23:48:12 -0700 Subject: [PATCH 12/27] Incorporated Review comments --- .../azure/core/amqp/AmqpMessageConstant.java | 10 ++++- .../servicebus/ServiceBusMessage.java | 7 +--- .../servicebus/ServiceBusReceivedMessage.java | 37 +++++++++---------- 3 files changed, 27 insertions(+), 27 deletions(-) diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java index a1f48a78059d..0e5e20c319f8 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java @@ -101,7 +101,15 @@ public enum AmqpMessageConstant { /** * The identifier associated with a given via-partition. */ - VIA_PARTITION_KEY_ANNOTATION_NAME("x-opt-via-partition-key"); + VIA_PARTITION_KEY_ANNOTATION_NAME("x-opt-via-partition-key"), + /** + * The identifier for locked until. + */ + LOCKED_UNTIL_KEY_ANNOTATION_NAME("x-opt-locked-until"), + /** + * The identifier for deadletter source. + */ + DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME("x-opt-deadletter-source"); private static final Map RESERVED_CONSTANTS_MAP = new HashMap<>(); private final String constant; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java index 0f639f607aa8..5b89af315e59 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java @@ -17,13 +17,9 @@ import java.time.Duration; import java.time.OffsetDateTime; import java.time.ZoneOffset; -import java.util.Arrays; -import java.util.Collections; import java.util.Date; -import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; /** * The data structure encapsulating the message being sent-to Service Bus. @@ -71,8 +67,7 @@ public ServiceBusMessage(String body) { */ public ServiceBusMessage(byte[] body) { this.context = Context.NONE; - amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(Collections - .singletonList(new BinaryData(body)))); + amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(new BinaryData(body))); } /** diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java index 9a81d18df2d8..cb672b0ff7b5 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java @@ -7,6 +7,9 @@ import static com.azure.core.amqp.AmqpMessageConstant.PARTITION_KEY_ANNOTATION_NAME; import static com.azure.core.amqp.AmqpMessageConstant.SCHEDULED_ENQUEUE_UTC_TIME_NAME; import static com.azure.core.amqp.AmqpMessageConstant.VIA_PARTITION_KEY_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.SEQUENCE_NUMBER_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.LOCKED_UNTIL_KEY_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME; import com.azure.core.amqp.models.AmqpAnnotatedMessage; import com.azure.core.amqp.models.AmqpBodyType; import com.azure.core.amqp.models.AmqpDataBody; @@ -17,13 +20,10 @@ import java.time.Duration; import java.time.OffsetDateTime; import java.time.ZoneOffset; -import java.util.Arrays; import java.util.Collections; import java.util.Date; -import java.util.List; import java.util.Map; import java.util.UUID; -import java.util.stream.Collectors; /** * This class represents a received message from Service Bus. @@ -31,9 +31,6 @@ public final class ServiceBusReceivedMessage { private final ClientLogger logger = new ClientLogger(ServiceBusReceivedMessage.class); - private static final String SEQUENCE_NUMBER_NAME = "x-opt-sequence-number"; - private static final String LOCKED_UNTIL_NAME = "x-opt-locked-until"; - private static final String DEAD_LETTER_SOURCE_NAME = "x-opt-deadletter-source"; private static final String DEAD_LETTER_DESCRIPTION = "DeadLetterErrorDescription"; private static final String DEAD_LETTER_REASON = "DeadLetterReason"; @@ -76,11 +73,9 @@ public byte[] getBody() { final AmqpBodyType bodyType = amqpAnnotatedMessage.getBody().getBodyType(); switch (bodyType) { case DATA: - final List binaryData = ((AmqpDataBody) amqpAnnotatedMessage.getBody()).getData().stream() - .collect(Collectors.toList()); - if (binaryData.size() > 0) { - final byte[] firstData = binaryData.get(0).getData(); - body = Arrays.copyOf(firstData, firstData.length); + final BinaryData binaryData = ((AmqpDataBody) amqpAnnotatedMessage.getBody()).getBinaryData(); + if (binaryData != null) { + body = binaryData.getData(); } break; case SEQUENCE: @@ -161,8 +156,8 @@ public String getDeadLetterReason() { */ public String getDeadLetterSource() { final Map properties = amqpAnnotatedMessage.getApplicationProperties(); - if (properties.containsKey(DEAD_LETTER_SOURCE_NAME)) { - return String.valueOf(properties.get(DEAD_LETTER_SOURCE_NAME)); + if (properties.containsKey(DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME.toString())) { + return String.valueOf(properties.get(DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME.toString())); } return null; } @@ -292,8 +287,8 @@ public String getLockToken() { public OffsetDateTime getLockedUntil() { OffsetDateTime lockedUntil = null; final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotations.containsKey(LOCKED_UNTIL_NAME)) { - Object value = messageAnnotations.get(LOCKED_UNTIL_NAME); + if (messageAnnotations.containsKey(LOCKED_UNTIL_KEY_ANNOTATION_NAME.toString())) { + Object value = messageAnnotations.get(LOCKED_UNTIL_KEY_ANNOTATION_NAME.toString()); lockedUntil = ((Date) value).toInstant().atOffset(ZoneOffset.UTC); } return lockedUntil; @@ -413,8 +408,8 @@ public OffsetDateTime getScheduledEnqueueTime() { public long getSequenceNumber() { long sequenceNumber = 0; final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotations.containsKey(SEQUENCE_NUMBER_NAME)) { - Object value = messageAnnotations.get(SEQUENCE_NUMBER_NAME); + if (messageAnnotations.containsKey(SEQUENCE_NUMBER_ANNOTATION_NAME.toString())) { + Object value = messageAnnotations.get(SEQUENCE_NUMBER_ANNOTATION_NAME.toString()); sequenceNumber = (long) value; } return sequenceNumber; @@ -522,7 +517,8 @@ void setDeadLetterReason(String deadLetterReason) { * before it was deadlettered. */ void setDeadLetterSource(String deadLetterSource) { - amqpAnnotatedMessage.getApplicationProperties().put(DEAD_LETTER_SOURCE_NAME, deadLetterSource); + amqpAnnotatedMessage.getApplicationProperties().put(DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME.toString(), + deadLetterSource); } /** @@ -577,7 +573,8 @@ void setLockToken(UUID lockToken) { void setLockedUntil(OffsetDateTime lockedUntil) { if (lockedUntil != null) { long epochMilli = lockedUntil.toInstant().toEpochMilli(); - amqpAnnotatedMessage.getMessageAnnotations().put(LOCKED_UNTIL_NAME, new Date(epochMilli)); + amqpAnnotatedMessage.getMessageAnnotations().put(LOCKED_UNTIL_KEY_ANNOTATION_NAME.toString(), + new Date(epochMilli)); } } @@ -622,7 +619,7 @@ void setScheduledEnqueueTime(OffsetDateTime scheduledEnqueueTime) { * @param sequenceNumber the unique number assigned to a message by Service Bus. */ void setSequenceNumber(long sequenceNumber) { - amqpAnnotatedMessage.getMessageAnnotations().put(SEQUENCE_NUMBER_NAME, sequenceNumber); + amqpAnnotatedMessage.getMessageAnnotations().put(SEQUENCE_NUMBER_ANNOTATION_NAME.toString(), sequenceNumber); } /** From 8fbbf9fc42d4f8fb26b660a90b942c6388525478 Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Tue, 8 Sep 2020 01:01:43 -0700 Subject: [PATCH 13/27] fixing some test --- .../azure/messaging/eventhubs/EventHubAsyncClient.java | 2 +- .../com/azure/messaging/servicebus/ServiceBusMessage.java | 5 ++++- .../messaging/servicebus/ServiceBusMessageSerializer.java | 8 ++++++-- .../messaging/servicebus/ServiceBusReceivedMessage.java | 7 ++++--- .../ServiceBusReceiverAsyncClientIntegrationTest.java | 6 +----- .../java/com/azure/messaging/servicebus/TestUtils.java | 1 + sdk/servicebus/test-resources.json | 2 +- 7 files changed, 18 insertions(+), 13 deletions(-) diff --git a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubAsyncClient.java b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubAsyncClient.java index 12bdf1e311c2..3a0598a08da5 100644 --- a/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubAsyncClient.java +++ b/sdk/eventhubs/azure-messaging-eventhubs/src/main/java/com/azure/messaging/eventhubs/EventHubAsyncClient.java @@ -80,7 +80,7 @@ Mono getProperties() { * @return A Flux of identifiers for the partitions of an Event Hub. */ Flux getPartitionIds() { - return getProperties().flatMapMany(properties -> Flux.fromIterable(properties.Arrays.copyOfgetPartitionIds())); + return getProperties().flatMapMany(properties -> Flux.fromIterable(properties.getPartitionIds())); } /** diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java index 5b89af315e59..3afefc0c66fd 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java @@ -66,6 +66,7 @@ public ServiceBusMessage(String body) { * @throws NullPointerException if {@code body} is {@code null}. */ public ServiceBusMessage(byte[] body) { + Objects.requireNonNull(body, "'body' cannot be null."); this.context = Context.NONE; amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(new BinaryData(body))); } @@ -79,7 +80,8 @@ public ServiceBusMessage(byte[] body) { * @throws NullPointerException if {@code receivedMessage} is {@code null}. */ public ServiceBusMessage(ServiceBusReceivedMessage receivedMessage) { - this.amqpAnnotatedMessage = new AmqpAnnotatedMessage(receivedMessage.getAmqpAnnotatedMessage()); + Objects.requireNonNull(receivedMessage, "'receivedMessage' cannot be null."); + this.amqpAnnotatedMessage = new AmqpAnnotatedMessage(receivedMessage.getAmqpAnnotatedMessage().getBody()); this.context = Context.NONE; setMessageId(receivedMessage.getMessageId()); setScheduledEnqueueTime(receivedMessage.getScheduledEnqueueTime()); @@ -96,6 +98,7 @@ public ServiceBusMessage(ServiceBusReceivedMessage receivedMessage) { //TODO (Hemant): Cleanup the values from AmqpAnnotatedMessage which should never be set by user. // Some values of MessageAnnotations , Header.deliveryCount etc + } /** diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java index 4105e949fc4c..60af28db584d 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java @@ -149,7 +149,9 @@ public Message serialize(T object) { amqpMessage.setReplyToGroupId(brokeredMessage.getReplyToSessionId()); amqpMessage.setGroupId(brokeredMessage.getSessionId()); amqpMessage.setContentEncoding(brokeredProperties.getContentEncoding()); - amqpMessage.setGroupSequence(brokeredProperties.getGroupSequence()); + if (brokeredProperties.getGroupSequence() != null) { + amqpMessage.setGroupSequence(brokeredProperties.getGroupSequence()); + } amqpMessage.getProperties().setTo(brokeredMessage.getTo()); amqpMessage.getProperties().setUserId(new Binary(brokeredProperties.getUserId())); @@ -169,7 +171,9 @@ public Message serialize(T object) { if (header.getDeliveryCount() != null) { amqpMessage.setDeliveryCount(brokeredMessage.getAmqpAnnotatedMessage().getHeader().getDeliveryCount()); } - amqpMessage.setPriority(brokeredMessage.getAmqpAnnotatedMessage().getHeader().getPriority()); + if (header.getPriority() != null) { + amqpMessage.setPriority(header.getPriority()); + } if (header.isDurable() != null) { amqpMessage.setDurable(brokeredMessage.getAmqpAnnotatedMessage().getHeader().isDurable()); } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java index cb672b0ff7b5..ea17073c9c4a 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java @@ -23,6 +23,7 @@ import java.util.Collections; import java.util.Date; import java.util.Map; +import java.util.Objects; import java.util.UUID; /** @@ -53,8 +54,8 @@ public AmqpAnnotatedMessage getAmqpAnnotatedMessage() { } ServiceBusReceivedMessage(byte[] body) { - BinaryData binaryData = new BinaryData(body); - amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList(binaryData))); + Objects.requireNonNull(body, "'body' cannot be null."); + amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(new BinaryData(body))); } /** @@ -80,7 +81,7 @@ public byte[] getBody() { break; case SEQUENCE: case VALUE: - throw logger.logExceptionAsError(new UnsupportedOperationException("Body type not supported " + throw logger.logExceptionAsError(new UnsupportedOperationException("Body type not supported yet " + bodyType.toString())); default: logger.warning("Invalid body type {}.", bodyType); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java index 846fa097a61a..d2b9cfa98780 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java @@ -980,10 +980,7 @@ void receiveAndValidateProperties(MessagingEntityType entityType) { deliveryAnnotation.put("delivery-annotations-key-1", "delivery-annotations-value-1"); deliveryAnnotation.put("delivery-annotations-key-2", "delivery-annotations-value-2"); - setSenderAndReceiver(entityType, 0, isSessionEnabled); - ServiceBusReceiverAsyncClient deadLetterReceiver = getDeadLetterReceiverBuilder(false, entityType, - 0, Function.identity()) - .buildAsyncClient(); + setSenderAndReceiver(entityType, TestUtils.USE_CASE_VALIDATE_AMQP_PROPERTIES, isSessionEnabled); final String messageId = UUID.randomUUID().toString(); final AmqpAnnotatedMessage expectedAmqpProperties = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList(new BinaryData(CONTENTS_BYTES)))); @@ -1007,7 +1004,6 @@ void receiveAndValidateProperties(MessagingEntityType entityType) { expectedAmqpProperties.getDeliveryAnnotations().putAll(deliveryAnnotation); expectedAmqpProperties.getApplicationProperties().putAll(aplicaitonProperties); - final ServiceBusMessage message = getMessage(messageId, isSessionEnabled, expectedAmqpProperties); sendMessage(message).block(TIMEOUT); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java index a898c8c2734e..dc0cc0088b21 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/TestUtils.java @@ -55,6 +55,7 @@ public class TestUtils { static final int USE_CASE_SEND_VIA_QUEUE_2 = 14; static final int USE_CASE_SEND_VIA_TOPIC_1 = 15; static final int USE_CASE_SEND_VIA_TOPIC_2 = 16; + static final int USE_CASE_VALIDATE_AMQP_PROPERTIES = 17; // An application property key to identify where in the stream this message was created. static final String MESSAGE_POSITION_ID = "message-position"; diff --git a/sdk/servicebus/test-resources.json b/sdk/servicebus/test-resources.json index ee1c184187f9..97672339014f 100644 --- a/sdk/servicebus/test-resources.json +++ b/sdk/servicebus/test-resources.json @@ -56,7 +56,7 @@ "namespaceDomainNameSuffix": "servicebus.windows.net", "queueName": "queue", "queueSessionName": "queue-session", - "numberOfInstances": 17, + "numberOfInstances": 20, "subscriptionName": "subscription", "subscriptionSessionName": "subscription-session", "serviceBusDataOwnerRoleId": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/090c5cfd-751d-490a-894a-3ce6f1109419')]", From 08634212d487f007a0eb06624128edefed8e7402 Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Tue, 8 Sep 2020 01:42:50 -0700 Subject: [PATCH 14/27] Fixing text --- .../servicebus/ServiceBusMessage.java | 14 ++++----- .../ServiceBusMessageSerializer.java | 6 ++-- .../servicebus/ServiceBusReceivedMessage.java | 29 +++++++++---------- 3 files changed, 24 insertions(+), 25 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java index 3afefc0c66fd..cb07323908d5 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java @@ -257,7 +257,7 @@ public ServiceBusMessage setMessageId(String messageId) { * entities */ public String getPartitionKey() { - return (String) amqpAnnotatedMessage.getMessageAnnotations().get(PARTITION_KEY_ANNOTATION_NAME.toString()); + return (String) amqpAnnotatedMessage.getMessageAnnotations().get(PARTITION_KEY_ANNOTATION_NAME.getValue()); } /** @@ -269,7 +269,7 @@ public String getPartitionKey() { * @see #getPartitionKey() */ public ServiceBusMessage setPartitionKey(String partitionKey) { - amqpAnnotatedMessage.getMessageAnnotations().put(PARTITION_KEY_ANNOTATION_NAME.toString(), partitionKey); + amqpAnnotatedMessage.getMessageAnnotations().put(PARTITION_KEY_ANNOTATION_NAME.getValue(), partitionKey); return this; } @@ -372,8 +372,8 @@ public ServiceBusMessage setTimeToLive(Duration timeToLive) { public OffsetDateTime getScheduledEnqueueTime() { OffsetDateTime scheduledEnqueueTime = null; Map messageAnnotationMap = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotationMap.containsKey(SCHEDULED_ENQUEUE_UTC_TIME_NAME.toString())) { - scheduledEnqueueTime = ((Date) messageAnnotationMap.get(SCHEDULED_ENQUEUE_UTC_TIME_NAME.toString())) + if (messageAnnotationMap.containsKey(SCHEDULED_ENQUEUE_UTC_TIME_NAME.getValue())) { + scheduledEnqueueTime = ((Date) messageAnnotationMap.get(SCHEDULED_ENQUEUE_UTC_TIME_NAME.getValue())) .toInstant().atOffset(ZoneOffset.UTC); } return scheduledEnqueueTime; @@ -389,7 +389,7 @@ public OffsetDateTime getScheduledEnqueueTime() { */ public ServiceBusMessage setScheduledEnqueueTime(OffsetDateTime scheduledEnqueueTime) { if (scheduledEnqueueTime != null) { - amqpAnnotatedMessage.getMessageAnnotations().put(SCHEDULED_ENQUEUE_UTC_TIME_NAME.toString(), + amqpAnnotatedMessage.getMessageAnnotations().put(SCHEDULED_ENQUEUE_UTC_TIME_NAME.getValue(), scheduledEnqueueTime); } return this; @@ -433,7 +433,7 @@ public ServiceBusMessage setReplyToSessionId(String replyToSessionId) { * and Send Via */ public String getViaPartitionKey() { - return (String) amqpAnnotatedMessage.getMessageAnnotations().get(VIA_PARTITION_KEY_ANNOTATION_NAME.toString()); + return (String) amqpAnnotatedMessage.getMessageAnnotations().get(VIA_PARTITION_KEY_ANNOTATION_NAME.getValue()); } /** @@ -445,7 +445,7 @@ public String getViaPartitionKey() { * @see #getViaPartitionKey() */ public ServiceBusMessage setViaPartitionKey(String viaPartitionKey) { - amqpAnnotatedMessage.getMessageAnnotations().put(VIA_PARTITION_KEY_ANNOTATION_NAME.toString(), viaPartitionKey); + amqpAnnotatedMessage.getMessageAnnotations().put(VIA_PARTITION_KEY_ANNOTATION_NAME.getValue(), viaPartitionKey); return this; } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java index 60af28db584d..9d817a0eab9f 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java @@ -186,19 +186,19 @@ public Message serialize(T object) { final Map messageAnnotationsMap = new HashMap<>(); if (brokeredMessage.getScheduledEnqueueTime() != null) { - messageAnnotationsMap.put(Symbol.valueOf(SCHEDULED_ENQUEUE_UTC_TIME_NAME.toString()), + messageAnnotationsMap.put(Symbol.valueOf(SCHEDULED_ENQUEUE_UTC_TIME_NAME.getValue()), Date.from(brokeredMessage.getScheduledEnqueueTime().toInstant())); } final String partitionKey = brokeredMessage.getPartitionKey(); if (partitionKey != null && !partitionKey.isEmpty()) { - messageAnnotationsMap.put(Symbol.valueOf(PARTITION_KEY_ANNOTATION_NAME.toString()), + messageAnnotationsMap.put(Symbol.valueOf(PARTITION_KEY_ANNOTATION_NAME.getValue()), brokeredMessage.getPartitionKey()); } final String viaPartitionKey = brokeredMessage.getViaPartitionKey(); if (viaPartitionKey != null && !viaPartitionKey.isEmpty()) { - messageAnnotationsMap.put(Symbol.valueOf(VIA_PARTITION_KEY_ANNOTATION_NAME.toString()), viaPartitionKey); + messageAnnotationsMap.put(Symbol.valueOf(VIA_PARTITION_KEY_ANNOTATION_NAME.getValue()), viaPartitionKey); } amqpMessage.setMessageAnnotations(new MessageAnnotations(messageAnnotationsMap)); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java index ea17073c9c4a..f8f7600a9953 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java @@ -20,7 +20,6 @@ import java.time.Duration; import java.time.OffsetDateTime; import java.time.ZoneOffset; -import java.util.Collections; import java.util.Date; import java.util.Map; import java.util.Objects; @@ -157,8 +156,8 @@ public String getDeadLetterReason() { */ public String getDeadLetterSource() { final Map properties = amqpAnnotatedMessage.getApplicationProperties(); - if (properties.containsKey(DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME.toString())) { - return String.valueOf(properties.get(DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME.toString())); + if (properties.containsKey(DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME.getValue())) { + return String.valueOf(properties.get(DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME.getValue())); } return null; } @@ -214,8 +213,8 @@ public long getEnqueuedSequenceNumber() { public OffsetDateTime getEnqueuedTime() { OffsetDateTime enqueuedTime = null; final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotations.containsKey(ENQUEUED_TIME_UTC_ANNOTATION_NAME.toString())) { - Object value = messageAnnotations.get(ENQUEUED_TIME_UTC_ANNOTATION_NAME.toString()); + if (messageAnnotations.containsKey(ENQUEUED_TIME_UTC_ANNOTATION_NAME.getValue())) { + Object value = messageAnnotations.get(ENQUEUED_TIME_UTC_ANNOTATION_NAME.getValue()); enqueuedTime = ((Date) value).toInstant().atOffset(ZoneOffset.UTC); } return enqueuedTime; @@ -288,8 +287,8 @@ public String getLockToken() { public OffsetDateTime getLockedUntil() { OffsetDateTime lockedUntil = null; final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotations.containsKey(LOCKED_UNTIL_KEY_ANNOTATION_NAME.toString())) { - Object value = messageAnnotations.get(LOCKED_UNTIL_KEY_ANNOTATION_NAME.toString()); + if (messageAnnotations.containsKey(LOCKED_UNTIL_KEY_ANNOTATION_NAME.getValue())) { + Object value = messageAnnotations.get(LOCKED_UNTIL_KEY_ANNOTATION_NAME.getValue()); lockedUntil = ((Date) value).toInstant().atOffset(ZoneOffset.UTC); } return lockedUntil; @@ -319,8 +318,8 @@ public String getMessageId() { public String getPartitionKey() { String partitionKey = null; final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotations.containsKey(PARTITION_KEY_ANNOTATION_NAME.toString())) { - Object value = messageAnnotations.get(PARTITION_KEY_ANNOTATION_NAME.toString()); + if (messageAnnotations.containsKey(PARTITION_KEY_ANNOTATION_NAME.getValue())) { + Object value = messageAnnotations.get(PARTITION_KEY_ANNOTATION_NAME.getValue()); partitionKey = (String) value; } return partitionKey; @@ -386,8 +385,8 @@ public String getReplyToSessionId() { public OffsetDateTime getScheduledEnqueueTime() { OffsetDateTime scheduledEnqueueTime = null; final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotations.containsKey(SCHEDULED_ENQUEUE_UTC_TIME_NAME.toString())) { - scheduledEnqueueTime = ((Date) messageAnnotations.get(SCHEDULED_ENQUEUE_UTC_TIME_NAME.toString())) + if (messageAnnotations.containsKey(SCHEDULED_ENQUEUE_UTC_TIME_NAME.getValue())) { + scheduledEnqueueTime = ((Date) messageAnnotations.get(SCHEDULED_ENQUEUE_UTC_TIME_NAME.getValue())) .toInstant().atOffset(ZoneOffset.UTC); } return scheduledEnqueueTime; @@ -409,8 +408,8 @@ public OffsetDateTime getScheduledEnqueueTime() { public long getSequenceNumber() { long sequenceNumber = 0; final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotations.containsKey(SEQUENCE_NUMBER_ANNOTATION_NAME.toString())) { - Object value = messageAnnotations.get(SEQUENCE_NUMBER_ANNOTATION_NAME.toString()); + if (messageAnnotations.containsKey(SEQUENCE_NUMBER_ANNOTATION_NAME.getValue())) { + Object value = messageAnnotations.get(SEQUENCE_NUMBER_ANNOTATION_NAME.getValue()); sequenceNumber = (long) value; } return sequenceNumber; @@ -465,8 +464,8 @@ public String getTo() { public String getViaPartitionKey() { String viaPartitionKey = null; final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotations.containsKey(VIA_PARTITION_KEY_ANNOTATION_NAME.toString())) { - Object value = messageAnnotations.get(VIA_PARTITION_KEY_ANNOTATION_NAME.toString()); + if (messageAnnotations.containsKey(VIA_PARTITION_KEY_ANNOTATION_NAME.getValue())) { + Object value = messageAnnotations.get(VIA_PARTITION_KEY_ANNOTATION_NAME.getValue()); viaPartitionKey = (String) value; } return viaPartitionKey; From 72c38185976f637d9e76bd24742ce53b3f3f0c2b Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Tue, 8 Sep 2020 09:39:32 -0700 Subject: [PATCH 15/27] Fix test and checkstyle --- .../servicebus/administration/models/CorrelationRuleFilter.java | 2 +- .../messaging/servicebus/ServiceBusSenderAsyncClientTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CorrelationRuleFilter.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CorrelationRuleFilter.java index da66d912e9ad..3792823e6e11 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CorrelationRuleFilter.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/models/CorrelationRuleFilter.java @@ -16,7 +16,7 @@ * A CorrelationRuleFilter holds a set of conditions that are matched against one of more of an arriving message's user * and system properties. A common use is a match against the {@link ServiceBusMessage#getCorrelationId()} property, but * the application can also choose to match against {@link ServiceBusMessage#getContentType()}, {@link - * ServiceBusMessage#getLabel()}, {@link ServiceBusMessage#getMessageId()}, {@link ServiceBusMessage#getReplyTo()}, + * ServiceBusMessage#getSubject()}, {@link ServiceBusMessage#getMessageId()}, {@link ServiceBusMessage#getReplyTo()}, * {@link ServiceBusMessage#getReplyToSessionId()}, {@link ServiceBusMessage#getSessionId()}, {@link * ServiceBusMessage#getTo()}, and any user-defined properties. A match exists when an arriving message's value for a * property is equal to the value specified in the correlation filter. For string expressions, the comparison is diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientTest.java index c7dc1b146126..3d5384d5376b 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusSenderAsyncClientTest.java @@ -235,7 +235,7 @@ void createsMessageBatchWithSize() { int batchSize = 1024; // Overhead when serializing an event, to figure out what the maximum size we can use for an event payload. - int eventOverhead = 46; + int eventOverhead = 75; int maxEventPayload = batchSize - eventOverhead; final AmqpSendLink link = mock(AmqpSendLink.class); From 836e6b396bdb9dfad4a494a5853afdc8518f51e7 Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Tue, 8 Sep 2020 14:21:12 -0700 Subject: [PATCH 16/27] Incorporated review comments. --- .../azure/core/amqp/AmqpMessageConstant.java | 15 +- .../azure/core/amqp/models/AmqpDataBody.java | 23 --- .../core/amqp/models/AmqpDataBodyTest.java | 24 --- .../servicebus/ServiceBusMessage.java | 70 ++++++--- .../servicebus/ServiceBusReceivedMessage.java | 142 ++++++++---------- .../ServiceBusReceivedMessageTest.java | 76 +++++++--- 6 files changed, 177 insertions(+), 173 deletions(-) diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java index 0e5e20c319f8..3cc986e779ef 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java @@ -109,7 +109,20 @@ public enum AmqpMessageConstant { /** * The identifier for deadletter source. */ - DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME("x-opt-deadletter-source"); + DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME("x-opt-deadletter-source"), + /** + * The name representing enqueue sequence number. + * This one appears to always be 0, but is always returned with each message. + */ + ENQUEUED_SEQUENCE_NUMBER_ANNOTATION_NAME("x-opt-enqueue-sequence-number"), + /** + * The identifier for deadletter description. + */ + DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME("DeadLetterErrorDescription"), + /** + * The identifier for deadletter reason. + */ + DEAD_LETTER_REASON_ANNOTATION_NAME("DeadLetterReason"); private static final Map RESERVED_CONSTANTS_MAP = new HashMap<>(); private final String constant; diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java index af6a78dd7623..a71b65f45d61 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpDataBody.java @@ -12,7 +12,6 @@ */ public final class AmqpDataBody implements AmqpMessageBody { private final IterableStream data; - private final BinaryData binaryData; /** * Creates instance of {@link AmqpDataBody} with given {@link Iterable} of {@link BinaryData}. @@ -24,19 +23,6 @@ public final class AmqpDataBody implements AmqpMessageBody { public AmqpDataBody(Iterable data) { Objects.requireNonNull(data, "'data' cannot be null."); this.data = new IterableStream<>(data); - this.binaryData = null; - } - - /** - * Creates instance of {@link AmqpDataBody} with given instance of {@link BinaryData}. - * - * @param binaryData to be set on amqp body. - * - * @throws NullPointerException if {@code data} is null. - */ - public AmqpDataBody(BinaryData binaryData) { - this.binaryData = Objects.requireNonNull(binaryData, "'binaryData' cannot be null."); - this.data = null; } @Override @@ -52,13 +38,4 @@ public AmqpBodyType getBodyType() { public IterableStream getData() { return data; } - - /** - * Gets {@link BinaryData} set on this {@link AmqpDataBody}. - * - * @return data set on {@link AmqpDataBody}. - */ - public BinaryData getBinaryData() { - return binaryData; - } } diff --git a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java index 9d2fedec65a9..961fba6cab8d 100644 --- a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java +++ b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java @@ -13,8 +13,6 @@ import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; -import static org.junit.jupiter.api.Assertions.assertNull; /** * Test for {@link AmqpDataBody}. @@ -38,33 +36,11 @@ public void constructorValidValues() { assertEquals(AmqpBodyType.DATA, actual.getBodyType()); // Validate Message Body - final BinaryData actualBinaryData = actual.getBinaryData(); - assertNull(actualBinaryData); - final List dataList = actual.getData().stream().collect(Collectors.toList()); assertEquals(binaryDataList.size(), dataList.size()); assertArrayEquals(CONTENTS_BYTES, dataList.get(0).getData()); } - /** - * Verifies we correctly set values via constructor for {@link AmqpAnnotatedMessage}. - */ - @Test - public void constructorValidBinaryDataValue() { - - // Act & Arrange - final AmqpDataBody actual = new AmqpDataBody(DATA_BYTES); - - // Assert - assertEquals(AmqpBodyType.DATA, actual.getBodyType()); - - // Validate Message Body - final BinaryData actualBinaryData = actual.getBinaryData(); - assertNotNull(actualBinaryData); - - assertArrayEquals(CONTENTS_BYTES, actualBinaryData.getData()); - } - /** * Verifies {@link BinaryData} constructor for null values. */ diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java index cb07323908d5..b52a9a45d100 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java @@ -3,9 +3,18 @@ package com.azure.messaging.servicebus; +import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_REASON_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.ENQUEUED_SEQUENCE_NUMBER_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.ENQUEUED_TIME_UTC_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.LOCKED_UNTIL_KEY_ANNOTATION_NAME; import static com.azure.core.amqp.AmqpMessageConstant.PARTITION_KEY_ANNOTATION_NAME; import static com.azure.core.amqp.AmqpMessageConstant.SCHEDULED_ENQUEUE_UTC_TIME_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.SEQUENCE_NUMBER_ANNOTATION_NAME; import static com.azure.core.amqp.AmqpMessageConstant.VIA_PARTITION_KEY_ANNOTATION_NAME; + +import com.azure.core.amqp.AmqpMessageConstant; import com.azure.core.amqp.models.AmqpAnnotatedMessage; import com.azure.core.amqp.models.AmqpBodyType; import com.azure.core.amqp.models.AmqpDataBody; @@ -17,9 +26,13 @@ import java.time.Duration; import java.time.OffsetDateTime; import java.time.ZoneOffset; +import java.util.Arrays; +import java.util.Collections; import java.util.Date; +import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; /** * The data structure encapsulating the message being sent-to Service Bus. @@ -42,9 +55,12 @@ * @see ServiceBusMessageBatch */ public class ServiceBusMessage { + private static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; + private final AmqpAnnotatedMessage amqpAnnotatedMessage; private final ClientLogger logger = new ClientLogger(ServiceBusMessage.class); + private final byte[] binaryData; private Context context; /** @@ -66,9 +82,10 @@ public ServiceBusMessage(String body) { * @throws NullPointerException if {@code body} is {@code null}. */ public ServiceBusMessage(byte[] body) { - Objects.requireNonNull(body, "'body' cannot be null."); + this.binaryData = Objects.requireNonNull(body, "'body' cannot be null."); this.context = Context.NONE; - amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(new BinaryData(body))); + amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList( + new BinaryData(binaryData)))); } /** @@ -81,23 +98,25 @@ public ServiceBusMessage(byte[] body) { */ public ServiceBusMessage(ServiceBusReceivedMessage receivedMessage) { Objects.requireNonNull(receivedMessage, "'receivedMessage' cannot be null."); - this.amqpAnnotatedMessage = new AmqpAnnotatedMessage(receivedMessage.getAmqpAnnotatedMessage().getBody()); + + AmqpDataBody amqpDataBody = ((AmqpDataBody) receivedMessage.getAmqpAnnotatedMessage().getBody()); + this.amqpAnnotatedMessage = new AmqpAnnotatedMessage(receivedMessage.getAmqpAnnotatedMessage()); this.context = Context.NONE; - setMessageId(receivedMessage.getMessageId()); - setScheduledEnqueueTime(receivedMessage.getScheduledEnqueueTime()); - setContentType(receivedMessage.getContentType()); - setCorrelationId(receivedMessage.getCorrelationId()); - setSubject(receivedMessage.getLabel()); - setPartitionKey(receivedMessage.getPartitionKey()); - setReplyTo(receivedMessage.getReplyTo()); - setReplyToSessionId(receivedMessage.getReplyToSessionId()); - setTimeToLive(receivedMessage.getTimeToLive()); - setTo(receivedMessage.getTo()); - setSessionId(receivedMessage.getSessionId()); - setViaPartitionKey(receivedMessage.getViaPartitionKey()); - //TODO (Hemant): Cleanup the values from AmqpAnnotatedMessage which should never be set by user. - // Some values of MessageAnnotations , Header.deliveryCount etc + List dataList = amqpDataBody.getData().stream().collect(Collectors.toList()); + if (dataList.size() > 0) { + binaryData = dataList.get(0).getData(); + } else { + binaryData = EMPTY_BYTE_ARRAY; + } + amqpAnnotatedMessage.getHeader().setDeliveryCount(null); + + removeValues(amqpAnnotatedMessage.getMessageAnnotations(), LOCKED_UNTIL_KEY_ANNOTATION_NAME, + SEQUENCE_NUMBER_ANNOTATION_NAME, DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME, + ENQUEUED_SEQUENCE_NUMBER_ANNOTATION_NAME, ENQUEUED_TIME_UTC_ANNOTATION_NAME); + + removeValues(amqpAnnotatedMessage.getApplicationProperties(), DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME, + DEAD_LETTER_REASON_ANNOTATION_NAME); } @@ -134,15 +153,10 @@ public Map getApplicationProperties() { * @return A byte array representing the data. */ public byte[] getBody() { - byte[] body = null; final AmqpBodyType type = amqpAnnotatedMessage.getBody().getBodyType(); switch (type) { case DATA: - final BinaryData binaryData = ((AmqpDataBody) amqpAnnotatedMessage.getBody()).getBinaryData(); - if (binaryData != null) { - body = binaryData.getData(); - } - break; + return Arrays.copyOf(binaryData, binaryData.length); case SEQUENCE: case VALUE: throw logger.logExceptionAsError(new UnsupportedOperationException("Not supported AmqpBodyType: " @@ -151,7 +165,6 @@ public byte[] getBody() { throw logger.logExceptionAsError(new IllegalArgumentException("Unknown AmqpBodyType: " + amqpAnnotatedMessage.getBody().getBodyType().toString())); } - return body; } /** @@ -496,4 +509,13 @@ public ServiceBusMessage addContext(String key, Object value) { return this; } + + /* + * Gets value from given map. + */ + private void removeValues(Map dataMap, AmqpMessageConstant... keys) { + for (AmqpMessageConstant key : keys) { + dataMap.remove(key.getValue()); + } + } } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java index f8f7600a9953..9643e66a6802 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java @@ -10,6 +10,10 @@ import static com.azure.core.amqp.AmqpMessageConstant.SEQUENCE_NUMBER_ANNOTATION_NAME; import static com.azure.core.amqp.AmqpMessageConstant.LOCKED_UNTIL_KEY_ANNOTATION_NAME; import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.ENQUEUED_SEQUENCE_NUMBER_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_REASON_ANNOTATION_NAME; + import com.azure.core.amqp.models.AmqpAnnotatedMessage; import com.azure.core.amqp.models.AmqpBodyType; import com.azure.core.amqp.models.AmqpDataBody; @@ -20,6 +24,8 @@ import java.time.Duration; import java.time.OffsetDateTime; import java.time.ZoneOffset; +import java.util.Arrays; +import java.util.Collections; import java.util.Date; import java.util.Map; import java.util.Objects; @@ -31,13 +37,8 @@ public final class ServiceBusReceivedMessage { private final ClientLogger logger = new ClientLogger(ServiceBusReceivedMessage.class); - private static final String DEAD_LETTER_DESCRIPTION = "DeadLetterErrorDescription"; - private static final String DEAD_LETTER_REASON = "DeadLetterReason"; - - // This one appears to always be 0, but is always returned with each message. - private static final String ENQUEUED_SEQUENCE_NUMBER = "x-opt-enqueue-sequence-number"; - private final AmqpAnnotatedMessage amqpAnnotatedMessage; + private final byte[] binaryData; private UUID lockToken; /** @@ -53,8 +54,9 @@ public AmqpAnnotatedMessage getAmqpAnnotatedMessage() { } ServiceBusReceivedMessage(byte[] body) { - Objects.requireNonNull(body, "'body' cannot be null."); - amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(new BinaryData(body))); + binaryData = Objects.requireNonNull(body, "'body' cannot be null."); + amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList( + new BinaryData(binaryData)))); } /** @@ -69,15 +71,10 @@ public AmqpAnnotatedMessage getAmqpAnnotatedMessage() { * @return A byte array representing the data. */ public byte[] getBody() { - byte[] body = null; final AmqpBodyType bodyType = amqpAnnotatedMessage.getBody().getBodyType(); switch (bodyType) { case DATA: - final BinaryData binaryData = ((AmqpDataBody) amqpAnnotatedMessage.getBody()).getBinaryData(); - if (binaryData != null) { - body = binaryData.getData(); - } - break; + return Arrays.copyOf(binaryData, binaryData.length); case SEQUENCE: case VALUE: throw logger.logExceptionAsError(new UnsupportedOperationException("Body type not supported yet " @@ -87,7 +84,6 @@ public byte[] getBody() { throw logger.logExceptionAsError(new IllegalStateException("Body type not valid " + bodyType.toString())); } - return body; } /** @@ -121,11 +117,8 @@ public String getCorrelationId() { * @return The description for a message that has been dead-lettered. */ public String getDeadLetterErrorDescription() { - final Map properties = amqpAnnotatedMessage.getApplicationProperties(); - if (properties.containsKey(DEAD_LETTER_DESCRIPTION)) { - return String.valueOf(properties.get(DEAD_LETTER_DESCRIPTION)); - } - return null; + return getStringValue(amqpAnnotatedMessage.getApplicationProperties(), + DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME.getValue()); } /** @@ -134,11 +127,8 @@ public String getDeadLetterErrorDescription() { * @return The reason for a message that has been dead-lettered. */ public String getDeadLetterReason() { - final Map properties = amqpAnnotatedMessage.getApplicationProperties(); - if (properties.containsKey(DEAD_LETTER_REASON)) { - return String.valueOf(properties.get(DEAD_LETTER_REASON)); - } - return null; + return getStringValue(amqpAnnotatedMessage.getApplicationProperties(), + DEAD_LETTER_REASON_ANNOTATION_NAME.getValue()); } /** @@ -155,11 +145,8 @@ public String getDeadLetterReason() { * queues */ public String getDeadLetterSource() { - final Map properties = amqpAnnotatedMessage.getApplicationProperties(); - if (properties.containsKey(DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME.getValue())) { - return String.valueOf(properties.get(DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME.getValue())); - } - return null; + return getStringValue(amqpAnnotatedMessage.getMessageAnnotations(), + DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME.getValue()); } /** @@ -189,13 +176,8 @@ public long getDeliveryCount() { * Timestamps */ public long getEnqueuedSequenceNumber() { - long enqueuedSequenceNumber = 0; - final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotations.containsKey(ENQUEUED_SEQUENCE_NUMBER)) { - Object value = messageAnnotations.get(ENQUEUED_SEQUENCE_NUMBER); - enqueuedSequenceNumber = (long) value; - } - return enqueuedSequenceNumber; + return getLongValue(amqpAnnotatedMessage.getMessageAnnotations(), + ENQUEUED_SEQUENCE_NUMBER_ANNOTATION_NAME.getValue()); } /** @@ -211,13 +193,8 @@ public long getEnqueuedSequenceNumber() { * Timestamps */ public OffsetDateTime getEnqueuedTime() { - OffsetDateTime enqueuedTime = null; - final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotations.containsKey(ENQUEUED_TIME_UTC_ANNOTATION_NAME.getValue())) { - Object value = messageAnnotations.get(ENQUEUED_TIME_UTC_ANNOTATION_NAME.getValue()); - enqueuedTime = ((Date) value).toInstant().atOffset(ZoneOffset.UTC); - } - return enqueuedTime; + return getOffsetDateTimeValue(amqpAnnotatedMessage.getMessageAnnotations(), + ENQUEUED_TIME_UTC_ANNOTATION_NAME.getValue()); } /** @@ -285,13 +262,8 @@ public String getLockToken() { * transfers, locks, and settlement */ public OffsetDateTime getLockedUntil() { - OffsetDateTime lockedUntil = null; - final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotations.containsKey(LOCKED_UNTIL_KEY_ANNOTATION_NAME.getValue())) { - Object value = messageAnnotations.get(LOCKED_UNTIL_KEY_ANNOTATION_NAME.getValue()); - lockedUntil = ((Date) value).toInstant().atOffset(ZoneOffset.UTC); - } - return lockedUntil; + return getOffsetDateTimeValue(amqpAnnotatedMessage.getMessageAnnotations(), + LOCKED_UNTIL_KEY_ANNOTATION_NAME.getValue()); } /** @@ -316,13 +288,8 @@ public String getMessageId() { * entities */ public String getPartitionKey() { - String partitionKey = null; - final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotations.containsKey(PARTITION_KEY_ANNOTATION_NAME.getValue())) { - Object value = messageAnnotations.get(PARTITION_KEY_ANNOTATION_NAME.getValue()); - partitionKey = (String) value; - } - return partitionKey; + return getStringValue(amqpAnnotatedMessage.getMessageAnnotations(), + PARTITION_KEY_ANNOTATION_NAME.getValue()); } /** @@ -383,13 +350,8 @@ public String getReplyToSessionId() { * Timestamps */ public OffsetDateTime getScheduledEnqueueTime() { - OffsetDateTime scheduledEnqueueTime = null; - final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotations.containsKey(SCHEDULED_ENQUEUE_UTC_TIME_NAME.getValue())) { - scheduledEnqueueTime = ((Date) messageAnnotations.get(SCHEDULED_ENQUEUE_UTC_TIME_NAME.getValue())) - .toInstant().atOffset(ZoneOffset.UTC); - } - return scheduledEnqueueTime; + return getOffsetDateTimeValue(amqpAnnotatedMessage.getMessageAnnotations(), + SCHEDULED_ENQUEUE_UTC_TIME_NAME.getValue()); } /** @@ -406,13 +368,8 @@ public OffsetDateTime getScheduledEnqueueTime() { * Timestamps */ public long getSequenceNumber() { - long sequenceNumber = 0; - final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotations.containsKey(SEQUENCE_NUMBER_ANNOTATION_NAME.getValue())) { - Object value = messageAnnotations.get(SEQUENCE_NUMBER_ANNOTATION_NAME.getValue()); - sequenceNumber = (long) value; - } - return sequenceNumber; + return getLongValue(amqpAnnotatedMessage.getMessageAnnotations(), + SEQUENCE_NUMBER_ANNOTATION_NAME.getValue()); } /** @@ -462,13 +419,8 @@ public String getTo() { * @see Transfers and Send Via */ public String getViaPartitionKey() { - String viaPartitionKey = null; - final Map messageAnnotations = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotations.containsKey(VIA_PARTITION_KEY_ANNOTATION_NAME.getValue())) { - Object value = messageAnnotations.get(VIA_PARTITION_KEY_ANNOTATION_NAME.getValue()); - viaPartitionKey = (String) value; - } - return viaPartitionKey; + return getStringValue(amqpAnnotatedMessage.getMessageAnnotations(), + VIA_PARTITION_KEY_ANNOTATION_NAME.getValue()); } /** @@ -497,7 +449,8 @@ void setContentType(String contentType) { * @param deadLetterErrorDescription Dead letter description. */ void setDeadLetterErrorDescription(String deadLetterErrorDescription) { - amqpAnnotatedMessage.getApplicationProperties().put(DEAD_LETTER_DESCRIPTION, deadLetterErrorDescription); + amqpAnnotatedMessage.getApplicationProperties().put(DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME.getValue(), + deadLetterErrorDescription); } /** @@ -506,7 +459,8 @@ void setDeadLetterErrorDescription(String deadLetterErrorDescription) { * @param deadLetterReason Dead letter reason. */ void setDeadLetterReason(String deadLetterReason) { - amqpAnnotatedMessage.getApplicationProperties().put(DEAD_LETTER_REASON, deadLetterReason); + amqpAnnotatedMessage.getApplicationProperties().put(DEAD_LETTER_REASON_ANNOTATION_NAME.getValue(), + deadLetterReason); } /** @@ -517,7 +471,7 @@ void setDeadLetterReason(String deadLetterReason) { * before it was deadlettered. */ void setDeadLetterSource(String deadLetterSource) { - amqpAnnotatedMessage.getApplicationProperties().put(DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME.toString(), + amqpAnnotatedMessage.getMessageAnnotations().put(DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME.toString(), deadLetterSource); } @@ -531,7 +485,8 @@ void setDeliveryCount(long deliveryCount) { } void setEnqueuedSequenceNumber(long enqueuedSequenceNumber) { - amqpAnnotatedMessage.getMessageAnnotations().put(ENQUEUED_SEQUENCE_NUMBER, enqueuedSequenceNumber); + amqpAnnotatedMessage.getMessageAnnotations().put(ENQUEUED_SEQUENCE_NUMBER_ANNOTATION_NAME.getValue(), + enqueuedSequenceNumber); } /** @@ -686,4 +641,25 @@ void setTo(String to) { void setViaPartitionKey(String viaPartitionKey) { amqpAnnotatedMessage.getMessageAnnotations().put(VIA_PARTITION_KEY_ANNOTATION_NAME.toString(), viaPartitionKey); } + + /* + * Gets String value from given map and null if key does not exists. + */ + private String getStringValue(Map dataMap, String key) { + return dataMap.containsKey(key) ? (String) dataMap.get(key) : null; + } + + /* + * Gets long value from given map and 0 if key does not exists. + */ + private long getLongValue(Map dataMap, String key) { + return dataMap.containsKey(key) ? (long) dataMap.get(key) : 0; + } + + /* + * Gets OffsetDateTime value from given map and null if key does not exists. + */ + private OffsetDateTime getOffsetDateTimeValue(Map dataMap, String key) { + return dataMap.containsKey(key) ? ((Date) dataMap.get(key)).toInstant().atOffset(ZoneOffset.UTC) : null; + } } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java index 4d5f8c897858..a1d03217e92f 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java @@ -3,6 +3,19 @@ package com.azure.messaging.servicebus; +import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_REASON_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.ENQUEUED_SEQUENCE_NUMBER_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.ENQUEUED_TIME_UTC_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.LOCKED_UNTIL_KEY_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.SEQUENCE_NUMBER_ANNOTATION_NAME; +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import com.azure.core.amqp.AmqpMessageConstant; import org.apache.qpid.proton.amqp.Binary; import org.apache.qpid.proton.amqp.messaging.Data; import org.apache.qpid.proton.message.Message; @@ -10,11 +23,9 @@ import org.junit.jupiter.api.Test; import java.time.Duration; - -import static java.nio.charset.StandardCharsets.UTF_8; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; +import java.time.Instant; +import java.util.Date; +import java.util.Map; public class ServiceBusReceivedMessageTest { @@ -86,22 +97,51 @@ public void toServiceBusMessageTest() { originalMessage.setReplyToSessionId("rsessionid"); originalMessage.setSubject("subject"); originalMessage.setTo("to"); + final Map originalMessageAnnotations = originalMessage.getAmqpAnnotatedMessage().getMessageAnnotations(); + originalMessageAnnotations.put(DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME.getValue(), "message annotations"); + originalMessageAnnotations.put(ENQUEUED_SEQUENCE_NUMBER_ANNOTATION_NAME.getValue(), Long.valueOf(3)); + originalMessageAnnotations.put(LOCKED_UNTIL_KEY_ANNOTATION_NAME.getValue(), new Date(Instant.now().toEpochMilli())); + originalMessageAnnotations.put(ENQUEUED_TIME_UTC_ANNOTATION_NAME.getValue(), new Date(Instant.now().toEpochMilli())); + + originalMessageAnnotations.put(SEQUENCE_NUMBER_ANNOTATION_NAME.getValue(), Long.valueOf(3)); + + final Map originalApplicationProperties = originalMessage.getAmqpAnnotatedMessage().getApplicationProperties(); + originalApplicationProperties.put(DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME.getValue(), "description"); + originalApplicationProperties.put(DEAD_LETTER_REASON_ANNOTATION_NAME.getValue(), "description"); + + originalMessage.getAmqpAnnotatedMessage().getHeader().setDeliveryCount(Long.valueOf(5)); // Act - final ServiceBusMessage messageToSend = new ServiceBusMessage(originalMessage); + final ServiceBusMessage actual = new ServiceBusMessage(originalMessage); // Assert - Assertions.assertNotNull(messageToSend); - Assertions.assertNotNull(messageToSend.getBody()); - Assertions.assertEquals(PAYLOAD, new String(messageToSend.getBody(), UTF_8)); - Assertions.assertEquals(originalMessage.getMessageId(), messageToSend.getMessageId()); - Assertions.assertEquals(originalMessage.getContentType(), messageToSend.getContentType()); - Assertions.assertEquals(originalMessage.getCorrelationId(), messageToSend.getCorrelationId()); - Assertions.assertEquals(originalMessage.getReplyTo(), messageToSend.getReplyTo()); - Assertions.assertEquals(originalMessage.getViaPartitionKey(), messageToSend.getViaPartitionKey()); - Assertions.assertEquals(originalMessage.getTimeToLive().toMillis(), messageToSend.getTimeToLive().toMillis()); - Assertions.assertEquals(originalMessage.getLabel(), messageToSend.getSubject()); - Assertions.assertEquals(originalMessage.getReplyToSessionId(), messageToSend.getReplyToSessionId()); - Assertions.assertEquals(originalMessage.getTo(), messageToSend.getTo()); + Assertions.assertNotNull(actual); + Assertions.assertNotNull(actual.getBody()); + Assertions.assertEquals(PAYLOAD, new String(actual.getBody(), UTF_8)); + Assertions.assertEquals(originalMessage.getMessageId(), actual.getMessageId()); + Assertions.assertEquals(originalMessage.getContentType(), actual.getContentType()); + Assertions.assertEquals(originalMessage.getCorrelationId(), actual.getCorrelationId()); + Assertions.assertEquals(originalMessage.getReplyTo(), actual.getReplyTo()); + Assertions.assertEquals(originalMessage.getViaPartitionKey(), actual.getViaPartitionKey()); + Assertions.assertEquals(originalMessage.getTimeToLive().toMillis(), actual.getTimeToLive().toMillis()); + Assertions.assertEquals(originalMessage.getLabel(), actual.getSubject()); + Assertions.assertEquals(originalMessage.getReplyToSessionId(), actual.getReplyToSessionId()); + Assertions.assertEquals(originalMessage.getTo(), actual.getTo()); + + // Following values should be cleaned up. + assertNullValues(actual.getAmqpAnnotatedMessage().getMessageAnnotations(), DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME, + ENQUEUED_SEQUENCE_NUMBER_ANNOTATION_NAME, LOCKED_UNTIL_KEY_ANNOTATION_NAME, + SEQUENCE_NUMBER_ANNOTATION_NAME, ENQUEUED_TIME_UTC_ANNOTATION_NAME); + + assertNullValues(actual.getAmqpAnnotatedMessage().getApplicationProperties(), DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME, + DEAD_LETTER_REASON_ANNOTATION_NAME); + + Assertions.assertNull(actual.getAmqpAnnotatedMessage().getHeader().getDeliveryCount()); + } + + public void assertNullValues(Map dataMap, AmqpMessageConstant... keys) { + for (AmqpMessageConstant key : keys) { + Assertions.assertNull(dataMap.get(key.getValue())); + } } } From 2d680f15c24ce2065624403df6161ce752b944ec Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Tue, 8 Sep 2020 15:20:01 -0700 Subject: [PATCH 17/27] Added unit test case. --- .../ServiceBusMessageSerializer.java | 31 ++++---- .../servicebus/ServiceBusReceivedMessage.java | 36 ++++----- .../ServiceBusMessageSerializerTest.java | 59 +++++++++++---- .../ServiceBusReceivedMessageTest.java | 73 ++++++++++--------- 4 files changed, 109 insertions(+), 90 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java index 9d817a0eab9f..b83fe60b410f 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java @@ -444,29 +444,14 @@ private ServiceBusReceivedMessage deserializeMessage(Message amqpMessage) { // DeliveryAnnotations final DeliveryAnnotations deliveryAnnotations = amqpMessage.getDeliveryAnnotations(); - if (deliveryAnnotations != null && deliveryAnnotations.getValue() != null) { - final Map deliveryAnnotationMap = deliveryAnnotations.getValue(); - if (deliveryAnnotationMap != null) { - for (Map.Entry entry : deliveryAnnotationMap.entrySet()) { - final String key = entry.getKey().toString(); - final Object value = entry.getValue(); - brokeredAmqpAnnotatedMessage.getDeliveryAnnotations().put(key, value); - } - } + if (deliveryAnnotations != null) { + setValues(deliveryAnnotations.getValue(), brokeredAmqpAnnotatedMessage.getDeliveryAnnotations()); } - // Message Annotations final MessageAnnotations messageAnnotations = amqpMessage.getMessageAnnotations(); if (messageAnnotations != null) { - Map messageAnnotationsMap = messageAnnotations.getValue(); - if (messageAnnotationsMap != null) { - for (Map.Entry entry : messageAnnotationsMap.entrySet()) { - final String key = entry.getKey().toString(); - final Object value = entry.getValue(); - brokeredAmqpAnnotatedMessage.getMessageAnnotations().put(key, value); - } - } + setValues(messageAnnotations.getValue(), brokeredAmqpAnnotatedMessage.getMessageAnnotations()); } if (amqpMessage instanceof MessageWithLockToken) { @@ -495,6 +480,16 @@ private static int getPayloadSize(Message msg) { } } + private void setValues(Map sourceMap, Map targetMap) { + if (sourceMap != null) { + for (Map.Entry entry : sourceMap.entrySet()) { + final String key = entry.getKey().toString(); + final Object value = entry.getValue(); + targetMap.put(key, value); + } + } + } + @SuppressWarnings("rawtypes") private static int sizeof(Object obj) { if (obj == null) { diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java index 9643e66a6802..c8a0915188d7 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java @@ -14,6 +14,7 @@ import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME; import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_REASON_ANNOTATION_NAME; +import com.azure.core.amqp.AmqpMessageConstant; import com.azure.core.amqp.models.AmqpAnnotatedMessage; import com.azure.core.amqp.models.AmqpBodyType; import com.azure.core.amqp.models.AmqpDataBody; @@ -64,7 +65,7 @@ public AmqpAnnotatedMessage getAmqpAnnotatedMessage() { * *

* If the means for deserializing the raw data is not apparent to consumers, a common technique is to make use of - * {@link #getApplicationProperties()} ()} when creating the event, to associate serialization hints as an aid to + * {@link #getApplicationProperties()} when creating the event, to associate serialization hints as an aid to * consumers who wish to deserialize the binary data. *

* @@ -471,7 +472,7 @@ void setDeadLetterReason(String deadLetterReason) { * before it was deadlettered. */ void setDeadLetterSource(String deadLetterSource) { - amqpAnnotatedMessage.getMessageAnnotations().put(DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME.toString(), + amqpAnnotatedMessage.getMessageAnnotations().put(DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME.getValue(), deadLetterSource); } @@ -495,11 +496,7 @@ void setEnqueuedSequenceNumber(long enqueuedSequenceNumber) { * @param enqueuedTime the datetime at which this message was enqueued in Azure Service Bus. */ void setEnqueuedTime(OffsetDateTime enqueuedTime) { - if (enqueuedTime != null) { - long epochMilli = enqueuedTime.toInstant().toEpochMilli(); - amqpAnnotatedMessage.getMessageAnnotations().put(ENQUEUED_TIME_UTC_ANNOTATION_NAME.toString(), - new Date(epochMilli)); - } + setValue(amqpAnnotatedMessage.getMessageAnnotations(), ENQUEUED_TIME_UTC_ANNOTATION_NAME, enqueuedTime); } /** @@ -526,11 +523,7 @@ void setLockToken(UUID lockToken) { * @param lockedUntil the datetime at which the lock of this message expires. */ void setLockedUntil(OffsetDateTime lockedUntil) { - if (lockedUntil != null) { - long epochMilli = lockedUntil.toInstant().toEpochMilli(); - amqpAnnotatedMessage.getMessageAnnotations().put(LOCKED_UNTIL_KEY_ANNOTATION_NAME.toString(), - new Date(epochMilli)); - } + setValue(amqpAnnotatedMessage.getMessageAnnotations(), LOCKED_UNTIL_KEY_ANNOTATION_NAME, lockedUntil); } /** @@ -550,7 +543,7 @@ void setMessageId(String messageId) { * @see #getPartitionKey() */ void setPartitionKey(String partitionKey) { - amqpAnnotatedMessage.getMessageAnnotations().put(PARTITION_KEY_ANNOTATION_NAME.toString(), partitionKey); + amqpAnnotatedMessage.getMessageAnnotations().put(PARTITION_KEY_ANNOTATION_NAME.getValue(), partitionKey); } /** @@ -561,11 +554,7 @@ void setPartitionKey(String partitionKey) { * @see #getScheduledEnqueueTime() */ void setScheduledEnqueueTime(OffsetDateTime scheduledEnqueueTime) { - if (scheduledEnqueueTime != null) { - long epochMilli = scheduledEnqueueTime.toInstant().toEpochMilli(); - amqpAnnotatedMessage.getMessageAnnotations().put(SCHEDULED_ENQUEUE_UTC_TIME_NAME.toString(), - new Date(epochMilli)); - } + setValue(amqpAnnotatedMessage.getMessageAnnotations(), SCHEDULED_ENQUEUE_UTC_TIME_NAME, scheduledEnqueueTime); } /** @@ -574,7 +563,7 @@ void setScheduledEnqueueTime(OffsetDateTime scheduledEnqueueTime) { * @param sequenceNumber the unique number assigned to a message by Service Bus. */ void setSequenceNumber(long sequenceNumber) { - amqpAnnotatedMessage.getMessageAnnotations().put(SEQUENCE_NUMBER_ANNOTATION_NAME.toString(), sequenceNumber); + amqpAnnotatedMessage.getMessageAnnotations().put(SEQUENCE_NUMBER_ANNOTATION_NAME.getValue(), sequenceNumber); } /** @@ -639,7 +628,7 @@ void setTo(String to) { * @see #getViaPartitionKey() */ void setViaPartitionKey(String viaPartitionKey) { - amqpAnnotatedMessage.getMessageAnnotations().put(VIA_PARTITION_KEY_ANNOTATION_NAME.toString(), viaPartitionKey); + amqpAnnotatedMessage.getMessageAnnotations().put(VIA_PARTITION_KEY_ANNOTATION_NAME.getValue(), viaPartitionKey); } /* @@ -662,4 +651,11 @@ private long getLongValue(Map dataMap, String key) { private OffsetDateTime getOffsetDateTimeValue(Map dataMap, String key) { return dataMap.containsKey(key) ? ((Date) dataMap.get(key)).toInstant().atOffset(ZoneOffset.UTC) : null; } + + private void setValue(Map dataMap, AmqpMessageConstant key, OffsetDateTime value) { + if (value != null) { + amqpAnnotatedMessage.getMessageAnnotations().put(key.getValue(), + new Date(value.toInstant().toEpochMilli())); + } + } } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageSerializerTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageSerializerTest.java index dc514c03606d..c8ac8ec4ed95 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageSerializerTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageSerializerTest.java @@ -5,8 +5,11 @@ import com.azure.core.amqp.exception.AmqpResponseCode; import org.apache.qpid.proton.Proton; +import org.apache.qpid.proton.amqp.Symbol; import org.apache.qpid.proton.amqp.messaging.AmqpValue; import org.apache.qpid.proton.amqp.messaging.ApplicationProperties; +import org.apache.qpid.proton.amqp.messaging.DeliveryAnnotations; +import org.apache.qpid.proton.amqp.messaging.Footer; import org.apache.qpid.proton.message.Message; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -82,34 +85,58 @@ void deserializeMessage() { message.setReplyToGroupId("reply-to-session-id-property"); message.setGroupId("session-id-as-a-group-id"); + // Message Annotations + Map expectedMessageAnnotations = message.getMessageAnnotations().getValue(); + expectedMessageAnnotations.put(Symbol.valueOf("A"), "A value"); + + // Message Annotations + Map expectedDeliveryAnnotations = new HashMap<>(); + expectedDeliveryAnnotations.put(Symbol.valueOf("D"), "D value"); + message.setDeliveryAnnotations(new DeliveryAnnotations(expectedDeliveryAnnotations)); + + Map expectedFooterValues = new HashMap<>(); + expectedFooterValues.put(Symbol.valueOf("footer1"), "footer value"); + message.setFooter(new Footer(expectedFooterValues)); + // Act - final ServiceBusReceivedMessage serviceBusMessage = serializer.deserialize(message, ServiceBusReceivedMessage.class); + final ServiceBusReceivedMessage actualMessage = serializer.deserialize(message, ServiceBusReceivedMessage.class); // Assert // Verifying all our system properties were properly deserialized. - assertNotNull(serviceBusMessage.getEnqueuedTime()); - assertEquals(SEQUENCE_NUMBER, serviceBusMessage.getSequenceNumber()); + assertNotNull(actualMessage.getEnqueuedTime()); + assertEquals(SEQUENCE_NUMBER, actualMessage.getSequenceNumber()); // Verifying that all our properties are set. - assertEquals(message.getTtl(), serviceBusMessage.getTimeToLive().toMillis()); - assertEquals(message.getSubject(), serviceBusMessage.getLabel()); - assertEquals(message.getReplyTo(), serviceBusMessage.getReplyTo()); - assertEquals(message.getDeliveryCount(), serviceBusMessage.getDeliveryCount()); - assertEquals(message.getProperties().getTo(), serviceBusMessage.getTo()); - assertEquals(message.getReplyToGroupId(), serviceBusMessage.getReplyToSessionId()); - assertEquals(message.getGroupId(), serviceBusMessage.getSessionId()); - assertEquals(message.getContentType(), serviceBusMessage.getContentType()); - assertEquals(message.getCorrelationId(), serviceBusMessage.getCorrelationId()); + assertEquals(message.getTtl(), actualMessage.getTimeToLive().toMillis()); + assertEquals(message.getSubject(), actualMessage.getLabel()); + assertEquals(message.getReplyTo(), actualMessage.getReplyTo()); + assertEquals(message.getDeliveryCount(), actualMessage.getDeliveryCount()); + assertEquals(message.getProperties().getTo(), actualMessage.getTo()); + assertEquals(message.getReplyToGroupId(), actualMessage.getReplyToSessionId()); + assertEquals(message.getGroupId(), actualMessage.getSessionId()); + assertEquals(message.getContentType(), actualMessage.getContentType()); + assertEquals(message.getCorrelationId(), actualMessage.getCorrelationId()); + + assertValues(expectedMessageAnnotations, actualMessage.getAmqpAnnotatedMessage().getMessageAnnotations()); + assertValues(expectedDeliveryAnnotations, actualMessage.getAmqpAnnotatedMessage().getDeliveryAnnotations()); + assertValues(expectedFooterValues, actualMessage.getAmqpAnnotatedMessage().getFooter()); // Verifying our application properties are the same. - assertEquals(APPLICATION_PROPERTIES.size(), serviceBusMessage.getApplicationProperties().size()); + assertEquals(APPLICATION_PROPERTIES.size(), actualMessage.getApplicationProperties().size()); APPLICATION_PROPERTIES.forEach((key, value) -> { - Assertions.assertTrue(serviceBusMessage.getApplicationProperties().containsKey(key)); - assertEquals(value, serviceBusMessage.getApplicationProperties().get(key)); + Assertions.assertTrue(actualMessage.getApplicationProperties().containsKey(key)); + assertEquals(value, actualMessage.getApplicationProperties().get(key)); }); // Verifying the contents of our message is the same. - assertEquals(payload, new String(serviceBusMessage.getBody(), UTF_8)); + assertEquals(payload, new String(actualMessage.getBody(), UTF_8)); + } + + private void assertValues(Map expected, Map actual) { + assertEquals(expected.size(), actual.size()); + for (Map.Entry expectedEntry : expected.entrySet()) { + assertEquals(expectedEntry.getValue(), actual.get(expectedEntry.getKey().toString())); + } } /** diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java index a1d03217e92f..6b89faa6e030 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceivedMessageTest.java @@ -3,6 +3,17 @@ package com.azure.messaging.servicebus; +import com.azure.core.amqp.AmqpMessageConstant; +import org.apache.qpid.proton.amqp.Binary; +import org.apache.qpid.proton.amqp.messaging.Data; +import org.apache.qpid.proton.message.Message; +import org.junit.jupiter.api.Test; + +import java.time.Duration; +import java.time.Instant; +import java.util.Date; +import java.util.Map; + import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME; import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_REASON_ANNOTATION_NAME; import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME; @@ -11,32 +22,22 @@ import static com.azure.core.amqp.AmqpMessageConstant.LOCKED_UNTIL_KEY_ANNOTATION_NAME; import static com.azure.core.amqp.AmqpMessageConstant.SEQUENCE_NUMBER_ANNOTATION_NAME; import static java.nio.charset.StandardCharsets.UTF_8; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import com.azure.core.amqp.AmqpMessageConstant; -import org.apache.qpid.proton.amqp.Binary; -import org.apache.qpid.proton.amqp.messaging.Data; -import org.apache.qpid.proton.message.Message; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.time.Duration; -import java.time.Instant; -import java.util.Date; -import java.util.Map; - public class ServiceBusReceivedMessageTest { // Create a giant payload with 10000 characters that are "a". private static final String PAYLOAD = new String(new char[10000]).replace("\0", "a"); private static final byte[] PAYLOAD_BYTES = PAYLOAD.getBytes(UTF_8); - private static final String PAYLOAD_STRING = new String(PAYLOAD_BYTES); @Test public void byteArrayNotNull() { - assertThrows(NullPointerException.class, () -> new ServiceBusReceivedMessage((byte[]) null)); + assertThrows(NullPointerException.class, () -> new ServiceBusReceivedMessage(null)); } @Test @@ -45,8 +46,8 @@ public void messagePropertiesShouldNotBeNull() { final ServiceBusReceivedMessage receivedMessage = new ServiceBusReceivedMessage(PAYLOAD_BYTES); // Assert - Assertions.assertNotNull(receivedMessage.getBody()); - Assertions.assertNotNull(receivedMessage.getApplicationProperties()); + assertNotNull(receivedMessage.getBody()); + assertNotNull(receivedMessage.getApplicationProperties()); } @@ -63,8 +64,8 @@ public void canCreateWithEmptyArray() { // Assert final byte[] actual = serviceBusMessageData.getBody(); - Assertions.assertNotNull(actual); - Assertions.assertEquals(0, actual.length); + assertNotNull(actual); + assertEquals(0, actual.length); } /** @@ -76,8 +77,8 @@ public void canCreateWithBytePayload() { final ServiceBusReceivedMessage serviceBusMessageData = new ServiceBusReceivedMessage(PAYLOAD_BYTES); // Assert - Assertions.assertNotNull(serviceBusMessageData.getBody()); - Assertions.assertEquals(PAYLOAD, new String(serviceBusMessageData.getBody(), UTF_8)); + assertNotNull(serviceBusMessageData.getBody()); + assertEquals(PAYLOAD, new String(serviceBusMessageData.getBody(), UTF_8)); } @Test @@ -97,7 +98,7 @@ public void toServiceBusMessageTest() { originalMessage.setReplyToSessionId("rsessionid"); originalMessage.setSubject("subject"); originalMessage.setTo("to"); - final Map originalMessageAnnotations = originalMessage.getAmqpAnnotatedMessage().getMessageAnnotations(); + final Map originalMessageAnnotations = originalMessage.getAmqpAnnotatedMessage().getMessageAnnotations(); originalMessageAnnotations.put(DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME.getValue(), "message annotations"); originalMessageAnnotations.put(ENQUEUED_SEQUENCE_NUMBER_ANNOTATION_NAME.getValue(), Long.valueOf(3)); originalMessageAnnotations.put(LOCKED_UNTIL_KEY_ANNOTATION_NAME.getValue(), new Date(Instant.now().toEpochMilli())); @@ -105,7 +106,7 @@ public void toServiceBusMessageTest() { originalMessageAnnotations.put(SEQUENCE_NUMBER_ANNOTATION_NAME.getValue(), Long.valueOf(3)); - final Map originalApplicationProperties = originalMessage.getAmqpAnnotatedMessage().getApplicationProperties(); + final Map originalApplicationProperties = originalMessage.getAmqpAnnotatedMessage().getApplicationProperties(); originalApplicationProperties.put(DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME.getValue(), "description"); originalApplicationProperties.put(DEAD_LETTER_REASON_ANNOTATION_NAME.getValue(), "description"); @@ -115,18 +116,18 @@ public void toServiceBusMessageTest() { final ServiceBusMessage actual = new ServiceBusMessage(originalMessage); // Assert - Assertions.assertNotNull(actual); - Assertions.assertNotNull(actual.getBody()); - Assertions.assertEquals(PAYLOAD, new String(actual.getBody(), UTF_8)); - Assertions.assertEquals(originalMessage.getMessageId(), actual.getMessageId()); - Assertions.assertEquals(originalMessage.getContentType(), actual.getContentType()); - Assertions.assertEquals(originalMessage.getCorrelationId(), actual.getCorrelationId()); - Assertions.assertEquals(originalMessage.getReplyTo(), actual.getReplyTo()); - Assertions.assertEquals(originalMessage.getViaPartitionKey(), actual.getViaPartitionKey()); - Assertions.assertEquals(originalMessage.getTimeToLive().toMillis(), actual.getTimeToLive().toMillis()); - Assertions.assertEquals(originalMessage.getLabel(), actual.getSubject()); - Assertions.assertEquals(originalMessage.getReplyToSessionId(), actual.getReplyToSessionId()); - Assertions.assertEquals(originalMessage.getTo(), actual.getTo()); + assertNotNull(actual); + assertNotNull(actual.getBody()); + assertEquals(PAYLOAD, new String(actual.getBody(), UTF_8)); + assertEquals(originalMessage.getMessageId(), actual.getMessageId()); + assertEquals(originalMessage.getContentType(), actual.getContentType()); + assertEquals(originalMessage.getCorrelationId(), actual.getCorrelationId()); + assertEquals(originalMessage.getReplyTo(), actual.getReplyTo()); + assertEquals(originalMessage.getViaPartitionKey(), actual.getViaPartitionKey()); + assertEquals(originalMessage.getTimeToLive().toMillis(), actual.getTimeToLive().toMillis()); + assertEquals(originalMessage.getLabel(), actual.getSubject()); + assertEquals(originalMessage.getReplyToSessionId(), actual.getReplyToSessionId()); + assertEquals(originalMessage.getTo(), actual.getTo()); // Following values should be cleaned up. assertNullValues(actual.getAmqpAnnotatedMessage().getMessageAnnotations(), DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME, @@ -136,12 +137,12 @@ public void toServiceBusMessageTest() { assertNullValues(actual.getAmqpAnnotatedMessage().getApplicationProperties(), DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME, DEAD_LETTER_REASON_ANNOTATION_NAME); - Assertions.assertNull(actual.getAmqpAnnotatedMessage().getHeader().getDeliveryCount()); + assertNull(actual.getAmqpAnnotatedMessage().getHeader().getDeliveryCount()); } public void assertNullValues(Map dataMap, AmqpMessageConstant... keys) { for (AmqpMessageConstant key : keys) { - Assertions.assertNull(dataMap.get(key.getValue())); + assertNull(dataMap.get(key.getValue())); } } } From b4baee7a7f48cbb9bb290b5a22e22e8e6b97e2bb Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Tue, 8 Sep 2020 15:55:28 -0700 Subject: [PATCH 18/27] Added unit test case and general cleanup --- .../azure/core/amqp/AmqpMessageConstant.java | 2 +- .../amqp/models/AmqpAnnotatedMessage.java | 1 + .../amqp/models/AmqpAnnotatedMessageTest.java | 19 +++++- .../core/amqp/models/AmqpDataBodyTest.java | 14 +++-- .../servicebus/ServiceBusMessage.java | 32 +++++----- .../ServiceBusMessageSerializer.java | 4 +- ...BusReceiverAsyncClientIntegrationTest.java | 60 ++++++++++--------- 7 files changed, 78 insertions(+), 54 deletions(-) diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java index 3cc986e779ef..c72b3a3854f3 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java @@ -122,7 +122,7 @@ public enum AmqpMessageConstant { /** * The identifier for deadletter reason. */ - DEAD_LETTER_REASON_ANNOTATION_NAME("DeadLetterReason"); + AmqpAnnotatedMessage("DeadLetterReason"); private static final Map RESERVED_CONSTANTS_MAP = new HashMap<>(); private final String constant; diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java index dd884186605d..bba2920c2a80 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java @@ -61,6 +61,7 @@ public AmqpAnnotatedMessage(AmqpAnnotatedMessage message) { /** * Gets the {@link Map} of application properties. + * * @return The application properties. */ public Map getApplicationProperties() { diff --git a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java index 2440fcfc066a..63408d62a831 100644 --- a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java +++ b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java @@ -3,6 +3,7 @@ package com.azure.core.amqp.models; +import com.azure.core.util.logging.ClientLogger; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -22,6 +23,7 @@ public class AmqpAnnotatedMessageTest { private static final byte[] CONTENTS_BYTES = "Some-contents".getBytes(StandardCharsets.UTF_8); private static final BinaryData DATA_BYTES = new BinaryData(CONTENTS_BYTES); + private final ClientLogger logger = new ClientLogger(AmqpAnnotatedMessageTest.class); /** * Verifies we correctly set values via constructor for {@link AmqpAnnotatedMessage}. @@ -81,8 +83,19 @@ private void assertMessageCreation(AmqpAnnotatedMessage actual, AmqpBodyType exp // Validate Message Body assertNotNull(actual.getBody()); - List dataList = ((AmqpDataBody) actual.getBody()).getData().stream().collect(Collectors.toList()); - assertEquals(messageSizeExpected, dataList.size()); - assertArrayEquals(CONTENTS_BYTES, dataList.get(0).getData()); + switch (expectedType) { + case DATA: + List dataList = ((AmqpDataBody) actual.getBody()).getData().stream().collect(Collectors.toList()); + assertEquals(messageSizeExpected, dataList.size()); + assertArrayEquals(CONTENTS_BYTES, dataList.get(0).getData()); + break; + case VALUE: + case SEQUENCE: + throw logger.logExceptionAsError(new UnsupportedOperationException("type not supported yet :" + expectedType)); + default: + throw logger.logExceptionAsError(new IllegalStateException("Invalid type :" + expectedType)); + } + + } } diff --git a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java index 961fba6cab8d..4975599ee06b 100644 --- a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java +++ b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java @@ -7,6 +7,7 @@ import org.junit.jupiter.api.Test; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -18,8 +19,7 @@ * Test for {@link AmqpDataBody}. */ public class AmqpDataBodyTest { - private static final byte[] CONTENTS_BYTES = "Some-contents".getBytes(StandardCharsets.UTF_8); - private static final BinaryData DATA_BYTES = new BinaryData(CONTENTS_BYTES); + /** * Verifies we correctly set values via constructor for {@link AmqpAnnotatedMessage}. @@ -27,18 +27,20 @@ public class AmqpDataBodyTest { @Test public void constructorValidValues() { // Arrange - final List binaryDataList = Collections.singletonList(DATA_BYTES); + final List expectedDataList = new ArrayList<>(); + expectedDataList.add(new BinaryData("some data 1".getBytes())); + expectedDataList.add(new BinaryData("some data 2".getBytes())); // Act - final AmqpDataBody actual = new AmqpDataBody(binaryDataList); + final AmqpDataBody actual = new AmqpDataBody(expectedDataList); // Assert assertEquals(AmqpBodyType.DATA, actual.getBodyType()); // Validate Message Body final List dataList = actual.getData().stream().collect(Collectors.toList()); - assertEquals(binaryDataList.size(), dataList.size()); - assertArrayEquals(CONTENTS_BYTES, dataList.get(0).getData()); + assertEquals(expectedDataList.size(), dataList.size()); + assertArrayEquals(expectedDataList.toArray(), dataList.toArray()); } /** diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java index b52a9a45d100..4c33753bb62d 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java @@ -3,17 +3,6 @@ package com.azure.messaging.servicebus; -import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME; -import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_REASON_ANNOTATION_NAME; -import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME; -import static com.azure.core.amqp.AmqpMessageConstant.ENQUEUED_SEQUENCE_NUMBER_ANNOTATION_NAME; -import static com.azure.core.amqp.AmqpMessageConstant.ENQUEUED_TIME_UTC_ANNOTATION_NAME; -import static com.azure.core.amqp.AmqpMessageConstant.LOCKED_UNTIL_KEY_ANNOTATION_NAME; -import static com.azure.core.amqp.AmqpMessageConstant.PARTITION_KEY_ANNOTATION_NAME; -import static com.azure.core.amqp.AmqpMessageConstant.SCHEDULED_ENQUEUE_UTC_TIME_NAME; -import static com.azure.core.amqp.AmqpMessageConstant.SEQUENCE_NUMBER_ANNOTATION_NAME; -import static com.azure.core.amqp.AmqpMessageConstant.VIA_PARTITION_KEY_ANNOTATION_NAME; - import com.azure.core.amqp.AmqpMessageConstant; import com.azure.core.amqp.models.AmqpAnnotatedMessage; import com.azure.core.amqp.models.AmqpBodyType; @@ -34,6 +23,17 @@ import java.util.Objects; import java.util.stream.Collectors; +import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_REASON_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.ENQUEUED_SEQUENCE_NUMBER_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.ENQUEUED_TIME_UTC_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.LOCKED_UNTIL_KEY_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.PARTITION_KEY_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.SCHEDULED_ENQUEUE_UTC_TIME_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.SEQUENCE_NUMBER_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.VIA_PARTITION_KEY_ANNOTATION_NAME; + /** * The data structure encapsulating the message being sent-to Service Bus. * @@ -99,16 +99,18 @@ public ServiceBusMessage(byte[] body) { public ServiceBusMessage(ServiceBusReceivedMessage receivedMessage) { Objects.requireNonNull(receivedMessage, "'receivedMessage' cannot be null."); - AmqpDataBody amqpDataBody = ((AmqpDataBody) receivedMessage.getAmqpAnnotatedMessage().getBody()); this.amqpAnnotatedMessage = new AmqpAnnotatedMessage(receivedMessage.getAmqpAnnotatedMessage()); this.context = Context.NONE; - List dataList = amqpDataBody.getData().stream().collect(Collectors.toList()); - if (dataList.size() > 0) { - binaryData = dataList.get(0).getData(); + final AmqpDataBody amqpDataBody = ((AmqpDataBody) receivedMessage.getAmqpAnnotatedMessage().getBody()); + final List binaryDataList = amqpDataBody.getData().stream().collect(Collectors.toList()); + if (binaryDataList.size() > 0) { + binaryData = binaryDataList.get(0).getData(); } else { binaryData = EMPTY_BYTE_ARRAY; } + + // clean up data which user is not allowed to set. amqpAnnotatedMessage.getHeader().setDeliveryCount(null); removeValues(amqpAnnotatedMessage.getMessageAnnotations(), LOCKED_UNTIL_KEY_ANNOTATION_NAME, diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java index b83fe60b410f..79e96e1529d3 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java @@ -140,7 +140,6 @@ public Message serialize(T object) { if (amqpMessage.getProperties() == null) { amqpMessage.setProperties(new Properties()); } - AmqpMessageProperties brokeredProperties = brokeredMessage.getAmqpAnnotatedMessage().getProperties(); amqpMessage.setMessageId(brokeredMessage.getMessageId()); amqpMessage.setContentType(brokeredMessage.getContentType()); amqpMessage.setCorrelationId(brokeredMessage.getCorrelationId()); @@ -148,6 +147,9 @@ public Message serialize(T object) { amqpMessage.setReplyTo(brokeredMessage.getReplyTo()); amqpMessage.setReplyToGroupId(brokeredMessage.getReplyToSessionId()); amqpMessage.setGroupId(brokeredMessage.getSessionId()); + + final AmqpMessageProperties brokeredProperties = brokeredMessage.getAmqpAnnotatedMessage().getProperties(); + amqpMessage.setContentEncoding(brokeredProperties.getContentEncoding()); if (brokeredProperties.getGroupSequence() != null) { amqpMessage.setGroupSequence(brokeredProperties.getGroupSequence()); diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java index d2b9cfa98780..424adad103bb 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java @@ -5,6 +5,8 @@ import com.azure.core.amqp.models.AmqpAnnotatedMessage; import com.azure.core.amqp.models.AmqpDataBody; +import com.azure.core.amqp.models.AmqpMessageHeader; +import com.azure.core.amqp.models.AmqpMessageProperties; import com.azure.core.amqp.models.BinaryData; import com.azure.core.util.logging.ClientLogger; import com.azure.messaging.servicebus.administration.models.DeadLetterOptions; @@ -1045,6 +1047,9 @@ void receiveAndValidateProperties(MessagingEntityType entityType) { .verify(Duration.ofMinutes(2)); } + /** + * Asserts the length and values with in the map. + */ private void assertMapValues(Map expectedMap, Map actualMap) { assertTrue(actualMap.size() >= expectedMap.size()); Iterator expectedKeys = expectedMap.keySet().iterator(); @@ -1153,34 +1158,33 @@ private ServiceBusClientBuilder.ServiceBusReceiverClientBuilder getDeadLetterRec protected ServiceBusMessage getMessage(String messageId, boolean isSessionEnabled, AmqpAnnotatedMessage amqpPropertiesToSet) { final ServiceBusMessage message = TestUtils.getServiceBusMessage(CONTENTS_BYTES, messageId); - - message.getAmqpAnnotatedMessage().getMessageAnnotations().putAll(amqpPropertiesToSet.getMessageAnnotations()); - - message.getAmqpAnnotatedMessage().getApplicationProperties().putAll(amqpPropertiesToSet.getApplicationProperties()); - - message.getAmqpAnnotatedMessage().getDeliveryAnnotations().putAll(amqpPropertiesToSet.getDeliveryAnnotations()); - - message.getAmqpAnnotatedMessage().getFooter().putAll(amqpPropertiesToSet.getFooter()); - - message.getAmqpAnnotatedMessage().getHeader().setFirstAcquirer(amqpPropertiesToSet.getHeader().isFirstAcquirer()); - message.getAmqpAnnotatedMessage().getHeader().setTimeToLive(amqpPropertiesToSet.getHeader().getTimeToLive()); - message.getAmqpAnnotatedMessage().getHeader().setDurable(amqpPropertiesToSet.getHeader().isDurable()); - message.getAmqpAnnotatedMessage().getHeader().setDeliveryCount(amqpPropertiesToSet.getHeader().getDeliveryCount()); - message.getAmqpAnnotatedMessage().getHeader().setPriority(amqpPropertiesToSet.getHeader().getPriority()); - - - message.getAmqpAnnotatedMessage().getProperties().setReplyTo((amqpPropertiesToSet.getProperties().getReplyTo())); - message.getAmqpAnnotatedMessage().getProperties().setContentEncoding((amqpPropertiesToSet.getProperties().getContentEncoding())); - message.getAmqpAnnotatedMessage().getProperties().setAbsoluteExpiryTime((amqpPropertiesToSet.getProperties().getAbsoluteExpiryTime())); - message.getAmqpAnnotatedMessage().getProperties().setSubject((amqpPropertiesToSet.getProperties().getSubject())); - message.getAmqpAnnotatedMessage().getProperties().setContentType(amqpPropertiesToSet.getProperties().getContentType()); - message.getAmqpAnnotatedMessage().getProperties().setCorrelationId(amqpPropertiesToSet.getProperties().getCorrelationId()); - message.getAmqpAnnotatedMessage().getProperties().setTo(amqpPropertiesToSet.getProperties().getTo()); - message.getAmqpAnnotatedMessage().getProperties().setGroupSequence(amqpPropertiesToSet.getProperties().getGroupSequence()); - message.getAmqpAnnotatedMessage().getProperties().setUserId(amqpPropertiesToSet.getProperties().getUserId()); - message.getAmqpAnnotatedMessage().getProperties().setAbsoluteExpiryTime(amqpPropertiesToSet.getProperties().getAbsoluteExpiryTime()); - message.getAmqpAnnotatedMessage().getProperties().setCreationTime(amqpPropertiesToSet.getProperties().getCreationTime()); - message.getAmqpAnnotatedMessage().getProperties().setReplyToGroupId(amqpPropertiesToSet.getProperties().getReplyToGroupId()); + + final AmqpAnnotatedMessage amqpAnnotatedMessage = message.getAmqpAnnotatedMessage(); + amqpAnnotatedMessage.getMessageAnnotations().putAll(amqpPropertiesToSet.getMessageAnnotations()); + amqpAnnotatedMessage.getApplicationProperties().putAll(amqpPropertiesToSet.getApplicationProperties()); + amqpAnnotatedMessage.getDeliveryAnnotations().putAll(amqpPropertiesToSet.getDeliveryAnnotations()); + amqpAnnotatedMessage.getFooter().putAll(amqpPropertiesToSet.getFooter()); + + final AmqpMessageHeader header = amqpAnnotatedMessage.getHeader(); + header.setFirstAcquirer(amqpPropertiesToSet.getHeader().isFirstAcquirer()); + header.setTimeToLive(amqpPropertiesToSet.getHeader().getTimeToLive()); + header.setDurable(amqpPropertiesToSet.getHeader().isDurable()); + header.setDeliveryCount(amqpPropertiesToSet.getHeader().getDeliveryCount()); + header.setPriority(amqpPropertiesToSet.getHeader().getPriority()); + + final AmqpMessageProperties amqpMessageProperties = amqpAnnotatedMessage.getProperties(); + amqpMessageProperties.setReplyTo((amqpPropertiesToSet.getProperties().getReplyTo())); + amqpMessageProperties.setContentEncoding((amqpPropertiesToSet.getProperties().getContentEncoding())); + amqpMessageProperties.setAbsoluteExpiryTime((amqpPropertiesToSet.getProperties().getAbsoluteExpiryTime())); + amqpMessageProperties.setSubject((amqpPropertiesToSet.getProperties().getSubject())); + amqpMessageProperties.setContentType(amqpPropertiesToSet.getProperties().getContentType()); + amqpMessageProperties.setCorrelationId(amqpPropertiesToSet.getProperties().getCorrelationId()); + amqpMessageProperties.setTo(amqpPropertiesToSet.getProperties().getTo()); + amqpMessageProperties.setGroupSequence(amqpPropertiesToSet.getProperties().getGroupSequence()); + amqpMessageProperties.setUserId(amqpPropertiesToSet.getProperties().getUserId()); + amqpMessageProperties.setAbsoluteExpiryTime(amqpPropertiesToSet.getProperties().getAbsoluteExpiryTime()); + amqpMessageProperties.setCreationTime(amqpPropertiesToSet.getProperties().getCreationTime()); + amqpMessageProperties.setReplyToGroupId(amqpPropertiesToSet.getProperties().getReplyToGroupId()); logger.verbose("Message id {}.", messageId); From b475d652ac161af5d9de892193d1304e454c8307 Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Tue, 8 Sep 2020 16:16:35 -0700 Subject: [PATCH 19/27] Added unit test case and general cleanup --- .../src/main/java/com/azure/core/amqp/AmqpMessageConstant.java | 2 +- .../ServiceBusReceiverAsyncClientIntegrationTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java index c72b3a3854f3..3cc986e779ef 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/AmqpMessageConstant.java @@ -122,7 +122,7 @@ public enum AmqpMessageConstant { /** * The identifier for deadletter reason. */ - AmqpAnnotatedMessage("DeadLetterReason"); + DEAD_LETTER_REASON_ANNOTATION_NAME("DeadLetterReason"); private static final Map RESERVED_CONSTANTS_MAP = new HashMap<>(); private final String constant; diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java index 424adad103bb..319936964b31 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java @@ -1158,7 +1158,7 @@ private ServiceBusClientBuilder.ServiceBusReceiverClientBuilder getDeadLetterRec protected ServiceBusMessage getMessage(String messageId, boolean isSessionEnabled, AmqpAnnotatedMessage amqpPropertiesToSet) { final ServiceBusMessage message = TestUtils.getServiceBusMessage(CONTENTS_BYTES, messageId); - + final AmqpAnnotatedMessage amqpAnnotatedMessage = message.getAmqpAnnotatedMessage(); amqpAnnotatedMessage.getMessageAnnotations().putAll(amqpPropertiesToSet.getMessageAnnotations()); amqpAnnotatedMessage.getApplicationProperties().putAll(amqpPropertiesToSet.getApplicationProperties()); From 6cf5072510a5437a5ba8b03929a0c3333ede0ecf Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Tue, 8 Sep 2020 16:26:13 -0700 Subject: [PATCH 20/27] Added change log. --- .../test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java | 2 -- sdk/servicebus/azure-messaging-servicebus/CHANGELOG.md | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java index 4975599ee06b..4d177dfcef2d 100644 --- a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java +++ b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java @@ -6,9 +6,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.stream.Collectors; diff --git a/sdk/servicebus/azure-messaging-servicebus/CHANGELOG.md b/sdk/servicebus/azure-messaging-servicebus/CHANGELOG.md index c6e7114bad31..609ebe8b9d75 100644 --- a/sdk/servicebus/azure-messaging-servicebus/CHANGELOG.md +++ b/sdk/servicebus/azure-messaging-servicebus/CHANGELOG.md @@ -1,11 +1,13 @@ # Release History ## 7.0.0-beta.6 (Unreleased) +- Exposing Amqp Message envelope in form of `AmqpAnnotatedMessage` as a property of `ServiceBusReceivedMessage` and `ServiceBusMessage`. - Removed `ServiceBusReceiverClientBuilder.maxAutoLockRenewalDuration`. Use method `getAutoRenewMessageLock` of classes `ServiceBusReceiverClient` and `ServiceBusReceiverAsyncClient` to lock messages and sessions. - Updated datetime related APIs to use `java.time.OffsetDateTime` instead of `java.time.Instant`. - Removed `scheduledMessageCount` from `SubscriptionRuntimeInfo` and added it to `TopicRuntimeInfo`. - Changed `QueueRuntimeInfo`, `TopicRuntimeInfo` and `SubscriptionRuntimeInfo` to `QueueRuntimeProperties`, `TopicRuntimeProperties` and `SubscriptionRuntimeProperties` respectively. + ## 7.0.0-beta.5 (2020-08-11) - Remove public constructor for QueueDescription, TopicDescription, SubscriptionDescription. From 947d146c3e9b9cf544e0e3f2c4c3d2da212c7b85 Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Wed, 9 Sep 2020 01:15:36 -0700 Subject: [PATCH 21/27] Adding more unit test --- .../amqp/models/AmqpAnnotatedMessage.java | 15 ++- .../core/amqp/models/AmqpMessageHeader.java | 30 +++--- .../amqp/models/AmqpMessageProperties.java | 23 +++++ .../amqp/models/AmqpAnnotatedMessageTest.java | 89 ++++++++++++++--- .../core/amqp/models/AmqpDataBodyTest.java | 1 - .../servicebus/ServiceBusMessage.java | 2 +- .../servicebus/ServiceBusMessageTest.java | 42 +++++++- ...BusReceiverAsyncClientIntegrationTest.java | 99 +++++++++---------- 8 files changed, 207 insertions(+), 94 deletions(-) diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java index bba2920c2a80..a07e93012318 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpAnnotatedMessage.java @@ -50,18 +50,17 @@ public AmqpAnnotatedMessage(AmqpMessageBody body) { public AmqpAnnotatedMessage(AmqpAnnotatedMessage message) { Objects.requireNonNull(message, "'message' cannot be null."); amqpMessageBody = Objects.requireNonNull(message.getBody(), "'message.body' cannot be null."); - - applicationProperties = message.getApplicationProperties(); - deliveryAnnotations = message.getDeliveryAnnotations(); - messageAnnotations = message.getMessageAnnotations(); - header = message.getHeader(); - properties = message.getProperties(); - footer = message.getFooter(); + applicationProperties = new HashMap<>(message.getApplicationProperties()); + deliveryAnnotations = new HashMap<>(message.getDeliveryAnnotations()); + messageAnnotations = new HashMap<>(message.getMessageAnnotations()); + footer = new HashMap<>(message.getFooter()); + header = new AmqpMessageHeader(message.getHeader()); + properties = new AmqpMessageProperties(message.getProperties()); } /** * Gets the {@link Map} of application properties. - * + * * @return The application properties. */ public Map getApplicationProperties() { diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java index e34a470b5d49..e4fcb055715e 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java @@ -6,12 +6,12 @@ import com.azure.core.annotation.Fluent; import java.time.Duration; +import java.util.Objects; /** * The representation of message header as defined by AMQP protocol. - * * @see - * Amqp Message Format. + * Amqp Message Format. */ @Fluent public class AmqpMessageHeader { @@ -26,6 +26,19 @@ public class AmqpMessageHeader { // This class does not have any public constructors, and is not able to be instantiated using 'new'. } + /** + * The constructor is used to clone the values. + */ + AmqpMessageHeader(AmqpMessageHeader header) { + super(); + Objects.requireNonNull(header, "'header' cannot be null."); + deliveryCount = header.getDeliveryCount(); + durable = header.isDurable(); + firstAcquirer = header.isFirstAcquirer(); + timeToLive = header.getTimeToLive(); + + } + /** * Gets the delivery count from amqp message header. * @@ -37,8 +50,8 @@ public Long getDeliveryCount() { /** * Sets the given {@code deliveryCount} value on {@link AmqpMessageHeader} object. - * * @param deliveryCount to be set. + * * @return updated {@link AmqpMessageHeader} object. */ public AmqpMessageHeader setDeliveryCount(Long deliveryCount) { @@ -48,7 +61,6 @@ public AmqpMessageHeader setDeliveryCount(Long deliveryCount) { /** * Gets durable boolean flag from amqp message header. - * * @return the durable flag. */ public Boolean isDurable() { @@ -57,7 +69,6 @@ public Boolean isDurable() { /** * Sets the given {@code durable} value on {@link AmqpMessageHeader} object. - * * @param durable to set on {@link AmqpMessageHeader}. * * @return updated {@link AmqpMessageHeader} object. @@ -69,7 +80,6 @@ public AmqpMessageHeader setDurable(Boolean durable) { /** * Gets boolean flag for {@code firstAcquirer} from amqp message header. - * * @return the {@code firstAcquirer} value. */ public Boolean isFirstAcquirer() { @@ -78,7 +88,6 @@ public Boolean isFirstAcquirer() { /** * Sets the given {@code firstAcquirer} value on {@link AmqpMessageHeader} object. - * * @param firstAcquirer to set on {@link AmqpMessageHeader}. * * @return updated {@link AmqpMessageHeader} object. @@ -90,7 +99,6 @@ public AmqpMessageHeader setFirstAcquirer(Boolean firstAcquirer) { /** * Gets the priority on {@code amqpMessage} from amqp message header. - * * @return the {@code priority} value. */ public Short getPriority() { @@ -99,12 +107,11 @@ public Short getPriority() { /** * Sets the given {@code priority} value on {@link AmqpMessageHeader} object. - * * @param priority to set on {@link AmqpMessageHeader}. * * @return updated {@link AmqpMessageHeader} object. */ - public AmqpMessageHeader setPriority(short priority) { + public AmqpMessageHeader setPriority(Short priority) { this.priority = priority; return this; } @@ -120,13 +127,12 @@ public Duration getTimeToLive() { /** * Sets the given {@code timeToLive} value on {@link AmqpMessageHeader} object. - * * @param timeToLive to set on {@link AmqpMessageHeader}. * * @return updated {@link AmqpMessageHeader} object. */ public AmqpMessageHeader setTimeToLive(Duration timeToLive) { - this.timeToLive = timeToLive; + this.timeToLive = timeToLive; return this; } } diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java index 0798d882ec12..44df4c71266e 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java @@ -7,6 +7,7 @@ import java.time.OffsetDateTime; import java.util.Arrays; +import java.util.Objects; /** * The representation of message properties as defined by AMQP protocol. @@ -34,6 +35,27 @@ public class AmqpMessageProperties { AmqpMessageProperties() { // This class does not have any public constructors, and is not able to be instantiated using 'new'. } + + /** + * The constructor is used to clone the values. + */ + AmqpMessageProperties(AmqpMessageProperties properties) { + super(); + Objects.requireNonNull(properties, "'properties' cannot be null."); + absoluteExpiryTime = properties.getAbsoluteExpiryTime(); + contentEncoding = properties.getContentEncoding(); + correlationId = properties.getCorrelationId(); + creationTime = properties.getCreationTime(); + groupId = properties.getGroupId(); + groupSequence = properties.getGroupSequence(); + messageId = properties.getMessageId(); + replyToGroupId = properties.getReplyToGroupId(); + replyTo = properties.getReplyTo(); + to = properties.getTo(); + subject = properties.getSubject(); + userId = properties.getUserId(); + } + /** * Gets {@code absoluteExpiryTime} from amqp message properties. * @@ -304,4 +326,5 @@ public AmqpMessageProperties setUserId(byte[] userId) { this.userId = userId != null ? Arrays.copyOf(userId, userId.length) : new byte[0]; return this; } + } diff --git a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java index 63408d62a831..bd662895a9a1 100644 --- a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java +++ b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java @@ -8,13 +8,16 @@ import org.junit.jupiter.api.Test; import java.nio.charset.StandardCharsets; +import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNotSame; /** * Test class for {@link AmqpAnnotatedMessage} @@ -25,20 +28,72 @@ public class AmqpAnnotatedMessageTest { private static final BinaryData DATA_BYTES = new BinaryData(CONTENTS_BYTES); private final ClientLogger logger = new ClientLogger(AmqpAnnotatedMessageTest.class); + /** + * Verifies we correctly set values via copy constructor for {@link AmqpAnnotatedMessage} and create new + * instances of the properties. + */ + @Test + public void copyConstructorTest() { + // Arrange + final int expectedBinaryDataSize = 1; + List expectedBinaryData = new ArrayList<>(); + expectedBinaryData.add(DATA_BYTES); + + final AmqpDataBody amqpDataBody = new AmqpDataBody(expectedBinaryData); + final AmqpAnnotatedMessage expected = new AmqpAnnotatedMessage(amqpDataBody); + final Map expectedMessageAnnotations = expected.getMessageAnnotations(); + expectedMessageAnnotations.put("ma-1", "ma-value1"); + + final Map expectedDeliveryAnnotations = expected.getDeliveryAnnotations(); + expectedDeliveryAnnotations.put("da-1", "da-value1"); + + final Map expectedApplicationProperties = expected.getApplicationProperties(); + expectedApplicationProperties.put("ap-1", "ap-value1"); + + final Map expectedFooter = expected.getFooter(); + expectedFooter.put("foo-1", "foo-value1"); + final AmqpAnnotatedMessage actual = new AmqpAnnotatedMessage(expected); + + // Act + // Now update the values after we have created AmqpAnnotatedMessage using copy constructor. + expectedDeliveryAnnotations.remove("da-1"); + expectedApplicationProperties.put("ap-2", "ap-value2"); + expectedFooter.remove("foo-1"); + expected.getHeader().setDeliveryCount(Long.valueOf(100)); + expectedBinaryData = new ArrayList<>(); + + // Assert + // Ensure the memory references are not same. + assertNotSame(expected.getProperties(), actual.getProperties()); + assertNotSame(expected.getApplicationProperties(), actual.getApplicationProperties()); + assertNotSame(expected.getDeliveryAnnotations(), actual.getDeliveryAnnotations()); + assertNotSame(expected.getFooter(), actual.getFooter()); + assertNotSame(expected.getHeader(), actual.getHeader()); + assertNotSame(expected.getMessageAnnotations(), actual.getMessageAnnotations()); + assertNotSame(expected.getProperties().getUserId(), actual.getProperties().getUserId()); + assertNotSame(expected.getHeader().getDeliveryCount(), actual.getHeader().getDeliveryCount()); + + assertEquals(1, actual.getDeliveryAnnotations().size()); + assertEquals(1, actual.getApplicationProperties().size()); + assertEquals(1, actual.getFooter().size()); + + assertMessageBody(expectedBinaryDataSize, CONTENTS_BYTES, actual); + } + /** * Verifies we correctly set values via constructor for {@link AmqpAnnotatedMessage}. */ @Test public void constructorValidValues() { // Arrange - final List binaryDataList = Collections.singletonList(DATA_BYTES); - final AmqpDataBody amqpDataBody = new AmqpDataBody(binaryDataList); + final List expectedBinaryData = Collections.singletonList(DATA_BYTES); + final AmqpDataBody amqpDataBody = new AmqpDataBody(expectedBinaryData); // Act final AmqpAnnotatedMessage actual = new AmqpAnnotatedMessage(amqpDataBody); // Assert - assertMessageCreation(actual, AmqpBodyType.DATA, binaryDataList.size()); + assertMessageCreation(AmqpBodyType.DATA, expectedBinaryData.size(), actual); } /** @@ -47,15 +102,15 @@ public void constructorValidValues() { @Test public void constructorAmqpValidValues() { // Arrange - final List listBinaryData = Collections.singletonList(DATA_BYTES); - final AmqpDataBody amqpDataBody = new AmqpDataBody(listBinaryData); + final List expectedBinaryData = Collections.singletonList(DATA_BYTES); + final AmqpDataBody amqpDataBody = new AmqpDataBody(expectedBinaryData); final AmqpAnnotatedMessage expected = new AmqpAnnotatedMessage(amqpDataBody); // Act final AmqpAnnotatedMessage actual = new AmqpAnnotatedMessage(expected); // Assert - assertMessageCreation(actual, AmqpBodyType.DATA, listBinaryData.size()); + assertMessageCreation(AmqpBodyType.DATA, expectedBinaryData.size(), actual); } /** @@ -70,8 +125,7 @@ public void constructorNullValidValues() { Assertions.assertThrows(NullPointerException.class, () -> new AmqpAnnotatedMessage(body)); } - private void assertMessageCreation(AmqpAnnotatedMessage actual, AmqpBodyType expectedType, - int messageSizeExpected) { + private void assertMessageCreation(AmqpBodyType expectedType, int expectedMessageSize, AmqpAnnotatedMessage actual) { assertEquals(expectedType, actual.getBody().getBodyType()); assertNotNull(actual.getProperties()); assertNotNull(actual.getHeader()); @@ -83,19 +137,22 @@ private void assertMessageCreation(AmqpAnnotatedMessage actual, AmqpBodyType exp // Validate Message Body assertNotNull(actual.getBody()); - switch (expectedType) { + assertMessageBody(expectedMessageSize, CONTENTS_BYTES, actual); + } + + private void assertMessageBody(int expectedMessageSize, byte[] expectedbody, AmqpAnnotatedMessage actual) { + final AmqpBodyType actualType = actual.getBody().getBodyType(); + switch (actualType) { case DATA: - List dataList = ((AmqpDataBody) actual.getBody()).getData().stream().collect(Collectors.toList()); - assertEquals(messageSizeExpected, dataList.size()); - assertArrayEquals(CONTENTS_BYTES, dataList.get(0).getData()); + List actualData = ((AmqpDataBody) actual.getBody()).getData().stream().collect(Collectors.toList()); + assertEquals(expectedMessageSize, actualData.size()); + assertArrayEquals(expectedbody, actualData.get(0).getData()); break; case VALUE: case SEQUENCE: - throw logger.logExceptionAsError(new UnsupportedOperationException("type not supported yet :" + expectedType)); + throw logger.logExceptionAsError(new UnsupportedOperationException("type not supported yet :" + actualType)); default: - throw logger.logExceptionAsError(new IllegalStateException("Invalid type :" + expectedType)); + throw logger.logExceptionAsError(new IllegalStateException("Invalid type :" + actualType)); } - - } } diff --git a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java index 4d177dfcef2d..1b9b6ecd752f 100644 --- a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java +++ b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpDataBodyTest.java @@ -18,7 +18,6 @@ */ public class AmqpDataBodyTest { - /** * Verifies we correctly set values via constructor for {@link AmqpAnnotatedMessage}. */ diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java index 4c33753bb62d..1bbc20dbf464 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java @@ -84,7 +84,7 @@ public ServiceBusMessage(String body) { public ServiceBusMessage(byte[] body) { this.binaryData = Objects.requireNonNull(body, "'body' cannot be null."); this.context = Context.NONE; - amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList( + this.amqpAnnotatedMessage = new AmqpAnnotatedMessage(new AmqpDataBody(Collections.singletonList( new BinaryData(binaryData)))); } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java index 8cd07d85cc0d..a8357f21c69b 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java @@ -3,18 +3,56 @@ package com.azure.messaging.servicebus; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; +import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_REASON_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.ENQUEUED_SEQUENCE_NUMBER_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.ENQUEUED_TIME_UTC_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.LOCKED_UNTIL_KEY_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.SEQUENCE_NUMBER_ANNOTATION_NAME; import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertNotSame; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +/** + * Test for {@link ServiceBusMessage}. + */ public class ServiceBusMessageTest { // Create a giant payload with 10000 characters that are "a". private static final String PAYLOAD = new String(new char[10000]).replace("\0", "a"); private static final byte[] PAYLOAD_BYTES = PAYLOAD.getBytes(UTF_8); + /** + * Verifies we correctly set values via copy constructor for {@link ServiceBusMessage}. + */ + @Test + public void copyConstructorTest() { + // Arrange + final ServiceBusReceivedMessage expected = new ServiceBusReceivedMessage(PAYLOAD_BYTES); + + // Act + final ServiceBusMessage actual = new ServiceBusMessage(expected); + + // Assert + assertNotSame(expected.getAmqpAnnotatedMessage(), actual.getAmqpAnnotatedMessage()); + // Following values should be reset. + assertNull(actual.getAmqpAnnotatedMessage().getMessageAnnotations().get(LOCKED_UNTIL_KEY_ANNOTATION_NAME.getValue())); + assertNull(actual.getAmqpAnnotatedMessage().getMessageAnnotations().get(SEQUENCE_NUMBER_ANNOTATION_NAME.getValue())); + assertNull(actual.getAmqpAnnotatedMessage().getMessageAnnotations().get(DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME.getValue())); + assertNull(actual.getAmqpAnnotatedMessage().getMessageAnnotations().get(ENQUEUED_SEQUENCE_NUMBER_ANNOTATION_NAME.getValue())); + assertNull(actual.getAmqpAnnotatedMessage().getMessageAnnotations().get(ENQUEUED_TIME_UTC_ANNOTATION_NAME.getValue())); + + assertNull(actual.getAmqpAnnotatedMessage().getApplicationProperties().get(DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME.getValue())); + assertNull(actual.getAmqpAnnotatedMessage().getApplicationProperties().get(DEAD_LETTER_REASON_ANNOTATION_NAME.getValue())); + assertNull(actual.getAmqpAnnotatedMessage().getHeader().getDeliveryCount()); + } + /** * Verify UTF_8 encoded body is created. */ diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java index 319936964b31..11cadd363de1 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusReceiverAsyncClientIntegrationTest.java @@ -1006,8 +1006,36 @@ void receiveAndValidateProperties(MessagingEntityType entityType) { expectedAmqpProperties.getDeliveryAnnotations().putAll(deliveryAnnotation); expectedAmqpProperties.getApplicationProperties().putAll(aplicaitonProperties); - final ServiceBusMessage message = getMessage(messageId, isSessionEnabled, expectedAmqpProperties); + final ServiceBusMessage message = TestUtils.getServiceBusMessage(CONTENTS_BYTES, messageId); + + final AmqpAnnotatedMessage amqpAnnotatedMessage = message.getAmqpAnnotatedMessage(); + amqpAnnotatedMessage.getMessageAnnotations().putAll(expectedAmqpProperties.getMessageAnnotations()); + amqpAnnotatedMessage.getApplicationProperties().putAll(expectedAmqpProperties.getApplicationProperties()); + amqpAnnotatedMessage.getDeliveryAnnotations().putAll(expectedAmqpProperties.getDeliveryAnnotations()); + amqpAnnotatedMessage.getFooter().putAll(expectedAmqpProperties.getFooter()); + + final AmqpMessageHeader header = amqpAnnotatedMessage.getHeader(); + header.setFirstAcquirer(expectedAmqpProperties.getHeader().isFirstAcquirer()); + header.setTimeToLive(expectedAmqpProperties.getHeader().getTimeToLive()); + header.setDurable(expectedAmqpProperties.getHeader().isDurable()); + header.setDeliveryCount(expectedAmqpProperties.getHeader().getDeliveryCount()); + header.setPriority(expectedAmqpProperties.getHeader().getPriority()); + final AmqpMessageProperties amqpMessageProperties = amqpAnnotatedMessage.getProperties(); + amqpMessageProperties.setReplyTo((expectedAmqpProperties.getProperties().getReplyTo())); + amqpMessageProperties.setContentEncoding((expectedAmqpProperties.getProperties().getContentEncoding())); + amqpMessageProperties.setAbsoluteExpiryTime((expectedAmqpProperties.getProperties().getAbsoluteExpiryTime())); + amqpMessageProperties.setSubject((expectedAmqpProperties.getProperties().getSubject())); + amqpMessageProperties.setContentType(expectedAmqpProperties.getProperties().getContentType()); + amqpMessageProperties.setCorrelationId(expectedAmqpProperties.getProperties().getCorrelationId()); + amqpMessageProperties.setTo(expectedAmqpProperties.getProperties().getTo()); + amqpMessageProperties.setGroupSequence(expectedAmqpProperties.getProperties().getGroupSequence()); + amqpMessageProperties.setUserId(expectedAmqpProperties.getProperties().getUserId()); + amqpMessageProperties.setAbsoluteExpiryTime(expectedAmqpProperties.getProperties().getAbsoluteExpiryTime()); + amqpMessageProperties.setCreationTime(expectedAmqpProperties.getProperties().getCreationTime()); + amqpMessageProperties.setReplyToGroupId(expectedAmqpProperties.getProperties().getReplyToGroupId()); + + // Send the message sendMessage(message).block(TIMEOUT); StepVerifier.create(receiver.receiveMessages().map(ServiceBusReceivedMessageContext::getMessage)) @@ -1016,22 +1044,22 @@ void receiveAndValidateProperties(MessagingEntityType entityType) { AmqpAnnotatedMessage actual = received.getAmqpAnnotatedMessage(); try { assertArrayEquals(CONTENTS_BYTES, message.getBody()); - assertEquals(expectedAmqpProperties.getHeader().getPriority(), actual.getHeader().getPriority(), "Header.priority is not equal."); - assertEquals(expectedAmqpProperties.getHeader().isFirstAcquirer(), actual.getHeader().isFirstAcquirer(), "Header.FirstAcquirer is not equal."); - assertEquals(expectedAmqpProperties.getHeader().isDurable(), actual.getHeader().isDurable(), "Header.Durable is not equal."); - - assertEquals(expectedAmqpProperties.getProperties().getSubject(), actual.getProperties().getSubject(), "Properties.subject is not equal."); - assertEquals(expectedAmqpProperties.getProperties().getReplyToGroupId(), actual.getProperties().getReplyToGroupId(), "Properties.ReplyToGroupId is not equal."); - assertEquals(expectedAmqpProperties.getProperties().getReplyTo(), actual.getProperties().getReplyTo(), "Properties.replyTo is not equal."); - assertEquals(expectedAmqpProperties.getProperties().getContentType(), actual.getProperties().getContentType(), "Properties.contentType is not equal."); - assertEquals(expectedAmqpProperties.getProperties().getCorrelationId(), actual.getProperties().getCorrelationId(), "Properties.correlationId is not equal."); - assertEquals(expectedAmqpProperties.getProperties().getTo(), actual.getProperties().getTo(), "Properties.to is not equal."); - assertEquals(expectedAmqpProperties.getProperties().getAbsoluteExpiryTime().toEpochSecond(), actual.getProperties().getAbsoluteExpiryTime().toEpochSecond(), "Properties.absoluteExpiryTime is not equal."); - assertEquals(expectedAmqpProperties.getProperties().getSubject(), actual.getProperties().getSubject(), "Properties.subject is not equal."); - assertEquals(expectedAmqpProperties.getProperties().getContentEncoding(), actual.getProperties().getContentEncoding(), "Properties.contentEncoding is not equal."); - assertEquals(expectedAmqpProperties.getProperties().getGroupSequence(), actual.getProperties().getGroupSequence(), "Properties.groupSequence is not equal."); - assertEquals(expectedAmqpProperties.getProperties().getCreationTime().toEpochSecond(), actual.getProperties().getCreationTime().toEpochSecond(), "Properties.absoluteExpiryTime is not equal."); - assertArrayEquals(expectedAmqpProperties.getProperties().getUserId(), actual.getProperties().getUserId(), "Properties.userId is not equal."); + assertEquals(expectedAmqpProperties.getHeader().getPriority(), actual.getHeader().getPriority()); + assertEquals(expectedAmqpProperties.getHeader().isFirstAcquirer(), actual.getHeader().isFirstAcquirer()); + assertEquals(expectedAmqpProperties.getHeader().isDurable(), actual.getHeader().isDurable()); + + assertEquals(expectedAmqpProperties.getProperties().getSubject(), actual.getProperties().getSubject()); + assertEquals(expectedAmqpProperties.getProperties().getReplyToGroupId(), actual.getProperties().getReplyToGroupId()); + assertEquals(expectedAmqpProperties.getProperties().getReplyTo(), actual.getProperties().getReplyTo()); + assertEquals(expectedAmqpProperties.getProperties().getContentType(), actual.getProperties().getContentType()); + assertEquals(expectedAmqpProperties.getProperties().getCorrelationId(), actual.getProperties().getCorrelationId()); + assertEquals(expectedAmqpProperties.getProperties().getTo(), actual.getProperties().getTo()); + assertEquals(expectedAmqpProperties.getProperties().getAbsoluteExpiryTime().toEpochSecond(), actual.getProperties().getAbsoluteExpiryTime().toEpochSecond()); + assertEquals(expectedAmqpProperties.getProperties().getSubject(), actual.getProperties().getSubject()); + assertEquals(expectedAmqpProperties.getProperties().getContentEncoding(), actual.getProperties().getContentEncoding()); + assertEquals(expectedAmqpProperties.getProperties().getGroupSequence(), actual.getProperties().getGroupSequence()); + assertEquals(expectedAmqpProperties.getProperties().getCreationTime().toEpochSecond(), actual.getProperties().getCreationTime().toEpochSecond()); + assertArrayEquals(expectedAmqpProperties.getProperties().getUserId(), actual.getProperties().getUserId()); assertMapValues(expectedAmqpProperties.getDeliveryAnnotations(), actual.getDeliveryAnnotations()); assertMapValues(expectedAmqpProperties.getMessageAnnotations(), actual.getMessageAnnotations()); @@ -1152,42 +1180,5 @@ private ServiceBusClientBuilder.ServiceBusReceiverClientBuilder getDeadLetterRec default: throw logger.logExceptionAsError(new IllegalArgumentException("Unknown entity type: " + entityType)); } - - } - - protected ServiceBusMessage getMessage(String messageId, boolean isSessionEnabled, AmqpAnnotatedMessage amqpPropertiesToSet) { - - final ServiceBusMessage message = TestUtils.getServiceBusMessage(CONTENTS_BYTES, messageId); - - final AmqpAnnotatedMessage amqpAnnotatedMessage = message.getAmqpAnnotatedMessage(); - amqpAnnotatedMessage.getMessageAnnotations().putAll(amqpPropertiesToSet.getMessageAnnotations()); - amqpAnnotatedMessage.getApplicationProperties().putAll(amqpPropertiesToSet.getApplicationProperties()); - amqpAnnotatedMessage.getDeliveryAnnotations().putAll(amqpPropertiesToSet.getDeliveryAnnotations()); - amqpAnnotatedMessage.getFooter().putAll(amqpPropertiesToSet.getFooter()); - - final AmqpMessageHeader header = amqpAnnotatedMessage.getHeader(); - header.setFirstAcquirer(amqpPropertiesToSet.getHeader().isFirstAcquirer()); - header.setTimeToLive(amqpPropertiesToSet.getHeader().getTimeToLive()); - header.setDurable(amqpPropertiesToSet.getHeader().isDurable()); - header.setDeliveryCount(amqpPropertiesToSet.getHeader().getDeliveryCount()); - header.setPriority(amqpPropertiesToSet.getHeader().getPriority()); - - final AmqpMessageProperties amqpMessageProperties = amqpAnnotatedMessage.getProperties(); - amqpMessageProperties.setReplyTo((amqpPropertiesToSet.getProperties().getReplyTo())); - amqpMessageProperties.setContentEncoding((amqpPropertiesToSet.getProperties().getContentEncoding())); - amqpMessageProperties.setAbsoluteExpiryTime((amqpPropertiesToSet.getProperties().getAbsoluteExpiryTime())); - amqpMessageProperties.setSubject((amqpPropertiesToSet.getProperties().getSubject())); - amqpMessageProperties.setContentType(amqpPropertiesToSet.getProperties().getContentType()); - amqpMessageProperties.setCorrelationId(amqpPropertiesToSet.getProperties().getCorrelationId()); - amqpMessageProperties.setTo(amqpPropertiesToSet.getProperties().getTo()); - amqpMessageProperties.setGroupSequence(amqpPropertiesToSet.getProperties().getGroupSequence()); - amqpMessageProperties.setUserId(amqpPropertiesToSet.getProperties().getUserId()); - amqpMessageProperties.setAbsoluteExpiryTime(amqpPropertiesToSet.getProperties().getAbsoluteExpiryTime()); - amqpMessageProperties.setCreationTime(amqpPropertiesToSet.getProperties().getCreationTime()); - amqpMessageProperties.setReplyToGroupId(amqpPropertiesToSet.getProperties().getReplyToGroupId()); - - - logger.verbose("Message id {}.", messageId); - return isSessionEnabled ? message.setSessionId(sessionId) : message; } } From 814cd0153569a4973e7a2f8af601a9983d2d3a16 Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Wed, 9 Sep 2020 01:22:09 -0700 Subject: [PATCH 22/27] Adding more unit test --- .../azure/messaging/servicebus/ServiceBusMessageTest.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java index a8357f21c69b..4a4594ad3969 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java @@ -35,6 +35,12 @@ public class ServiceBusMessageTest { public void copyConstructorTest() { // Arrange final ServiceBusReceivedMessage expected = new ServiceBusReceivedMessage(PAYLOAD_BYTES); + expected.getAmqpAnnotatedMessage().getMessageAnnotations().put(SEQUENCE_NUMBER_ANNOTATION_NAME.getValue(), "10"); + expected.getAmqpAnnotatedMessage().getMessageAnnotations().put(DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME.getValue(), "abc"); + expected.getAmqpAnnotatedMessage().getMessageAnnotations().put(ENQUEUED_SEQUENCE_NUMBER_ANNOTATION_NAME.getValue(), "11"); + expected.getAmqpAnnotatedMessage().getMessageAnnotations().put(ENQUEUED_TIME_UTC_ANNOTATION_NAME.getValue(), "11"); + expected.getAmqpAnnotatedMessage().getApplicationProperties().put(DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME.getValue(), "abc"); + expected.getAmqpAnnotatedMessage().getApplicationProperties().put(DEAD_LETTER_REASON_ANNOTATION_NAME.getValue(), "abc"); // Act final ServiceBusMessage actual = new ServiceBusMessage(expected); From 72c44768da070217e8e4c7df46c85352836c687f Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Wed, 9 Sep 2020 07:49:07 -0700 Subject: [PATCH 23/27] Added more comment --- .../com/azure/messaging/servicebus/ServiceBusMessageTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java index 4a4594ad3969..541e679baa51 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java @@ -29,7 +29,8 @@ public class ServiceBusMessageTest { private static final byte[] PAYLOAD_BYTES = PAYLOAD.getBytes(UTF_8); /** - * Verifies we correctly set values via copy constructor for {@link ServiceBusMessage}. + * Verifies we correctly set values via copy constructor for {@link ServiceBusMessage}. And ensure system properties + * are cleared. */ @Test public void copyConstructorTest() { From e019fc5eb8cda28ad06c8a05984649c88aeb47f3 Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Wed, 9 Sep 2020 09:01:05 -0700 Subject: [PATCH 24/27] Added more check in unit test --- .../core/amqp/models/AmqpMessageHeader.java | 2 +- .../amqp/models/AmqpMessageProperties.java | 1 + .../amqp/models/AmqpAnnotatedMessageTest.java | 27 +++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java index e4fcb055715e..e15a482558f3 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageHeader.java @@ -36,7 +36,7 @@ public class AmqpMessageHeader { durable = header.isDurable(); firstAcquirer = header.isFirstAcquirer(); timeToLive = header.getTimeToLive(); - + priority = header.getPriority(); } /** diff --git a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java index 44df4c71266e..29e7595e5b41 100644 --- a/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java +++ b/sdk/core/azure-core-amqp/src/main/java/com/azure/core/amqp/models/AmqpMessageProperties.java @@ -44,6 +44,7 @@ public class AmqpMessageProperties { Objects.requireNonNull(properties, "'properties' cannot be null."); absoluteExpiryTime = properties.getAbsoluteExpiryTime(); contentEncoding = properties.getContentEncoding(); + contentType = properties.getContentType(); correlationId = properties.getCorrelationId(); creationTime = properties.getCreationTime(); groupId = properties.getGroupId(); diff --git a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java index bd662895a9a1..aea81dc2a7fa 100644 --- a/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java +++ b/sdk/core/azure-core-amqp/src/test/java/com/azure/core/amqp/models/AmqpAnnotatedMessageTest.java @@ -8,6 +8,7 @@ import org.junit.jupiter.api.Test; import java.nio.charset.StandardCharsets; +import java.time.Duration; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -52,6 +53,21 @@ public void copyConstructorTest() { final Map expectedFooter = expected.getFooter(); expectedFooter.put("foo-1", "foo-value1"); + + final AmqpMessageProperties expectedMessageProperties = expected.getProperties(); + expectedMessageProperties.setGroupSequence(2L); + expectedMessageProperties.setContentEncoding("content-enc"); + expectedMessageProperties.setReplyToGroupId("a"); + expectedMessageProperties.setReplyTo("b"); + expectedMessageProperties.setCorrelationId("c"); + expectedMessageProperties.setSubject("d"); + expectedMessageProperties.setMessageId("id"); + + final AmqpMessageHeader expectedMessageHeader = expected.getHeader(); + expectedMessageHeader.setDeliveryCount(5L); + expectedMessageHeader.setTimeToLive(Duration.ofSeconds(20)); + expectedMessageHeader.setPriority(Short.valueOf("4")); + final AmqpAnnotatedMessage actual = new AmqpAnnotatedMessage(expected); // Act @@ -77,6 +93,17 @@ public void copyConstructorTest() { assertEquals(1, actual.getApplicationProperties().size()); assertEquals(1, actual.getFooter().size()); + assertEquals(expectedMessageProperties.getGroupSequence(), actual.getProperties().getGroupSequence()); + assertEquals(expectedMessageProperties.getContentEncoding(), actual.getProperties().getContentEncoding()); + assertEquals(expectedMessageProperties.getReplyToGroupId(), actual.getProperties().getReplyToGroupId()); + assertEquals(expectedMessageProperties.getReplyTo(), actual.getProperties().getReplyTo()); + assertEquals(expectedMessageProperties.getCorrelationId(), actual.getProperties().getCorrelationId()); + assertEquals(expectedMessageProperties.getSubject(), actual.getProperties().getSubject()); + assertEquals(expectedMessageProperties.getMessageId(), actual.getProperties().getMessageId()); + + assertEquals(expectedMessageHeader.getTimeToLive(), actual.getHeader().getTimeToLive()); + assertEquals(expectedMessageHeader.getPriority(), actual.getHeader().getPriority()); + assertMessageBody(expectedBinaryDataSize, CONTENTS_BYTES, actual); } From 52434625c2f43c4bc58f67a13857129b1dc9e18f Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Wed, 9 Sep 2020 12:49:16 -0700 Subject: [PATCH 25/27] Adding more test --- .../servicebus/ServiceBusMessage.java | 19 +--- .../servicebus/ServiceBusMessageTest.java | 101 +++++++++++++++++- 2 files changed, 102 insertions(+), 18 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java index 1bbc20dbf464..c4355398e6ed 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java @@ -18,10 +18,8 @@ import java.util.Arrays; import java.util.Collections; import java.util.Date; -import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME; import static com.azure.core.amqp.AmqpMessageConstant.DEAD_LETTER_REASON_ANNOTATION_NAME; @@ -55,8 +53,6 @@ * @see ServiceBusMessageBatch */ public class ServiceBusMessage { - private static final byte[] EMPTY_BYTE_ARRAY = new byte[0]; - private final AmqpAnnotatedMessage amqpAnnotatedMessage; private final ClientLogger logger = new ClientLogger(ServiceBusMessage.class); @@ -101,14 +97,7 @@ public ServiceBusMessage(ServiceBusReceivedMessage receivedMessage) { this.amqpAnnotatedMessage = new AmqpAnnotatedMessage(receivedMessage.getAmqpAnnotatedMessage()); this.context = Context.NONE; - - final AmqpDataBody amqpDataBody = ((AmqpDataBody) receivedMessage.getAmqpAnnotatedMessage().getBody()); - final List binaryDataList = amqpDataBody.getData().stream().collect(Collectors.toList()); - if (binaryDataList.size() > 0) { - binaryData = binaryDataList.get(0).getData(); - } else { - binaryData = EMPTY_BYTE_ARRAY; - } + this.binaryData = receivedMessage.getBody(); // clean up data which user is not allowed to set. amqpAnnotatedMessage.getHeader().setDeliveryCount(null); @@ -134,7 +123,7 @@ public AmqpAnnotatedMessage getAmqpAnnotatedMessage() { /** * Gets the set of free-form {@link ServiceBusMessage} properties which may be used for passing metadata associated * with the {@link ServiceBusMessage} during Service Bus operations. A common use-case for - * {@code applicationProperties()} is to associate serialization hints for the {@link #getBody()} as an aid to + * {@code getApplicationProperties()} is to associate serialization hints for the {@link #getBody()} as an aid to * consumers who wish to deserialize the binary data. * * @return Application properties associated with this {@link ServiceBusMessage}. @@ -162,10 +151,10 @@ public byte[] getBody() { case SEQUENCE: case VALUE: throw logger.logExceptionAsError(new UnsupportedOperationException("Not supported AmqpBodyType: " - + amqpAnnotatedMessage.getBody().getBodyType().toString())); + + type.toString())); default: throw logger.logExceptionAsError(new IllegalArgumentException("Unknown AmqpBodyType: " - + amqpAnnotatedMessage.getBody().getBodyType().toString())); + + type.toString())); } } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java index 541e679baa51..aab956b1a4c5 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/ServiceBusMessageTest.java @@ -9,10 +9,12 @@ import static com.azure.core.amqp.AmqpMessageConstant.ENQUEUED_SEQUENCE_NUMBER_ANNOTATION_NAME; import static com.azure.core.amqp.AmqpMessageConstant.ENQUEUED_TIME_UTC_ANNOTATION_NAME; import static com.azure.core.amqp.AmqpMessageConstant.LOCKED_UNTIL_KEY_ANNOTATION_NAME; +import static com.azure.core.amqp.AmqpMessageConstant.PARTITION_KEY_ANNOTATION_NAME; import static com.azure.core.amqp.AmqpMessageConstant.SEQUENCE_NUMBER_ANNOTATION_NAME; import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotSame; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -20,6 +22,8 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; +import java.time.Duration; + /** * Test for {@link ServiceBusMessage}. */ @@ -29,12 +33,23 @@ public class ServiceBusMessageTest { private static final byte[] PAYLOAD_BYTES = PAYLOAD.getBytes(UTF_8); /** - * Verifies we correctly set values via copy constructor for {@link ServiceBusMessage}. And ensure system properties - * are cleared. + * Verifies we correctly set values via copy constructor for {@link ServiceBusMessage}. + * 1. And ensure system properties are cleared. + * 2. Ensure modifying original `ServiceBusReceivedMessage` object does not change values of new ServiceBusMessage + * object created using original `ServiceBusReceivedMessage`. */ @Test public void copyConstructorTest() { // Arrange + final String expectedSubject = "old-subject"; + final String expectedTo = "old-to"; + final String expectedReplyTo = "old-reply-to"; + final String expectedReplyToSessionId = "old-reply-to-session-id"; + final String expectedCorrelationId = "old-d-id"; + final String expectedDeadLetterSource = "old-d-l-source"; + final Duration expectedTimeToLive = Duration.ofSeconds(20); + final String expectedPartitionKey = "old-p-key"; + final ServiceBusReceivedMessage expected = new ServiceBusReceivedMessage(PAYLOAD_BYTES); expected.getAmqpAnnotatedMessage().getMessageAnnotations().put(SEQUENCE_NUMBER_ANNOTATION_NAME.getValue(), "10"); expected.getAmqpAnnotatedMessage().getMessageAnnotations().put(DEAD_LETTER_SOURCE_KEY_ANNOTATION_NAME.getValue(), "abc"); @@ -42,12 +57,39 @@ public void copyConstructorTest() { expected.getAmqpAnnotatedMessage().getMessageAnnotations().put(ENQUEUED_TIME_UTC_ANNOTATION_NAME.getValue(), "11"); expected.getAmqpAnnotatedMessage().getApplicationProperties().put(DEAD_LETTER_DESCRIPTION_ANNOTATION_NAME.getValue(), "abc"); expected.getAmqpAnnotatedMessage().getApplicationProperties().put(DEAD_LETTER_REASON_ANNOTATION_NAME.getValue(), "abc"); + expected.setSubject(expectedSubject); + expected.setTo(expectedTo); + expected.setReplyTo(expectedReplyTo); + expected.setReplyToSessionId(expectedReplyToSessionId); + expected.setCorrelationId(expectedCorrelationId); + expected.setDeadLetterSource(expectedDeadLetterSource); + expected.setTimeToLive(expectedTimeToLive); + expected.setPartitionKey(expectedPartitionKey); - // Act final ServiceBusMessage actual = new ServiceBusMessage(expected); + // Act + // Modify the values after invoking copy constructor + expected.setSubject("new-subject"); + expected.setTo("new-to"); + expected.setReplyTo("new-reply-to"); + expected.setReplyToSessionId("new-session-id"); + expected.setCorrelationId("new-c-id"); + expected.setTimeToLive(Duration.ofSeconds(40)); + expected.setPartitionKey("new-p-key"); + // Assert assertNotSame(expected.getAmqpAnnotatedMessage(), actual.getAmqpAnnotatedMessage()); + + // Validate updated values + assertEquals(expectedSubject, actual.getSubject()); + assertEquals(expectedTo, actual.getTo()); + assertEquals(expectedReplyTo, actual.getReplyTo()); + assertEquals(expectedReplyToSessionId, actual.getReplyToSessionId()); + assertEquals(expectedCorrelationId, actual.getCorrelationId()); + assertEquals(expectedTimeToLive, actual.getTimeToLive()); + assertEquals(expectedPartitionKey, actual.getPartitionKey()); + // Following values should be reset. assertNull(actual.getAmqpAnnotatedMessage().getMessageAnnotations().get(LOCKED_UNTIL_KEY_ANNOTATION_NAME.getValue())); assertNull(actual.getAmqpAnnotatedMessage().getMessageAnnotations().get(SEQUENCE_NUMBER_ANNOTATION_NAME.getValue())); @@ -60,6 +102,59 @@ public void copyConstructorTest() { assertNull(actual.getAmqpAnnotatedMessage().getHeader().getDeliveryCount()); } + + /** + * Verifies we correctly set values via copy constructor for {@link ServiceBusMessage}. + * 1. Ensure modifying original `ServiceBusReceivedMessage` object does not change values of new ServiceBusMessage + * object changes its values. + */ + @Test + public void copyConstructorModifyAfterCopyTest() { + // Arrange + final String expectedSubject = "old-subject"; + final String expectedTo = "old-to"; + final String expectedReplyTo = "old-reply-to"; + final String expectedReplyToSessionId = "old-reply-to-session-id"; + final String expectedCorrelationId = "old-d-id"; + final String expectedDeadLetterSource = "old-d-l-source"; + final Duration expectedTimeToLive = Duration.ofSeconds(20); + final String expectedPartitionKey = "old-p-key"; + + final ServiceBusReceivedMessage originalMessage = new ServiceBusReceivedMessage(PAYLOAD_BYTES); + originalMessage.setSubject(expectedSubject); + originalMessage.setTo(expectedTo); + originalMessage.setReplyTo(expectedReplyTo); + originalMessage.setReplyToSessionId(expectedReplyToSessionId); + originalMessage.setCorrelationId(expectedCorrelationId); + originalMessage.setDeadLetterSource(expectedDeadLetterSource); + originalMessage.setTimeToLive(expectedTimeToLive); + originalMessage.setPartitionKey(expectedPartitionKey); + + final ServiceBusMessage copiedMessage = new ServiceBusMessage(originalMessage); + + // Act + // Modify the values after invoking copy constructor + copiedMessage.setSubject("new-subject"); + copiedMessage.setTo("new-to"); + copiedMessage.setReplyTo("new-reply-to"); + copiedMessage.setReplyToSessionId("new-session-id"); + copiedMessage.setCorrelationId("new-c-id"); + copiedMessage.setTimeToLive(Duration.ofSeconds(40)); + copiedMessage.setPartitionKey("new-p-key"); + + // Assert + // Validate updated values + assertEquals(expectedSubject, originalMessage.getAmqpAnnotatedMessage().getProperties().getSubject()); + assertEquals(expectedTo, originalMessage.getAmqpAnnotatedMessage().getProperties().getTo()); + assertEquals(expectedReplyTo, originalMessage.getAmqpAnnotatedMessage().getProperties().getReplyTo()); + assertEquals(expectedReplyToSessionId, originalMessage.getAmqpAnnotatedMessage().getProperties().getReplyToGroupId()); + assertEquals(expectedCorrelationId, originalMessage.getAmqpAnnotatedMessage().getProperties().getCorrelationId()); + + assertEquals(expectedTimeToLive, originalMessage.getAmqpAnnotatedMessage().getHeader().getTimeToLive()); + + assertEquals(expectedPartitionKey, originalMessage.getAmqpAnnotatedMessage().getMessageAnnotations().get(PARTITION_KEY_ANNOTATION_NAME.getValue())); + } + /** * Verify UTF_8 encoded body is created. */ From 3fe4224b199e7c89e987b3db6ee17a0565843d80 Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Wed, 9 Sep 2020 15:54:12 -0700 Subject: [PATCH 26/27] Review comments --- .../servicebus/ServiceBusMessage.java | 11 +++---- .../ServiceBusMessageSerializer.java | 29 +++++++------------ .../servicebus/ServiceBusReceivedMessage.java | 2 +- 3 files changed, 15 insertions(+), 27 deletions(-) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java index c4355398e6ed..8326cf67a98c 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java @@ -374,13 +374,10 @@ public ServiceBusMessage setTimeToLive(Duration timeToLive) { * Timestamps */ public OffsetDateTime getScheduledEnqueueTime() { - OffsetDateTime scheduledEnqueueTime = null; - Map messageAnnotationMap = amqpAnnotatedMessage.getMessageAnnotations(); - if (messageAnnotationMap.containsKey(SCHEDULED_ENQUEUE_UTC_TIME_NAME.getValue())) { - scheduledEnqueueTime = ((Date) messageAnnotationMap.get(SCHEDULED_ENQUEUE_UTC_TIME_NAME.getValue())) - .toInstant().atOffset(ZoneOffset.UTC); - } - return scheduledEnqueueTime; + Object value = amqpAnnotatedMessage.getMessageAnnotations().get(SCHEDULED_ENQUEUE_UTC_TIME_NAME.getValue()); + return value != null + ? ((Date) value).toInstant().atOffset(ZoneOffset.UTC) + : null; } /** diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java index 79e96e1529d3..ad2aab025c63 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessageSerializer.java @@ -49,7 +49,6 @@ import java.util.Collections; import java.util.Date; import java.util.HashMap; -import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; @@ -158,8 +157,8 @@ public Message serialize(T object) { amqpMessage.getProperties().setUserId(new Binary(brokeredProperties.getUserId())); if (brokeredProperties.getAbsoluteExpiryTime() != null) { - amqpMessage.getProperties().setAbsoluteExpiryTime(Date.from(brokeredProperties.getAbsoluteExpiryTime(). - toInstant())); + amqpMessage.getProperties().setAbsoluteExpiryTime(Date.from(brokeredProperties.getAbsoluteExpiryTime() + .toInstant())); } if (brokeredProperties.getCreationTime() != null) { amqpMessage.getProperties().setCreationTime(Date.from(brokeredProperties.getCreationTime().toInstant())); @@ -171,19 +170,19 @@ public Message serialize(T object) { //set header AmqpMessageHeader header = brokeredMessage.getAmqpAnnotatedMessage().getHeader(); if (header.getDeliveryCount() != null) { - amqpMessage.setDeliveryCount(brokeredMessage.getAmqpAnnotatedMessage().getHeader().getDeliveryCount()); + amqpMessage.setDeliveryCount(header.getDeliveryCount()); } if (header.getPriority() != null) { amqpMessage.setPriority(header.getPriority()); } if (header.isDurable() != null) { - amqpMessage.setDurable(brokeredMessage.getAmqpAnnotatedMessage().getHeader().isDurable()); + amqpMessage.setDurable(header.isDurable()); } if (header.isFirstAcquirer() != null) { - amqpMessage.setFirstAcquirer(brokeredMessage.getAmqpAnnotatedMessage().getHeader().isFirstAcquirer()); + amqpMessage.setFirstAcquirer(header.isFirstAcquirer()); } if (header.getTimeToLive() != null) { - amqpMessage.setTtl(brokeredMessage.getAmqpAnnotatedMessage().getHeader().getTimeToLive().toMillis()); + amqpMessage.setTtl(header.getTimeToLive().toMillis()); } final Map messageAnnotationsMap = new HashMap<>(); @@ -210,9 +209,7 @@ public Message serialize(T object) { final Map deliveryAnnotations = brokeredMessage.getAmqpAnnotatedMessage() .getDeliveryAnnotations(); - Iterator> deliveryEntries = deliveryAnnotations.entrySet().iterator(); - while (deliveryEntries.hasNext()) { - Map.Entry deliveryEntry = deliveryEntries.next(); + for (Map.Entry deliveryEntry : deliveryAnnotations.entrySet()) { deliveryAnnotationsMap.put(Symbol.valueOf(deliveryEntry.getKey()), deliveryEntry.getValue()); } @@ -364,7 +361,7 @@ private List deserializeListOfMessages(Message amqpMe } private ServiceBusReceivedMessage deserializeMessage(Message amqpMessage) { - byte[] bytes = null; + final byte[] bytes; final Section body = amqpMessage.getBody(); if (body != null) { //TODO (conniey): Support other AMQP types like AmqpValue and AmqpSequence. @@ -401,12 +398,8 @@ private ServiceBusReceivedMessage deserializeMessage(Message amqpMessage) { final Footer footer = amqpMessage.getFooter(); if (footer != null && footer.getValue() != null) { @SuppressWarnings("unchecked") final Map footerValue = footer.getValue(); - Iterator> footerEntries = footerValue.entrySet().iterator(); + setValues(footerValue, brokeredAmqpAnnotatedMessage.getFooter()); - while (footerEntries.hasNext()) { - Map.Entry footerEntry = footerEntries.next(); - brokeredAmqpAnnotatedMessage.getFooter().put(footerEntry.getKey().toString(), footerEntry.getValue()); - } } // Properties @@ -485,9 +478,7 @@ private static int getPayloadSize(Message msg) { private void setValues(Map sourceMap, Map targetMap) { if (sourceMap != null) { for (Map.Entry entry : sourceMap.entrySet()) { - final String key = entry.getKey().toString(); - final Object value = entry.getValue(); - targetMap.put(key, value); + targetMap.put(entry.getKey().toString(), entry.getValue()); } } } diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java index c8a0915188d7..33373fe9d759 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusReceivedMessage.java @@ -635,7 +635,7 @@ void setViaPartitionKey(String viaPartitionKey) { * Gets String value from given map and null if key does not exists. */ private String getStringValue(Map dataMap, String key) { - return dataMap.containsKey(key) ? (String) dataMap.get(key) : null; + return (String) dataMap.get(key); } /* From ea1ee387c41c9e561229a7d2a4ebb101d504ae7f Mon Sep 17 00:00:00 2001 From: Hemant Tanwar Date: Wed, 9 Sep 2020 18:03:26 -0700 Subject: [PATCH 27/27] Adding java doc --- sdk/core/azure-core-amqp/CHANGELOG.md | 1 + .../com/azure/messaging/servicebus/ServiceBusMessage.java | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/sdk/core/azure-core-amqp/CHANGELOG.md b/sdk/core/azure-core-amqp/CHANGELOG.md index 37453e692edf..5b99af016d9d 100644 --- a/sdk/core/azure-core-amqp/CHANGELOG.md +++ b/sdk/core/azure-core-amqp/CHANGELOG.md @@ -1,6 +1,7 @@ # Release History ## 1.5.0-beta.1 (Unreleased) +- Added Amqp Message envelope which can be accessed using `AmqpAnnotatedMessage`. ## 1.4.0 (2020-08-11) diff --git a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java index 8326cf67a98c..1b64b77a2897 100644 --- a/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java +++ b/sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/ServiceBusMessage.java @@ -381,7 +381,9 @@ public OffsetDateTime getScheduledEnqueueTime() { } /** - * Sets the scheduled enqueue time of this message. + * Sets the scheduled enqueue time of this message. A {@code null} will not be set. If this value needs to be unset + * it could be done by value removing from {@link AmqpAnnotatedMessage#getMessageAnnotations()} using key + * {@link AmqpMessageConstant#SCHEDULED_ENQUEUE_UTC_TIME_NAME}. * * @param scheduledEnqueueTime the datetime at which this message should be enqueued in Azure Service Bus. *