Skip to content

Commit 5996565

Browse files
authored
Replaces namespace prefix w/global namespace in payload for CreateTopicBodyImpl (fixes Azure#34880) (Azure#34895)
* Fix for Azure#34880: Updating TopicProperties w/AuthorizationRules returns 400 Bad request * Added line to CHANGELOG.md * Minimal test case.
1 parent 4f75a7b commit 5996565

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

sdk/servicebus/azure-messaging-servicebus/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414

1515
- Fixed mapping of `ServiceBusManagementError` to corresponding `AzureExceptions` in `ServiceBusAdministrationClient`. ([33609](https://github.com/Azure/azure-sdk-for-java/issues/33609))
1616

17+
- Fixed issue causing updates to TopicProperties w/AuthorizationRules to return 400 Bad request([#34880](https://github.com/Azure/azure-sdk-for-java/issues/34880))
18+
1719
### Other Changes
1820

1921
## 7.15.0-beta.2 (2023-07-18)

sdk/servicebus/azure-messaging-servicebus/src/main/java/com/azure/messaging/servicebus/administration/implementation/ServiceBusManagementSerializer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.azure.messaging.servicebus.administration.implementation.models.CreateQueueBodyImpl;
1313
import com.azure.messaging.servicebus.administration.implementation.models.CreateRuleBodyImpl;
1414
import com.azure.messaging.servicebus.administration.implementation.models.CreateSubscriptionBodyImpl;
15+
import com.azure.messaging.servicebus.administration.implementation.models.CreateTopicBodyImpl;
1516

1617
import java.io.IOException;
1718
import java.lang.reflect.Type;
@@ -44,7 +45,7 @@ public String serialize(Object object, SerializerEncoding encoding) throws IOExc
4445

4546
final Class<?> clazz = object.getClass();
4647
if (!CreateQueueBodyImpl.class.equals(clazz) && !CreateRuleBodyImpl.class.equals(clazz)
47-
&& !CreateSubscriptionBodyImpl.class.equals(clazz)) {
48+
&& !CreateSubscriptionBodyImpl.class.equals(clazz) && !CreateTopicBodyImpl.class.equals(clazz)) {
4849
return contents;
4950
}
5051

sdk/servicebus/azure-messaging-servicebus/src/test/java/com/azure/messaging/servicebus/implementation/ServiceBusManagementSerializerTest.java

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@
33

44
package com.azure.messaging.servicebus.implementation;
55

6+
import com.azure.core.util.serializer.SerializerEncoding;
67
import com.azure.messaging.servicebus.TestUtils;
78
import com.azure.messaging.servicebus.administration.implementation.EntityHelper;
89
import com.azure.messaging.servicebus.administration.implementation.ServiceBusManagementSerializer;
910
import com.azure.messaging.servicebus.administration.implementation.models.AuthorizationRuleImpl;
1011
import com.azure.messaging.servicebus.administration.implementation.models.CorrelationFilterImpl;
12+
import com.azure.messaging.servicebus.administration.implementation.models.CreateTopicBodyContentImpl;
13+
import com.azure.messaging.servicebus.administration.implementation.models.CreateTopicBodyImpl;
1114
import com.azure.messaging.servicebus.administration.implementation.models.EmptyRuleActionImpl;
1215
import com.azure.messaging.servicebus.administration.implementation.models.FalseFilterImpl;
1316
import com.azure.messaging.servicebus.administration.implementation.models.KeyValueImpl;
@@ -30,6 +33,7 @@
3033
import com.azure.messaging.servicebus.administration.implementation.models.SubscriptionDescriptionFeedImpl;
3134
import com.azure.messaging.servicebus.administration.implementation.models.SubscriptionDescriptionImpl;
3235
import com.azure.messaging.servicebus.administration.implementation.models.TitleImpl;
36+
import com.azure.messaging.servicebus.administration.implementation.models.TopicDescriptionImpl;
3337
import com.azure.messaging.servicebus.administration.implementation.models.TrueFilterImpl;
3438
import com.azure.messaging.servicebus.administration.models.AccessRights;
3539
import com.azure.messaging.servicebus.administration.models.AuthorizationRule;
@@ -763,6 +767,39 @@ void deserializeRuleEntryResponse() throws IOException {
763767
assertRuleEntryEquals(expected, actual);
764768
}
765769

770+
@Test
771+
void serializeTopicDescriptionXML() throws IOException {
772+
// Arrange
773+
AuthorizationRuleImpl rule = new AuthorizationRuleImpl()
774+
.setKeyName("test")
775+
.setType("SharedAccessAuthorizationRule")
776+
.setRights(Arrays.asList(AccessRights.MANAGE, AccessRights.LISTEN, AccessRights.SEND));
777+
778+
TopicDescriptionImpl topicDescription = new TopicDescriptionImpl()
779+
.setAuthorizationRules(Arrays.asList(rule));
780+
781+
CreateTopicBodyImpl createTopicBody = new CreateTopicBodyImpl()
782+
.setContent(new CreateTopicBodyContentImpl().setTopicDescription(topicDescription));
783+
784+
// Act
785+
String serialized = SERIALIZER.serialize(createTopicBody, SerializerEncoding.XML);
786+
787+
// Assert
788+
assertNotNull(serialized);
789+
790+
// Note: Technically, the XML created by the serializer is already valid/correct. However, the Azure Service
791+
// that consumes the payload does not accept prefixed AuthorizationRule
792+
// (ie. wstxns1:AuthorizationRule xmlns:wstxns1=...), so special care needs to be taken to create usable XML.
793+
794+
// Must contain correct default namespace
795+
assertTrue(serialized.contains("<TopicDescription xmlns=\"http://schemas.microsoft.com/netservices/2010/10/servicebus/connect\""),
796+
"Serialized payload does not contain correct default namespace");
797+
798+
// Must not contain prefixed namespace
799+
assertTrue(serialized.contains("<AuthorizationRule"),
800+
"Serialized payload does not contain AuthorizationRule in default namespace");
801+
}
802+
766803
/**
767804
* Given a file name, gets the corresponding resource and its contents as a string.
768805
*

0 commit comments

Comments
 (0)