From 25d96fcd4306899c10ae834cd7a504a692e46c54 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 12 Oct 2011 14:01:18 -0700 Subject: [PATCH 01/59] Project layout Adding empty pom.xml file Add .gitignore to skip common build output and ide files --- .gitignore | 4 ++++ microsoft-azure-api/pom.xml | 8 ++++++++ 2 files changed, 12 insertions(+) create mode 100644 .gitignore create mode 100644 microsoft-azure-api/pom.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000000..beef00d01653 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +.classpath +.project +.settings +target diff --git a/microsoft-azure-api/pom.xml b/microsoft-azure-api/pom.xml new file mode 100644 index 000000000000..b1391caae006 --- /dev/null +++ b/microsoft-azure-api/pom.xml @@ -0,0 +1,8 @@ + + 4.0.0 + com.microsoft.azure + microsoft-azure-api + 0.0.1-SNAPSHOT + Microsoft Azure Client API + API for Microsoft Azure Clients + \ No newline at end of file From 542ae883a170de856b8f36d9bca635b97a833343 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 12 Oct 2011 23:13:10 -0700 Subject: [PATCH 02/59] Adding xsd class generation. Adding ServiceBusClient interface. --- microsoft-azure-api/pom.xml | 21 +- .../microsoft/azure/http/ClientFactory.java | 5 + .../services/serviceBus/BrokeredMessage.java | 5 + .../services/serviceBus/RECEIVE_MODE.java | 5 + .../services/serviceBus/ServiceBusClient.java | 30 ++ .../serviceBus/ServiceBusClientFactory.java | 7 + .../src/main/resources/package-names.xjb | 10 + ...as.microsoft.com.2003.10.Serialization.xsd | 42 +++ ...netservices.2010.10.servicebus.connect.xsd | 296 ++++++++++++++++++ 9 files changed, 420 insertions(+), 1 deletion(-) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientFactory.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokeredMessage.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/RECEIVE_MODE.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientFactory.java create mode 100644 microsoft-azure-api/src/main/resources/package-names.xjb create mode 100644 microsoft-azure-api/src/main/resources/schemas.microsoft.com.2003.10.Serialization.xsd create mode 100644 microsoft-azure-api/src/main/resources/schemas.microsoft.com.netservices.2010.10.servicebus.connect.xsd diff --git a/microsoft-azure-api/pom.xml b/microsoft-azure-api/pom.xml index b1391caae006..083f5e5dcd02 100644 --- a/microsoft-azure-api/pom.xml +++ b/microsoft-azure-api/pom.xml @@ -5,4 +5,23 @@ 0.0.1-SNAPSHOT Microsoft Azure Client API API for Microsoft Azure Clients - \ No newline at end of file + + + + + org.jvnet.jaxb2.maven2 + maven-jaxb2-plugin + 0.8.0 + + + generate-sources + + generate + + + + + + + + diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientFactory.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientFactory.java new file mode 100644 index 000000000000..8dc43770d802 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientFactory.java @@ -0,0 +1,5 @@ +package com.microsoft.azure.http; + +public abstract class ClientFactory { + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokeredMessage.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokeredMessage.java new file mode 100644 index 000000000000..29dea80dd690 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokeredMessage.java @@ -0,0 +1,5 @@ +package com.microsoft.azure.services.serviceBus; + +public class BrokeredMessage { + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/RECEIVE_MODE.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/RECEIVE_MODE.java new file mode 100644 index 000000000000..c08a36fe034d --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/RECEIVE_MODE.java @@ -0,0 +1,5 @@ +package com.microsoft.azure.services.serviceBus; + +public enum RECEIVE_MODE { + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java new file mode 100644 index 000000000000..76c347d33513 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java @@ -0,0 +1,30 @@ +package com.microsoft.azure.services.serviceBus; +import com.microsoft.azure.services.serviceBus.model.*; + +public interface ServiceBusClient { + void sendMessage(String path, BrokeredMessage message); + BrokeredMessage receiveMessage(String path, int timeout, RECEIVE_MODE receiveMode); + void abandonMessage(BrokeredMessage message); + void completeMessage(BrokeredMessage message); + + void createQueue(String queuePath, QueueDescription description); + void deleteQueue(String queuePath); + QueueDescription getQueue(String queuePath); + QueueDescription[] getQueues(); + + void createTopic(String topicPath, TopicDescription description); + void deleteTopic(String topicPath); + TopicDescription getTopic(String topicPath); + TopicDescription[] getTopics(); + + void addSubscription(String topicPath, String subscriptionName, SubscriptionDescription description); + void removeSubscription(String topicPath, String subscriptionName); + SubscriptionDescription getSubscription(String topicPath, String subscriptionName); + SubscriptionDescription[] getSubscriptions(String topicPath); + + void addRule(String topicPath, String subscriptionName, String ruleName, RuleDescription description); + void removeRule(String topicPath, String subscriptionName, String ruleName); + RuleDescription getRule(String topicPath, String subscriptionName, String ruleName); + RuleDescription [] getRules(String topicPath, String subscriptionName); +} + diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientFactory.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientFactory.java new file mode 100644 index 000000000000..7e09218369f6 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientFactory.java @@ -0,0 +1,7 @@ +package com.microsoft.azure.services.serviceBus; + +import com.microsoft.azure.http.ClientFactory; + +public class ServiceBusClientFactory extends ClientFactory { + public ServiceBusClient createClient() throws Exception {throw new Exception();} +} diff --git a/microsoft-azure-api/src/main/resources/package-names.xjb b/microsoft-azure-api/src/main/resources/package-names.xjb new file mode 100644 index 000000000000..2a71b66ed69a --- /dev/null +++ b/microsoft-azure-api/src/main/resources/package-names.xjb @@ -0,0 +1,10 @@ + + + + + + + + diff --git a/microsoft-azure-api/src/main/resources/schemas.microsoft.com.2003.10.Serialization.xsd b/microsoft-azure-api/src/main/resources/schemas.microsoft.com.2003.10.Serialization.xsd new file mode 100644 index 000000000000..62ff1db89253 --- /dev/null +++ b/microsoft-azure-api/src/main/resources/schemas.microsoft.com.2003.10.Serialization.xsd @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/microsoft-azure-api/src/main/resources/schemas.microsoft.com.netservices.2010.10.servicebus.connect.xsd b/microsoft-azure-api/src/main/resources/schemas.microsoft.com.netservices.2010.10.servicebus.connect.xsd new file mode 100644 index 000000000000..bdad52ce00ff --- /dev/null +++ b/microsoft-azure-api/src/main/resources/schemas.microsoft.com.netservices.2010.10.servicebus.connect.xsd @@ -0,0 +1,296 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From f38b6ef322c8f5d40336d74db3d70ab46eb5d69b Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 12 Oct 2011 23:42:59 -0700 Subject: [PATCH 03/59] Removing jaxb annotation from xsd --- ...rosoft.com.netservices.2010.10.servicebus.connect.xsd | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/microsoft-azure-api/src/main/resources/schemas.microsoft.com.netservices.2010.10.servicebus.connect.xsd b/microsoft-azure-api/src/main/resources/schemas.microsoft.com.netservices.2010.10.servicebus.connect.xsd index bdad52ce00ff..825aaf965fb3 100644 --- a/microsoft-azure-api/src/main/resources/schemas.microsoft.com.netservices.2010.10.servicebus.connect.xsd +++ b/microsoft-azure-api/src/main/resources/schemas.microsoft.com.netservices.2010.10.servicebus.connect.xsd @@ -4,14 +4,7 @@ xmlns:tns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect" elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect" - xmlns:xs="http://www.w3.org/2001/XMLSchema" - xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" - xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" - jaxb:version="2.0"> - - + xmlns:xs="http://www.w3.org/2001/XMLSchema"> From 95f85401069b8fdf5f601ca45c7478ee6029a227 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 12 Oct 2011 23:43:27 -0700 Subject: [PATCH 04/59] Adding message send/receive interfaces --- .../azure/services/serviceBus/MessageReceiver.java | 7 +++++++ .../microsoft/azure/services/serviceBus/MessageSender.java | 5 +++++ .../azure/services/serviceBus/MessageTranceiver.java | 6 ++++++ 3 files changed, 18 insertions(+) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageTranceiver.java diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java new file mode 100644 index 000000000000..33a29feaf8c9 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java @@ -0,0 +1,7 @@ +package com.microsoft.azure.services.serviceBus; + +public interface MessageReceiver { + BrokeredMessage receive(int timeout, RECEIVE_MODE receiveMode); + void abandon(BrokeredMessage message); + void complete(BrokeredMessage message); +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java new file mode 100644 index 000000000000..c1144ff5cb11 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java @@ -0,0 +1,5 @@ +package com.microsoft.azure.services.serviceBus; + +public interface MessageSender { + void send(BrokeredMessage message); +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageTranceiver.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageTranceiver.java new file mode 100644 index 000000000000..60805965530f --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageTranceiver.java @@ -0,0 +1,6 @@ + +package com.microsoft.azure.services.serviceBus; + +public interface MessageTranceiver extends MessageSender, MessageReceiver { + +} From b5f1f88a7599bba6f4a1a4292cb7baba48324ab4 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 12 Oct 2011 23:43:55 -0700 Subject: [PATCH 05/59] Factory methods for send/receive interfaces --- .../serviceBus/ServiceBusClientFactory.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientFactory.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientFactory.java index 7e09218369f6..bfab2908a0a6 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientFactory.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientFactory.java @@ -3,5 +3,16 @@ import com.microsoft.azure.http.ClientFactory; public class ServiceBusClientFactory extends ClientFactory { - public ServiceBusClient createClient() throws Exception {throw new Exception();} + public ServiceBusClient createClient() { + return null; + } + public MessageTranceiver openQueue(String queuePath) { + return null; + } + public MessageSender openTopic(String topicPath) { + return null; + } + public MessageReceiver openSubscription(String topicPath, String subscriptionName) { + return null; + } } From ca8d7096def8a7a19d047723727e5f49a53bd2f7 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 12 Oct 2011 23:44:15 -0700 Subject: [PATCH 06/59] Adding overload for receiveMessage --- .../microsoft/azure/services/serviceBus/ServiceBusClient.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java index 76c347d33513..53e552d4a0bd 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java @@ -3,7 +3,8 @@ public interface ServiceBusClient { void sendMessage(String path, BrokeredMessage message); - BrokeredMessage receiveMessage(String path, int timeout, RECEIVE_MODE receiveMode); + BrokeredMessage receiveMessage(String queuePath, int timeout, RECEIVE_MODE receiveMode); + BrokeredMessage receiveMessage(String topicPath, String subscriptionName, int timeout, RECEIVE_MODE receiveMode); void abandonMessage(BrokeredMessage message); void completeMessage(BrokeredMessage message); From 85e39d7f7279e7518574ec98f735ba30b828f3ec Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 13 Oct 2011 07:49:58 -0700 Subject: [PATCH 07/59] Changing enum case --- .../azure/services/serviceBus/MessageReceiver.java | 2 +- .../microsoft/azure/services/serviceBus/RECEIVE_MODE.java | 5 ----- .../microsoft/azure/services/serviceBus/ReceiveMode.java | 6 ++++++ .../azure/services/serviceBus/ServiceBusClient.java | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-) delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/RECEIVE_MODE.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ReceiveMode.java diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java index 33a29feaf8c9..969742f8b94d 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java @@ -1,7 +1,7 @@ package com.microsoft.azure.services.serviceBus; public interface MessageReceiver { - BrokeredMessage receive(int timeout, RECEIVE_MODE receiveMode); + BrokeredMessage receive(int timeout, ReceiveMode receiveMode); void abandon(BrokeredMessage message); void complete(BrokeredMessage message); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/RECEIVE_MODE.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/RECEIVE_MODE.java deleted file mode 100644 index c08a36fe034d..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/RECEIVE_MODE.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.microsoft.azure.services.serviceBus; - -public enum RECEIVE_MODE { - -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ReceiveMode.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ReceiveMode.java new file mode 100644 index 000000000000..b96aa03a3835 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ReceiveMode.java @@ -0,0 +1,6 @@ +package com.microsoft.azure.services.serviceBus; + +public enum ReceiveMode { + PEEK_LOCK, + RECEIVE_AND_DELETE, +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java index 53e552d4a0bd..3bf1a4ed8bd1 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java @@ -3,8 +3,8 @@ public interface ServiceBusClient { void sendMessage(String path, BrokeredMessage message); - BrokeredMessage receiveMessage(String queuePath, int timeout, RECEIVE_MODE receiveMode); - BrokeredMessage receiveMessage(String topicPath, String subscriptionName, int timeout, RECEIVE_MODE receiveMode); + BrokeredMessage receiveMessage(String queuePath, int timeout, ReceiveMode receiveMode); + BrokeredMessage receiveMessage(String topicPath, String subscriptionName, int timeout, ReceiveMode receiveMode); void abandonMessage(BrokeredMessage message); void completeMessage(BrokeredMessage message); From ade0ec745f91f18472b35e6a2e24df10d392bbfd Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 13 Oct 2011 07:27:17 -0700 Subject: [PATCH 08/59] Referencing Jersey in a branch To have a better idea how to design for it, if it was used --- microsoft-azure-api/pom.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/microsoft-azure-api/pom.xml b/microsoft-azure-api/pom.xml index 083f5e5dcd02..7d7fb65fb498 100644 --- a/microsoft-azure-api/pom.xml +++ b/microsoft-azure-api/pom.xml @@ -24,4 +24,16 @@ + + + com.sun.jersey + jersey-client + 1.10-b02 + + + com.sun.jersey + jersey-atom + 1.10-b02 + + From 1ccb3c1a14a1f033f9defe3a27ab793d34303dde Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 13 Oct 2011 07:35:03 -0700 Subject: [PATCH 09/59] Roughing out an approximation of a client endpoint Renamed Factory to Builder, because it's starting to feel like a stateful pattern. --- .../com/microsoft/azure/http/ClientBase.java | 20 +++ .../azure/http/ClientBuilderBase.java | 19 +++ .../microsoft/azure/http/ClientFactory.java | 5 - ...tory.java => ServiceBusClientBuilder.java} | 9 +- .../serviceBus/ServiceBusClientImpl.java | 128 ++++++++++++++++++ 5 files changed, 172 insertions(+), 9 deletions(-) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientBase.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientBuilderBase.java delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientFactory.java rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ServiceBusClientFactory.java => ServiceBusClientBuilder.java} (65%) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientImpl.java diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientBase.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientBase.java new file mode 100644 index 000000000000..f3432b4d6989 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientBase.java @@ -0,0 +1,20 @@ +package com.microsoft.azure.http; + +import java.net.URI; + +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.WebResource; + +public abstract class ClientBase { + Client client; + URI uri; + + public ClientBase(Client client, URI uri) { + this.client = client; + this.uri = uri; + } + + protected WebResource resource() { + return client.resource(uri); + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientBuilderBase.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientBuilderBase.java new file mode 100644 index 000000000000..8d6d2f882bbd --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientBuilderBase.java @@ -0,0 +1,19 @@ +package com.microsoft.azure.http; + +import java.net.URI; + +import com.sun.jersey.api.client.Client; + +public abstract class ClientBuilderBase { + protected Client client = new Client(); + + URI url; + + public URI getUrl() { + return url; + } + + public void setUrl(URI url) { + this.url = url; + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientFactory.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientFactory.java deleted file mode 100644 index 8dc43770d802..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientFactory.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.microsoft.azure.http; - -public abstract class ClientFactory { - -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientFactory.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientBuilder.java similarity index 65% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientFactory.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientBuilder.java index bfab2908a0a6..34a8a8e07509 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientFactory.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientBuilder.java @@ -1,11 +1,12 @@ package com.microsoft.azure.services.serviceBus; -import com.microsoft.azure.http.ClientFactory; +import com.microsoft.azure.http.ClientBuilderBase; -public class ServiceBusClientFactory extends ClientFactory { + +public class ServiceBusClientBuilder extends ClientBuilderBase { public ServiceBusClient createClient() { - return null; - } + return new ServiceBusClientImpl(this.client, this.getUrl()); + } public MessageTranceiver openQueue(String queuePath) { return null; } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientImpl.java new file mode 100644 index 000000000000..8ab478aa7d43 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientImpl.java @@ -0,0 +1,128 @@ +package com.microsoft.azure.services.serviceBus; + +import java.net.URI; + +import com.microsoft.azure.http.ClientBase; +import com.microsoft.azure.services.serviceBus.model.QueueDescription; +import com.microsoft.azure.services.serviceBus.model.RuleDescription; +import com.microsoft.azure.services.serviceBus.model.SubscriptionDescription; +import com.microsoft.azure.services.serviceBus.model.TopicDescription; +import com.sun.jersey.api.client.Client; + +class ServiceBusClientImpl extends ClientBase implements ServiceBusClient { + + public ServiceBusClientImpl(Client client, URI url) { + super(client, url); + } + + public void sendMessage(String path, BrokeredMessage message) { + // TODO Auto-generated method stub + + } + + public BrokeredMessage receiveMessage(String queuePath, int timeout, + RECEIVE_MODE receiveMode) { + // TODO Auto-generated method stub + return null; + } + + public BrokeredMessage receiveMessage(String topicPath, + String subscriptionName, int timeout, RECEIVE_MODE receiveMode) { + // TODO Auto-generated method stub + return null; + } + + public void abandonMessage(BrokeredMessage message) { + // TODO Auto-generated method stub + + } + + public void completeMessage(BrokeredMessage message) { + // TODO Auto-generated method stub + + } + + public void createQueue(String queuePath, QueueDescription description) { + resource().path(queuePath).put(description); + } + + public void deleteQueue(String queuePath) { + resource().path(queuePath).delete(); + } + + public QueueDescription getQueue(String queuePath) { + // TODO Auto-generated method stub + return null; + } + + public QueueDescription[] getQueues() { + // TODO Auto-generated method stub + return null; + } + + public void createTopic(String topicPath, TopicDescription description) { + // TODO Auto-generated method stub + + } + + public void deleteTopic(String topicPath) { + // TODO Auto-generated method stub + + } + + public TopicDescription getTopic(String topicPath) { + // TODO Auto-generated method stub + return null; + } + + public TopicDescription[] getTopics() { + // TODO Auto-generated method stub + return null; + } + + public void addSubscription(String topicPath, String subscriptionName, + SubscriptionDescription description) { + // TODO Auto-generated method stub + + } + + public void removeSubscription(String topicPath, String subscriptionName) { + // TODO Auto-generated method stub + + } + + public SubscriptionDescription getSubscription(String topicPath, + String subscriptionName) { + // TODO Auto-generated method stub + return null; + } + + public SubscriptionDescription[] getSubscriptions(String topicPath) { + // TODO Auto-generated method stub + return null; + } + + public void addRule(String topicPath, String subscriptionName, + String ruleName, RuleDescription description) { + // TODO Auto-generated method stub + + } + + public void removeRule(String topicPath, String subscriptionName, + String ruleName) { + // TODO Auto-generated method stub + + } + + public RuleDescription getRule(String topicPath, String subscriptionName, + String ruleName) { + // TODO Auto-generated method stub + return null; + } + + public RuleDescription[] getRules(String topicPath, String subscriptionName) { + // TODO Auto-generated method stub + return null; + } + +} From b228b5a14627fe7bd67d066aeac85c4b528e27bb Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Sat, 15 Oct 2011 17:13:35 -0700 Subject: [PATCH 10/59] Reshaping based on current conversations Moving low-level protocol details away from service base namespace Roughing in simple builder pattern and configuration class Adding Client in services.base namespace for o-o api --- microsoft-azure-api/pom.xml | 7 +- .../azure/configuration/Builder.java | 7 ++ .../azure/configuration/Configuration.java | 41 +++++++++++ .../azure/configuration/DefaultBuilder.java | 51 +++++++++++++ .../com/microsoft/azure/http/ClientBase.java | 20 ------ .../azure/http/ClientBuilderBase.java | 19 ----- .../services/serviceBus/MessageReceiver.java | 3 + .../services/serviceBus/MessageSender.java | 2 + .../azure/services/serviceBus/Queue.java | 55 ++++++++++++++ .../azure/services/serviceBus/Rule.java | 5 ++ .../services/serviceBus/ServiceBusClient.java | 71 +++++++++++-------- .../serviceBus/ServiceBusClientBuilder.java | 19 ----- .../services/serviceBus/Subscription.java | 7 ++ .../azure/services/serviceBus/Topic.java | 7 ++ .../serviceBus/contract/BrokeredMessage.java | 5 ++ .../serviceBus/contract/ReceiveMode.java | 6 ++ .../contract/ServiceBusContract.java | 31 ++++++++ .../ServiceBusContractImpl.java} | 22 ++---- .../src/main/resources/package-names.xjb | 2 +- .../serviceBus/ClientBuilderTest.java | 22 ++++++ .../contract/ContractBuilderTest.java | 17 +++++ 21 files changed, 312 insertions(+), 107 deletions(-) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Builder.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/DefaultBuilder.java delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientBase.java delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientBuilderBase.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Rule.java delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientBuilder.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Subscription.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Topic.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokeredMessage.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ReceiveMode.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ServiceBusClientImpl.java => contract/ServiceBusContractImpl.java} (73%) create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ClientBuilderTest.java create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractBuilderTest.java diff --git a/microsoft-azure-api/pom.xml b/microsoft-azure-api/pom.xml index 7d7fb65fb498..fd1fc1424b30 100644 --- a/microsoft-azure-api/pom.xml +++ b/microsoft-azure-api/pom.xml @@ -31,9 +31,10 @@ 1.10-b02 - com.sun.jersey - jersey-atom - 1.10-b02 + junit + junit + 4.8 + test diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Builder.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Builder.java new file mode 100644 index 000000000000..287e9597e655 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Builder.java @@ -0,0 +1,7 @@ +package com.microsoft.azure.configuration; + +public interface Builder { + + public abstract T build(Class c) throws Exception; + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java new file mode 100644 index 000000000000..2048d98401d7 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java @@ -0,0 +1,41 @@ +package com.microsoft.azure.configuration; + +import com.microsoft.azure.services.serviceBus.ServiceBusClient; +import com.microsoft.azure.services.serviceBus.contract.ServiceBusContract; +import com.microsoft.azure.services.serviceBus.contract.ServiceBusContractImpl; +import com.sun.jersey.api.client.Client; + + +public class Configuration implements Builder { + + private Builder builder; + + public Configuration() { + setBuilder(getStandardComponentsBuilder()); + } + + public Configuration(Builder builder) { + setBuilder(builder); + } + + public static Builder getStandardComponentsBuilder() { + DefaultBuilder builder = new DefaultBuilder(); + builder.add(ServiceBusClient.class, ServiceBusClient.class, ServiceBusContract.class); + builder.add(ServiceBusContract.class, ServiceBusContractImpl.class); + builder.add(Client.class, Client.class); + return builder; + } + + public Builder getBuilder() { + return builder; + } + + public void setBuilder(Builder builder) { + this.builder = builder; + } + + public T build(Class c) throws Exception { + return builder.build(c); + } + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/DefaultBuilder.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/DefaultBuilder.java new file mode 100644 index 000000000000..9e7e534bbced --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/DefaultBuilder.java @@ -0,0 +1,51 @@ +package com.microsoft.azure.configuration; + +import java.lang.reflect.Constructor; +import java.util.HashMap; +import java.util.Map; + + +public class DefaultBuilder implements Builder { + public DefaultBuilder() { + factories = new HashMap, Factory>(); + } + + interface Factory { + T create() throws Exception; + } + + Map, Factory> factories; + + public Builder addFactory(Class service, Factory factory) { + factories.put(service, factory); + return this; + } + + public DefaultBuilder add(Class service, final Class implementation) { + addFactory(service, new Factory() { + public T create() throws Exception { + return implementation.newInstance(); + }}); + return this; + } + + public DefaultBuilder add(Class service, final Class implementation, final Class parameterType1) { + addFactory(service, new Factory() { + public T create() throws Exception { + final Constructor ctor = implementation.getConstructor(parameterType1); + return ctor.newInstance(build(parameterType1)); + }}); + return this; + } + + + public DefaultBuilder add(Class service) { + return add(service, service); + } + + + + public T build(Class c) throws Exception { + return (T) factories.get(c).create(); + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientBase.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientBase.java deleted file mode 100644 index f3432b4d6989..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientBase.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.microsoft.azure.http; - -import java.net.URI; - -import com.sun.jersey.api.client.Client; -import com.sun.jersey.api.client.WebResource; - -public abstract class ClientBase { - Client client; - URI uri; - - public ClientBase(Client client, URI uri) { - this.client = client; - this.uri = uri; - } - - protected WebResource resource() { - return client.resource(uri); - } -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientBuilderBase.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientBuilderBase.java deleted file mode 100644 index 8d6d2f882bbd..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/http/ClientBuilderBase.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.microsoft.azure.http; - -import java.net.URI; - -import com.sun.jersey.api.client.Client; - -public abstract class ClientBuilderBase { - protected Client client = new Client(); - - URI url; - - public URI getUrl() { - return url; - } - - public void setUrl(URI url) { - this.url = url; - } -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java index 969742f8b94d..aacc5e67d772 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java @@ -1,5 +1,8 @@ package com.microsoft.azure.services.serviceBus; +import com.microsoft.azure.services.serviceBus.contract.BrokeredMessage; +import com.microsoft.azure.services.serviceBus.contract.ReceiveMode; + public interface MessageReceiver { BrokeredMessage receive(int timeout, ReceiveMode receiveMode); void abandon(BrokeredMessage message); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java index c1144ff5cb11..42626882d121 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java @@ -1,5 +1,7 @@ package com.microsoft.azure.services.serviceBus; +import com.microsoft.azure.services.serviceBus.contract.BrokeredMessage; + public interface MessageSender { void send(BrokeredMessage message); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java new file mode 100644 index 000000000000..0fb9899a0f59 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java @@ -0,0 +1,55 @@ +package com.microsoft.azure.services.serviceBus; + +import com.microsoft.azure.services.serviceBus.contract.BrokeredMessage; +import com.microsoft.azure.services.serviceBus.contract.QueueDescription; +import com.microsoft.azure.services.serviceBus.contract.ReceiveMode; + +public class Queue implements MessageSender, MessageReceiver { + private ServiceBusClient client; + private String path; + private QueueDescription description; + + public Queue(ServiceBusClient client, String path) { + this.client = client; + this.path = path; + } + + public Queue(ServiceBusClient client, QueueDescription queueDescription) { + this.client = client; + + } + + public void create() { + client.getContract().createQueue(path, description); + } + + public void delete() { + client.getContract().deleteQueue(path); + } + + public void commit() { + //TODO protocol operation to put data? + } + + + public void send(BrokeredMessage message) { + // TODO Auto-generated method stub + + } + + public BrokeredMessage receive(int timeout, ReceiveMode receiveMode) { + // TODO Auto-generated method stub + return null; + } + + public void abandon(BrokeredMessage message) { + // TODO Auto-generated method stub + + } + + public void complete(BrokeredMessage message) { + // TODO Auto-generated method stub + + } + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Rule.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Rule.java new file mode 100644 index 000000000000..2ca00d6ed13f --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Rule.java @@ -0,0 +1,5 @@ +package com.microsoft.azure.services.serviceBus; + +public class Rule { + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java index 3bf1a4ed8bd1..0d7200465ce2 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java @@ -1,31 +1,44 @@ package com.microsoft.azure.services.serviceBus; -import com.microsoft.azure.services.serviceBus.model.*; - -public interface ServiceBusClient { - void sendMessage(String path, BrokeredMessage message); - BrokeredMessage receiveMessage(String queuePath, int timeout, ReceiveMode receiveMode); - BrokeredMessage receiveMessage(String topicPath, String subscriptionName, int timeout, ReceiveMode receiveMode); - void abandonMessage(BrokeredMessage message); - void completeMessage(BrokeredMessage message); - - void createQueue(String queuePath, QueueDescription description); - void deleteQueue(String queuePath); - QueueDescription getQueue(String queuePath); - QueueDescription[] getQueues(); - - void createTopic(String topicPath, TopicDescription description); - void deleteTopic(String topicPath); - TopicDescription getTopic(String topicPath); - TopicDescription[] getTopics(); - - void addSubscription(String topicPath, String subscriptionName, SubscriptionDescription description); - void removeSubscription(String topicPath, String subscriptionName); - SubscriptionDescription getSubscription(String topicPath, String subscriptionName); - SubscriptionDescription[] getSubscriptions(String topicPath); - - void addRule(String topicPath, String subscriptionName, String ruleName, RuleDescription description); - void removeRule(String topicPath, String subscriptionName, String ruleName); - RuleDescription getRule(String topicPath, String subscriptionName, String ruleName); - RuleDescription [] getRules(String topicPath, String subscriptionName); -} +import com.microsoft.azure.services.serviceBus.contract.QueueDescription; +import com.microsoft.azure.services.serviceBus.contract.ServiceBusContract; + +public class ServiceBusClient { + + ServiceBusContract contract; + + public ServiceBusClient(ServiceBusContract contract) { + this.contract = contract; + } + + public ServiceBusContract getContract() { + return contract; + } + + public void setContract(ServiceBusContract contract) { + this.contract = contract; + } + + public Queue[] getQueues() { + QueueDescription[] descriptions = contract.getQueues(); + Queue[] queues = new Queue[descriptions.length]; + for (int i = 0; i != queues.length; ++i) { + queues[i] = new Queue(this, descriptions[i]); + } + return queues; + } + + public Queue getQueue(String path) { + return new Queue(this, path); + } + + public Queue createQueue(String path) { + Queue queue = new Queue(this, path); + queue.create(); + return queue; + } + + public Topic[] getTopics() { + return null; + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientBuilder.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientBuilder.java deleted file mode 100644 index 34a8a8e07509..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientBuilder.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.microsoft.azure.services.serviceBus; - -import com.microsoft.azure.http.ClientBuilderBase; - - -public class ServiceBusClientBuilder extends ClientBuilderBase { - public ServiceBusClient createClient() { - return new ServiceBusClientImpl(this.client, this.getUrl()); - } - public MessageTranceiver openQueue(String queuePath) { - return null; - } - public MessageSender openTopic(String topicPath) { - return null; - } - public MessageReceiver openSubscription(String topicPath, String subscriptionName) { - return null; - } -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Subscription.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Subscription.java new file mode 100644 index 000000000000..e06239ff2db6 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Subscription.java @@ -0,0 +1,7 @@ +package com.microsoft.azure.services.serviceBus; + +public class Subscription { + public Rule getRules() { + return null; + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Topic.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Topic.java new file mode 100644 index 000000000000..e54297fdc961 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Topic.java @@ -0,0 +1,7 @@ +package com.microsoft.azure.services.serviceBus; + +public class Topic { + Subscription[] getSubscriptions() { + return null; + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokeredMessage.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokeredMessage.java new file mode 100644 index 000000000000..640583fcc47c --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokeredMessage.java @@ -0,0 +1,5 @@ +package com.microsoft.azure.services.serviceBus.contract; + +public class BrokeredMessage { + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ReceiveMode.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ReceiveMode.java new file mode 100644 index 000000000000..2bcf4f136ebc --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ReceiveMode.java @@ -0,0 +1,6 @@ +package com.microsoft.azure.services.serviceBus.contract; + +public enum ReceiveMode { + PEEK_LOCK, + RECEIVE_AND_DELETE, +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java new file mode 100644 index 000000000000..1f076809003f --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java @@ -0,0 +1,31 @@ +package com.microsoft.azure.services.serviceBus.contract; + + +public interface ServiceBusContract { + void sendMessage(String path, BrokeredMessage message); + BrokeredMessage receiveMessage(String queuePath, int timeout, ReceiveMode receiveMode); + BrokeredMessage receiveMessage(String topicPath, String subscriptionName, int timeout, ReceiveMode receiveMode); + void abandonMessage(BrokeredMessage message); + void completeMessage(BrokeredMessage message); + + void createQueue(String queuePath, QueueDescription description); + void deleteQueue(String queuePath); + QueueDescription getQueue(String queuePath); + QueueDescription[] getQueues(); + + void createTopic(String topicPath, TopicDescription description); + void deleteTopic(String topicPath); + TopicDescription getTopic(String topicPath); + TopicDescription[] getTopics(); + + void addSubscription(String topicPath, String subscriptionName, SubscriptionDescription description); + void removeSubscription(String topicPath, String subscriptionName); + SubscriptionDescription getSubscription(String topicPath, String subscriptionName); + SubscriptionDescription[] getSubscriptions(String topicPath); + + void addRule(String topicPath, String subscriptionName, String ruleName, RuleDescription description); + void removeRule(String topicPath, String subscriptionName, String ruleName); + RuleDescription getRule(String topicPath, String subscriptionName, String ruleName); + RuleDescription [] getRules(String topicPath, String subscriptionName); +} + diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java similarity index 73% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientImpl.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java index 8ab478aa7d43..87bf058fbb8b 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClientImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java @@ -1,19 +1,9 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.contract; -import java.net.URI; - -import com.microsoft.azure.http.ClientBase; -import com.microsoft.azure.services.serviceBus.model.QueueDescription; -import com.microsoft.azure.services.serviceBus.model.RuleDescription; -import com.microsoft.azure.services.serviceBus.model.SubscriptionDescription; -import com.microsoft.azure.services.serviceBus.model.TopicDescription; import com.sun.jersey.api.client.Client; -class ServiceBusClientImpl extends ClientBase implements ServiceBusClient { +public class ServiceBusContractImpl implements ServiceBusContract { - public ServiceBusClientImpl(Client client, URI url) { - super(client, url); - } public void sendMessage(String path, BrokeredMessage message) { // TODO Auto-generated method stub @@ -21,13 +11,13 @@ public void sendMessage(String path, BrokeredMessage message) { } public BrokeredMessage receiveMessage(String queuePath, int timeout, - RECEIVE_MODE receiveMode) { + ReceiveMode receiveMode) { // TODO Auto-generated method stub return null; } public BrokeredMessage receiveMessage(String topicPath, - String subscriptionName, int timeout, RECEIVE_MODE receiveMode) { + String subscriptionName, int timeout, ReceiveMode receiveMode) { // TODO Auto-generated method stub return null; } @@ -43,11 +33,11 @@ public void completeMessage(BrokeredMessage message) { } public void createQueue(String queuePath, QueueDescription description) { - resource().path(queuePath).put(description); + } public void deleteQueue(String queuePath) { - resource().path(queuePath).delete(); + } public QueueDescription getQueue(String queuePath) { diff --git a/microsoft-azure-api/src/main/resources/package-names.xjb b/microsoft-azure-api/src/main/resources/package-names.xjb index 2a71b66ed69a..2186c2e6219e 100644 --- a/microsoft-azure-api/src/main/resources/package-names.xjb +++ b/microsoft-azure-api/src/main/resources/package-names.xjb @@ -4,7 +4,7 @@ jaxb:version="2.0"> - + diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ClientBuilderTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ClientBuilderTest.java new file mode 100644 index 000000000000..d69214594021 --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ClientBuilderTest.java @@ -0,0 +1,22 @@ +package com.microsoft.azure.services.serviceBus; + +import org.junit.Test; + +import static org.junit.Assert.*; + +import com.microsoft.azure.configuration.Configuration; +import com.microsoft.azure.services.serviceBus.contract.ServiceBusContractImpl; + + +public class ClientBuilderTest { + @Test + public void testServiceBusClientCreatedWithContractImpl() throws Exception { + Configuration config = new Configuration(); + + ServiceBusClient client = config.build(ServiceBusClient.class); + + assertNotNull(client); + assertNotNull(client.getContract()); + assertEquals(ServiceBusContractImpl.class, client.getContract().getClass()); + } +} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractBuilderTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractBuilderTest.java new file mode 100644 index 000000000000..91350ba9df71 --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractBuilderTest.java @@ -0,0 +1,17 @@ +package com.microsoft.azure.services.serviceBus.contract; + + +import static org.junit.Assert.*; +import org.junit.Test; + +import com.microsoft.azure.configuration.Configuration; + +public class ContractBuilderTest { + @Test + public void testDefaultBuilderCreatesContractImpl() throws Exception { + Configuration config = new Configuration(); + ServiceBusContract contract = config.build(ServiceBusContract.class); + + assertNotNull(contract); + } +} From 41c5e8ffbbcc0d119bdc549948ffb4608526072a Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 17 Oct 2011 16:40:08 -0700 Subject: [PATCH 11/59] Experimenting with approaches --- microsoft-azure-api/pom.xml | 66 ++++++-- .../azure/configuration/Configuration.java | 62 +++++-- .../azure/configuration/DefaultBuilder.java | 51 ------ .../configuration/{ => builder}/Builder.java | 2 +- .../configuration/builder/BuilderModule.java | 5 + .../builder/BuilderRegistry.java | 10 ++ .../configuration/builder/DefaultBuilder.java | 73 ++++++++ .../azure/services/serviceBus/Entity.java | 56 +++++++ .../{BrokeredMessage.java => Message.java} | 2 +- .../azure/services/serviceBus/Module.java | 10 ++ .../azure/services/serviceBus/Queue.java | 74 +++++++-- .../services/serviceBus/ServiceBusClient.java | 25 ++- .../services/serviceBus/contract/Entry.java | 14 ++ .../serviceBus/contract/EntryModel.java | 34 ++++ .../contract/EntryModelProvider.java | 73 ++++++++ .../services/serviceBus/contract/Module.java | 10 ++ .../contract/ServiceBusContract.java | 24 +-- .../contract/ServiceBusContractImpl.java | 157 +++++++++++++++--- ....azure.configuration.builder.BuilderModule | 2 + .../src/main/resources/NewFile.xml | 27 +++ .../src/main/resources/package-names.xjb | 4 +- ...netservices.2010.10.servicebus.connect.xsd | 18 +- .../serviceBus/ClientBuilderTest.java | 20 +++ .../serviceBus/QueueManagementTest.java | 59 +++++++ .../QueueManagementIntegrationTest.java | 70 ++++++++ 25 files changed, 807 insertions(+), 141 deletions(-) delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/DefaultBuilder.java rename microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/{ => builder}/Builder.java (61%) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/BuilderModule.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/BuilderRegistry.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Entity.java rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{BrokeredMessage.java => Message.java} (63%) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Module.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Entry.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModel.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModelProvider.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Module.java create mode 100644 microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.BuilderModule create mode 100644 microsoft-azure-api/src/main/resources/NewFile.xml create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java diff --git a/microsoft-azure-api/pom.xml b/microsoft-azure-api/pom.xml index fd1fc1424b30..c9728ca34837 100644 --- a/microsoft-azure-api/pom.xml +++ b/microsoft-azure-api/pom.xml @@ -6,6 +6,42 @@ Microsoft Azure Client API API for Microsoft Azure Clients + + + com.sun.jersey + jersey-client + 1.10-b02 + + + javax.xml.bind + jaxb-api + 2.1 + provided + + + junit + junit + 4.8 + test + + + org.mockito + mockito-all + test + 1.9.0-rc1 + + + javax.inject + javax.inject + 1 + + + com.sun.jersey + jersey-atom + 1.10-b03 + + + @@ -20,21 +56,23 @@ + + true + + + org.jvnet.jaxb2_commons + jaxb2-basics + 0.6.0 + + + org.jvnet.jaxb2_commons + jaxb2-basics-annotate + 0.6.0 + + + + - - - - com.sun.jersey - jersey-client - 1.10-b02 - - - junit - junit - 4.8 - test - - diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java index 2048d98401d7..365bd3d0cd80 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java @@ -1,31 +1,73 @@ package com.microsoft.azure.configuration; +import java.util.ServiceLoader; + +import javax.inject.Provider; + +import com.microsoft.azure.configuration.builder.Builder; +import com.microsoft.azure.configuration.builder.BuilderModule; +import com.microsoft.azure.configuration.builder.DefaultBuilder; import com.microsoft.azure.services.serviceBus.ServiceBusClient; +import com.microsoft.azure.services.serviceBus.contract.EntryModelProvider; import com.microsoft.azure.services.serviceBus.contract.ServiceBusContract; -import com.microsoft.azure.services.serviceBus.contract.ServiceBusContractImpl; import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.config.ClientConfig; +import com.sun.jersey.api.client.config.DefaultClientConfig; +import com.sun.jersey.spi.service.ServiceFinder; public class Configuration implements Builder { private Builder builder; + protected ClientConfig clientConfig; public Configuration() { - setBuilder(getStandardComponentsBuilder()); + this.clientConfig = createDefaultClientConfig(); + try { + this.builder = createDefaultBuilder(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } } public Configuration(Builder builder) { - setBuilder(builder); + this.builder = builder; + } + + public static ClientConfig createDefaultClientConfig() { + return new DefaultClientConfig(EntryModelProvider.class); } - public static Builder getStandardComponentsBuilder() { - DefaultBuilder builder = new DefaultBuilder(); - builder.add(ServiceBusClient.class, ServiceBusClient.class, ServiceBusContract.class); - builder.add(ServiceBusContract.class, ServiceBusContractImpl.class); - builder.add(Client.class, Client.class); + Builder createDefaultBuilder() throws Exception { + + final DefaultBuilder builder = new DefaultBuilder(); + + for(BuilderModule module : ServiceLoader.load(BuilderModule.class)){ + module.register(builder); + } + + final Configuration self = this; + + builder.add(ClientConfig.class, new Provider(){ + public ClientConfig get() { + return self.clientConfig; + }}); + + builder.add(Client.class, new Provider(){ + public Client get() { + ClientConfig clientConfig = builder.build(ClientConfig.class); + return Client.create(clientConfig); + }}); + return builder; } + + public T build(Class c) throws Exception { + return builder.build(c); + } + public Builder getBuilder() { return builder; } @@ -33,9 +75,5 @@ public Builder getBuilder() { public void setBuilder(Builder builder) { this.builder = builder; } - - public T build(Class c) throws Exception { - return builder.build(c); - } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/DefaultBuilder.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/DefaultBuilder.java deleted file mode 100644 index 9e7e534bbced..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/DefaultBuilder.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.microsoft.azure.configuration; - -import java.lang.reflect.Constructor; -import java.util.HashMap; -import java.util.Map; - - -public class DefaultBuilder implements Builder { - public DefaultBuilder() { - factories = new HashMap, Factory>(); - } - - interface Factory { - T create() throws Exception; - } - - Map, Factory> factories; - - public Builder addFactory(Class service, Factory factory) { - factories.put(service, factory); - return this; - } - - public DefaultBuilder add(Class service, final Class implementation) { - addFactory(service, new Factory() { - public T create() throws Exception { - return implementation.newInstance(); - }}); - return this; - } - - public DefaultBuilder add(Class service, final Class implementation, final Class parameterType1) { - addFactory(service, new Factory() { - public T create() throws Exception { - final Constructor ctor = implementation.getConstructor(parameterType1); - return ctor.newInstance(build(parameterType1)); - }}); - return this; - } - - - public DefaultBuilder add(Class service) { - return add(service, service); - } - - - - public T build(Class c) throws Exception { - return (T) factories.get(c).create(); - } -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Builder.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java similarity index 61% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Builder.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java index 287e9597e655..41089abba818 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Builder.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.configuration; +package com.microsoft.azure.configuration.builder; public interface Builder { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/BuilderModule.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/BuilderModule.java new file mode 100644 index 000000000000..5a2f741a8608 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/BuilderModule.java @@ -0,0 +1,5 @@ +package com.microsoft.azure.configuration.builder; + +public interface BuilderModule { + void register(BuilderRegistry registry); +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/BuilderRegistry.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/BuilderRegistry.java new file mode 100644 index 000000000000..96f9a6713f42 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/BuilderRegistry.java @@ -0,0 +1,10 @@ +package com.microsoft.azure.configuration.builder; + +import javax.inject.Provider; + + +public interface BuilderRegistry { + BuilderRegistry add(Class service); + BuilderRegistry add(Class service, Class implementation); + BuilderRegistry add(Class service, Provider provider); +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java new file mode 100644 index 000000000000..01e1f03b5de6 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java @@ -0,0 +1,73 @@ +package com.microsoft.azure.configuration.builder; + +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.HashMap; +import java.util.Map; + +import javax.inject.Inject; +import javax.inject.Provider; + + +public class DefaultBuilder implements Builder, BuilderRegistry { + public DefaultBuilder() { + factories = new HashMap, Provider>(); + } + + + Map, Provider> factories; + + public Builder addFactory(Class service, Provider factory) { + factories.put(service, factory); + return this; + } + + + public BuilderRegistry add(Class service, final Class implementation) { + Constructor[] ctors = implementation.getConstructors(); + for(final Constructor ctor : ctors) { + if (ctor.getAnnotation(Inject.class) != null) { + final Class[] parameterTypes = ctor.getParameterTypes(); + addFactory(service, new Provider() { + @SuppressWarnings("unchecked") + public T get() throws RuntimeException { + Object[] initargs = new Object[parameterTypes.length]; + for(int i = 0; i != parameterTypes.length; ++i) { + initargs[i] = build(parameterTypes[i]); + } + + try { + return (T) ctor.newInstance(initargs); + } catch (InvocationTargetException e) { + throw new RuntimeException(e); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + }}); + } + } + return this; + } + + public BuilderRegistry add(Class service) { + return add(service, service); + } + + public BuilderRegistry add(Class service, Provider provider) { + addFactory(service, provider); + return this; + } + + public T build(Class c) throws RuntimeException { + @SuppressWarnings("unchecked") + Provider factory = (Provider) factories.get(c); + if (factory == null) { + return null; + } + return factory.get(); + } + + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Entity.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Entity.java new file mode 100644 index 000000000000..768791e63615 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Entity.java @@ -0,0 +1,56 @@ +package com.microsoft.azure.services.serviceBus; + +import com.microsoft.azure.services.serviceBus.contract.EntryModel; +import com.microsoft.azure.services.serviceBus.contract.QueueDescription; +import com.microsoft.azure.services.serviceBus.contract.ServiceBusContract; +import com.sun.syndication.feed.atom.Entry; + +public class Entity { + + protected ServiceBusClient client; + private EntryModel entryModel; + + public Entity(ServiceBusClient client) { + this.client = client; + this.entryModel = new EntryModel(); + setEntry(new Entry()); + } + + public Entity(ServiceBusClient client, EntryModel entryModel) { + this.client = client; + this.entryModel = entryModel; + } + + protected ServiceBusClient getClient() { + return client; + } + + protected ServiceBusContract getContract() { + return getClient().getContract(); + } + + protected EntryModel getEntryModel() { + return entryModel; + } + + protected void setEntryModel(EntryModel entryModel) { + this.entryModel = entryModel; + } + + protected Entry getEntry() { + return getEntryModel().getEntry(); + } + + protected void setEntry(Entry entry) { + getEntryModel().setEntry(entry); + } + + protected T getModel() { + return getEntryModel().getModel(); + } + + protected void setModel(T model) { + getEntryModel().setModel(model); + } + +} \ No newline at end of file diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokeredMessage.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java similarity index 63% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokeredMessage.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java index 29dea80dd690..1b9df243130f 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokeredMessage.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java @@ -1,5 +1,5 @@ package com.microsoft.azure.services.serviceBus; -public class BrokeredMessage { +public class Message { } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Module.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Module.java new file mode 100644 index 000000000000..d9d859efa83c --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Module.java @@ -0,0 +1,10 @@ +package com.microsoft.azure.services.serviceBus; + +import com.microsoft.azure.configuration.builder.BuilderModule; +import com.microsoft.azure.configuration.builder.BuilderRegistry; + +public class Module implements BuilderModule { + public void register(BuilderRegistry registry) { + registry.add(ServiceBusClient.class); + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java index 0fb9899a0f59..ddb627c0bdad 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java @@ -1,37 +1,41 @@ package com.microsoft.azure.services.serviceBus; +import javax.xml.datatype.Duration; + import com.microsoft.azure.services.serviceBus.contract.BrokeredMessage; +import com.microsoft.azure.services.serviceBus.contract.EntryModel; import com.microsoft.azure.services.serviceBus.contract.QueueDescription; import com.microsoft.azure.services.serviceBus.contract.ReceiveMode; +import com.sun.syndication.feed.atom.Entry; -public class Queue implements MessageSender, MessageReceiver { - private ServiceBusClient client; - private String path; - private QueueDescription description; - +public class Queue extends Entity implements MessageSender, MessageReceiver { public Queue(ServiceBusClient client, String path) { - this.client = client; - this.path = path; - } - - public Queue(ServiceBusClient client, QueueDescription queueDescription) { - this.client = client; + super(client); + setModel(new QueueDescription()); + setPath(path); } + + + // public object verbs + public void create() { - client.getContract().createQueue(path, description); + getContract().createQueue(getEntryModel()); } public void delete() { - client.getContract().deleteQueue(path); + getContract().deleteQueue(getPath()); + } + + public void get() { + setEntryModel(getContract().getQueue(getPath())); } public void commit() { - //TODO protocol operation to put data? + getContract().createQueue(getEntryModel()); } - public void send(BrokeredMessage message) { // TODO Auto-generated method stub @@ -49,7 +53,45 @@ public void abandon(BrokeredMessage message) { public void complete(BrokeredMessage message) { // TODO Auto-generated method stub - } + + + + // public object data + + public String getPath() { + return getEntry().getTitle(); + } + + public void setPath(String value) { + getEntry().setTitle(value); + } + + public Duration getLockDuration() { + return getModel().getLockDuration(); + } + + public void setLockDuration(Duration value) { + getModel().setLockDuration(value); + } + + public Long getMaxSizeInMegabytes() { + return getModel().getMaxSizeInMegabytes(); + } + + public void setMaxSizeInMegabytes(Long value) { + getModel().setMaxSizeInMegabytes(value); + } + + public Long getMessageCount() { + return getModel().getMessageCount(); + } + + + + //public void setMessageCount(Long value) { + // getDescription().setMessageCount(value); + //} + } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java index 0d7200465ce2..ed863f42267a 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java @@ -1,5 +1,9 @@ package com.microsoft.azure.services.serviceBus; +import javax.inject.Inject; + +import com.microsoft.azure.configuration.Configuration; +import com.microsoft.azure.services.serviceBus.contract.EntryModel; import com.microsoft.azure.services.serviceBus.contract.QueueDescription; import com.microsoft.azure.services.serviceBus.contract.ServiceBusContract; @@ -7,6 +11,14 @@ public class ServiceBusClient { ServiceBusContract contract; + public ServiceBusClient() { + } + + public ServiceBusClient(Configuration configuration) throws Exception { + this.contract = configuration.build(ServiceBusContract.class); + } + + @Inject public ServiceBusClient(ServiceBusContract contract) { this.contract = contract; } @@ -19,17 +31,20 @@ public void setContract(ServiceBusContract contract) { this.contract = contract; } - public Queue[] getQueues() { - QueueDescription[] descriptions = contract.getQueues(); - Queue[] queues = new Queue[descriptions.length]; + public Entity[] getQueues() { + EntryModel[] descriptions = contract.getQueues(); + Entity[] queues = new Entity[descriptions.length]; for (int i = 0; i != queues.length; ++i) { - queues[i] = new Queue(this, descriptions[i]); + queues[i] = new Queue(this, null); + queues[i].setEntryModel(descriptions[i]); } return queues; } public Queue getQueue(String path) { - return new Queue(this, path); + Queue queue = new Queue(this, path); + queue.setEntryModel(contract.getQueue(path)); + return queue; } public Queue createQueue(String path) { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Entry.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Entry.java new file mode 100644 index 000000000000..aa4ef56df798 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Entry.java @@ -0,0 +1,14 @@ +package com.microsoft.azure.services.serviceBus.contract; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlType; + +@XmlAccessorType(XmlAccessType.FIELD) +@XmlType(name = "RuleDescription", propOrder = { + "filter", + "action" +}) +public class Entry { + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModel.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModel.java new file mode 100644 index 000000000000..112db52f2a5d --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModel.java @@ -0,0 +1,34 @@ +package com.microsoft.azure.services.serviceBus.contract; + +import com.sun.syndication.feed.atom.Entry; + +public class EntryModel { + Entry entry; + T model; + + public EntryModel(){ + + } + + public EntryModel(Entry entry, T model) { + setEntry(entry); + setModel(model); + } + + public Entry getEntry() { + return entry; + } + + public void setEntry(Entry entry) { + this.entry = entry; + } + + public T getModel() { + return model; + } + + public void setModel(T model) { + this.model = model; + } +} + diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModelProvider.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModelProvider.java new file mode 100644 index 000000000000..5a992151aeeb --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModelProvider.java @@ -0,0 +1,73 @@ +package com.microsoft.azure.services.serviceBus.contract; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; + +import javax.ws.rs.Consumes; +import javax.ws.rs.Produces; +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.ext.MessageBodyReader; +import javax.ws.rs.ext.Providers; + +import com.sun.jersey.core.impl.provider.entity.StringProvider; +import com.sun.jersey.core.provider.AbstractMessageReaderWriterProvider; +import com.sun.syndication.feed.atom.Content; +import com.sun.syndication.feed.atom.Entry; + +@Produces("application/atom+xml") +@Consumes("application/atom+xml") +public class EntryModelProvider extends AbstractMessageReaderWriterProvider> { + private Providers ps; + + public EntryModelProvider(@Context Providers ps){ + this.ps = ps; + } + + public boolean isReadable(Class type, Type genericType, + Annotation[] annotations, MediaType mediaType) { + // TODO Auto-generated method stub + + return type == EntryModel.class; + } + + public EntryModel readFrom(Class> type, Type genericType, + Annotation[] annotations, MediaType mediaType, + MultivaluedMap httpHeaders, InputStream entityStream) + throws IOException, WebApplicationException { + + MessageBodyReader reader = ps.getMessageBodyReader(Entry.class, Entry.class, annotations, mediaType); + Entry entry = reader.readFrom(Entry.class, Entry.class, annotations, mediaType, httpHeaders, entityStream); + + if (entry.getContents().size() == 1) { + Content content = (Content)entry.getContents().get(0); + MediaType entryType = MediaType.valueOf(content.getType()); + MessageBodyReader reader2 = ps.getMessageBodyReader(QueueDescription.class, QueueDescription.class, annotations, entryType); + String data = content.getValue(); + QueueDescription model = reader2.readFrom(QueueDescription.class, QueueDescription.class, annotations, entryType, httpHeaders, new ByteArrayInputStream(data.getBytes())); + return new EntryModel(entry, model); + } + return new EntryModel(entry, null); + } + + public boolean isWriteable(Class type, Type genericType, + Annotation[] annotations, MediaType mediaType) { + // TODO Auto-generated method stub + return false; + } + + public void writeTo(EntryModel t, Class type, Type genericType, + Annotation[] annotations, MediaType mediaType, + MultivaluedMap httpHeaders, + OutputStream entityStream) throws IOException, + WebApplicationException { + // TODO Auto-generated method stub + + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Module.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Module.java new file mode 100644 index 000000000000..32575221f20c --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Module.java @@ -0,0 +1,10 @@ +package com.microsoft.azure.services.serviceBus.contract; + +import com.microsoft.azure.configuration.builder.BuilderModule; +import com.microsoft.azure.configuration.builder.BuilderRegistry; + +public class Module implements BuilderModule { + public void register(BuilderRegistry registry) { + registry.add(ServiceBusContract.class, ServiceBusContractImpl.class); + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java index 1f076809003f..23d807bdf0c5 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java @@ -8,24 +8,24 @@ public interface ServiceBusContract { void abandonMessage(BrokeredMessage message); void completeMessage(BrokeredMessage message); - void createQueue(String queuePath, QueueDescription description); + void createQueue(EntryModel queue); void deleteQueue(String queuePath); - QueueDescription getQueue(String queuePath); - QueueDescription[] getQueues(); + EntryModel getQueue(String queuePath); + EntryModel[] getQueues(); - void createTopic(String topicPath, TopicDescription description); + void createTopic(EntryModel topic); void deleteTopic(String topicPath); - TopicDescription getTopic(String topicPath); - TopicDescription[] getTopics(); + EntryModel getTopic(String topicPath); + EntryModel[] getTopics(); - void addSubscription(String topicPath, String subscriptionName, SubscriptionDescription description); + void addSubscription(String topicPath, String subscriptionName, EntryModel subscription); void removeSubscription(String topicPath, String subscriptionName); - SubscriptionDescription getSubscription(String topicPath, String subscriptionName); - SubscriptionDescription[] getSubscriptions(String topicPath); + EntryModel getSubscription(String topicPath, String subscriptionName); + EntryModel[] getSubscriptions(String topicPath); - void addRule(String topicPath, String subscriptionName, String ruleName, RuleDescription description); + void addRule(String topicPath, String subscriptionName, String ruleName, EntryModel rule); void removeRule(String topicPath, String subscriptionName, String ruleName); - RuleDescription getRule(String topicPath, String subscriptionName, String ruleName); - RuleDescription [] getRules(String topicPath, String subscriptionName); + EntryModel getRule(String topicPath, String subscriptionName, String ruleName); + EntryModel [] getRules(String topicPath, String subscriptionName); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java index 87bf058fbb8b..15f8228d170a 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java @@ -1,9 +1,50 @@ package com.microsoft.azure.services.serviceBus.contract; +import javax.inject.Inject; +import javax.xml.bind.JAXBElement; +import javax.xml.namespace.QName; + import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.ClientHandlerException; +import com.sun.jersey.api.client.ClientRequest; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.GenericType; +import com.sun.jersey.api.client.filter.ClientFilter; +import com.sun.jersey.api.representation.Form; +import com.sun.syndication.feed.atom.Entry; public class ServiceBusContractImpl implements ServiceBusContract { + public class AtomFilter extends ClientFilter { + + @Override + public ClientResponse handle(ClientRequest cr) + throws ClientHandlerException { + + return getNext().handle(cr); + } + + } + + private Client channel; + + @Inject + public ServiceBusContractImpl(Client channel) { + channel.addFilter(new AtomFilter()); + this.setChannel(channel); + } + + + public Client getChannel() { + return channel; + } + + + + public void setChannel(Client channel) { + this.channel = channel; + } + public void sendMessage(String path, BrokeredMessage message) { // TODO Auto-generated method stub @@ -32,23 +73,48 @@ public void completeMessage(BrokeredMessage message) { } - public void createQueue(String queuePath, QueueDescription description) { + public void createQueue(EntryModel entryModel) { + Form form = new Form(); + form.add("wrap_name", "owner"); + form.add("wrap_password", "Zo3QCZ5jLlJofibEiifZyz7B3x6a5Suv2YoS1JAWopA="); + form.add("wrap_scope", "http://lodejard.servicebus.windows.net/"); + + Form wrapResponse = getChannel().resource("https://lodejard-sb.accesscontrol.windows.net/") + .path("WRAPv0.9") + .post(Form.class, form); + String accessToken = wrapResponse.get("wrap_access_token").get(0); + Entry entry = new Entry(); + getChannel().resource("https://lodejard.servicebus.windows.net/") + .path(entryModel.getEntry().getTitle()) + .header("Authorization", "WRAP access_token=\"" + accessToken + "\"") + .type("application/atom+xml") + .put(entry); } public void deleteQueue(String queuePath) { } - public QueueDescription getQueue(String queuePath) { - // TODO Auto-generated method stub - return null; + public EntryModel getQueue(String queuePath) { + Form form = new Form(); + form.add("wrap_name", "owner"); + form.add("wrap_password", "Zo3QCZ5jLlJofibEiifZyz7B3x6a5Suv2YoS1JAWopA="); + form.add("wrap_scope", "http://lodejard.servicebus.windows.net/"); + + Form wrapResponse = getChannel().resource("https://lodejard-sb.accesscontrol.windows.net/") + .path("WRAPv0.9") + .post(Form.class, form); + String accessToken = wrapResponse.get("wrap_access_token").get(0); + + GenericType> genericType = new GenericType>() { }; + + return getChannel().resource("https://lodejard.servicebus.windows.net/") + .path(queuePath) + .header("Authorization", "WRAP access_token=\"" + accessToken + "\"") + .get(genericType); } - public QueueDescription[] getQueues() { - // TODO Auto-generated method stub - return null; - } public void createTopic(String topicPath, TopicDescription description) { // TODO Auto-generated method stub @@ -60,57 +126,96 @@ public void deleteTopic(String topicPath) { } - public TopicDescription getTopic(String topicPath) { + + public void addSubscription(String topicPath, String subscriptionName, + SubscriptionDescription description) { // TODO Auto-generated method stub - return null; + } - public TopicDescription[] getTopics() { + public void removeSubscription(String topicPath, String subscriptionName) { // TODO Auto-generated method stub - return null; + } - public void addSubscription(String topicPath, String subscriptionName, - SubscriptionDescription description) { + + public void addRule(String topicPath, String subscriptionName, + String ruleName, RuleDescription description) { // TODO Auto-generated method stub } - public void removeSubscription(String topicPath, String subscriptionName) { + public void removeRule(String topicPath, String subscriptionName, + String ruleName) { // TODO Auto-generated method stub } - public SubscriptionDescription getSubscription(String topicPath, - String subscriptionName) { + + + + + public void createTopic(EntryModel topic) { // TODO Auto-generated method stub - return null; + } - public SubscriptionDescription[] getSubscriptions(String topicPath) { + + public void addSubscription(String topicPath, String subscriptionName, + EntryModel subscription) { // TODO Auto-generated method stub - return null; + } + public void addRule(String topicPath, String subscriptionName, - String ruleName, RuleDescription description) { + String ruleName, EntryModel rule) { // TODO Auto-generated method stub + + } + + public EntryModel[] getQueues() { + // TODO Auto-generated method stub + return null; } - public void removeRule(String topicPath, String subscriptionName, - String ruleName) { + + public EntryModel getTopic(String topicPath) { // TODO Auto-generated method stub + return null; + } + + public EntryModel[] getTopics() { + // TODO Auto-generated method stub + return null; } - public RuleDescription getRule(String topicPath, String subscriptionName, - String ruleName) { + + public EntryModel getSubscription( + String topicPath, String subscriptionName) { // TODO Auto-generated method stub return null; } - public RuleDescription[] getRules(String topicPath, String subscriptionName) { + + public EntryModel[] getSubscriptions( + String topicPath) { + // TODO Auto-generated method stub + return null; + } + + + public EntryModel getRule(String topicPath, + String subscriptionName, String ruleName) { + // TODO Auto-generated method stub + return null; + } + + + public EntryModel[] getRules(String topicPath, + String subscriptionName) { // TODO Auto-generated method stub return null; } diff --git a/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.BuilderModule b/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.BuilderModule new file mode 100644 index 000000000000..28dbf44a5c9c --- /dev/null +++ b/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.BuilderModule @@ -0,0 +1,2 @@ +com.microsoft.azure.services.serviceBus.Module +com.microsoft.azure.services.serviceBus.contract.Module diff --git a/microsoft-azure-api/src/main/resources/NewFile.xml b/microsoft-azure-api/src/main/resources/NewFile.xml new file mode 100644 index 000000000000..3e6ab48c0113 --- /dev/null +++ b/microsoft-azure-api/src/main/resources/NewFile.xml @@ -0,0 +1,27 @@ + + https://lodejard.servicebus.windows.net/Hello + Hello + 2011-10-04T23:09:57Z + 2011-10-04T23:09:57Z + + lodejard + + + + + PT1M + 1024 + false + false + P10675199DT2H48M5S + false + PT10M + 10 + true + 0 + 0 + + + diff --git a/microsoft-azure-api/src/main/resources/package-names.xjb b/microsoft-azure-api/src/main/resources/package-names.xjb index 2186c2e6219e..15083b0bf49a 100644 --- a/microsoft-azure-api/src/main/resources/package-names.xjb +++ b/microsoft-azure-api/src/main/resources/package-names.xjb @@ -1,7 +1,9 @@ + xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" + jaxb:version="2.0" + jaxb:extensionBindingPrefixes="xjc"> diff --git a/microsoft-azure-api/src/main/resources/schemas.microsoft.com.netservices.2010.10.servicebus.connect.xsd b/microsoft-azure-api/src/main/resources/schemas.microsoft.com.netservices.2010.10.servicebus.connect.xsd index 825aaf965fb3..eb30b07d7f80 100644 --- a/microsoft-azure-api/src/main/resources/schemas.microsoft.com.netservices.2010.10.servicebus.connect.xsd +++ b/microsoft-azure-api/src/main/resources/schemas.microsoft.com.netservices.2010.10.servicebus.connect.xsd @@ -4,7 +4,21 @@ xmlns:tns="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect" elementFormDefault="qualified" targetNamespace="http://schemas.microsoft.com/netservices/2010/10/servicebus/connect" - xmlns:xs="http://www.w3.org/2001/XMLSchema"> + xmlns:xs="http://www.w3.org/2001/XMLSchema" + + xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" + jaxb:version="1.0" + xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" + jaxb:extensionBindingPrefixes="xjc"> + + + + + + + + + @@ -14,7 +28,7 @@ - + diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ClientBuilderTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ClientBuilderTest.java index d69214594021..7f146e446937 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ClientBuilderTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ClientBuilderTest.java @@ -1,5 +1,10 @@ package com.microsoft.azure.services.serviceBus; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; + import org.junit.Test; import static org.junit.Assert.*; @@ -11,12 +16,27 @@ public class ClientBuilderTest { @Test public void testServiceBusClientCreatedWithContractImpl() throws Exception { + // Arrange Configuration config = new Configuration(); + // Act ServiceBusClient client = config.build(ServiceBusClient.class); + ServiceBusClient client2 = new ServiceBusClient(config); + // Assert assertNotNull(client); assertNotNull(client.getContract()); assertEquals(ServiceBusContractImpl.class, client.getContract().getClass()); + + assertNotNull(client2); + assertNotNull(client2.getContract()); + assertEquals(ServiceBusContractImpl.class, client2.getContract().getClass()); + } + + @Test + public void testHttp404() throws Exception { + HttpURLConnection x = (HttpURLConnection)new URL("http://github.com/no-such-file").openConnection(); + int code = x.getResponseCode(); + assertEquals(404, code); } } diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java new file mode 100644 index 000000000000..77ef04de8bfb --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java @@ -0,0 +1,59 @@ +package com.microsoft.azure.services.serviceBus; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +import javax.xml.datatype.DatatypeConfigurationException; +import javax.xml.datatype.DatatypeFactory; + +import org.junit.Test; +import org.mockito.ArgumentCaptor; + +import com.microsoft.azure.services.serviceBus.contract.EntryModel; +import com.microsoft.azure.services.serviceBus.contract.QueueDescription; +import com.microsoft.azure.services.serviceBus.contract.ServiceBusContract; +import com.sun.syndication.feed.atom.Entry; + + +public class QueueManagementTest { + @Test + public void testGetQueueAcquiresDescriptionFromServer() { + // Arrange + ServiceBusContract contract = mock(ServiceBusContract.class); + + EntryModel entryModel = new EntryModel(new Entry(), new QueueDescription()); + when(contract.getQueue("Hello")).thenReturn(entryModel); + + entryModel.getModel().setMessageCount(73L); + + // Act + ServiceBusClient client = new ServiceBusClient(contract); + Queue helloQueue = client.getQueue("Hello"); + + // Assert + assertEquals(73, helloQueue.getMessageCount().longValue()); + } + + @Test + public void queueCreateSendsCreateQueueDescriptionMessage() throws DatatypeConfigurationException { + // Arrange + ServiceBusContract contract = mock(ServiceBusContract.class); + + // Act + ServiceBusClient client = new ServiceBusClient(contract); + Queue helloQueue = new Queue(client, "MyNewQueue"); + helloQueue.setLockDuration(DatatypeFactory.newInstance().newDuration(60 * 1000L)); + helloQueue.setMaxSizeInMegabytes(42L); + helloQueue.commit(); + + // Assert + ArgumentCaptor createArg = ArgumentCaptor.forClass(EntryModel.class); + verify(contract).createQueue(createArg.capture()); + Entry entry = createArg.getValue().getEntry(); + QueueDescription model = (QueueDescription) createArg.getValue().getModel(); + + assertEquals("MyNewQueue", entry.getTitle()); + assertEquals(DatatypeFactory.newInstance().newDuration(60 * 1000L), model.getLockDuration()); + assertEquals(42, model.getMaxSizeInMegabytes().longValue()); + } +} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java new file mode 100644 index 000000000000..5ab52d28e9b2 --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java @@ -0,0 +1,70 @@ +package com.microsoft.azure.services.serviceBus.contract; + +import junit.framework.Assert; + +import org.junit.Test; + +import com.microsoft.azure.configuration.Configuration; +import com.microsoft.azure.services.serviceBus.Entity; +import com.microsoft.azure.services.serviceBus.Queue; +import com.microsoft.azure.services.serviceBus.ServiceBusClient; +import com.microsoft.azure.services.serviceBus.contract.ServiceBusContractImpl; +import com.sun.jersey.api.client.filter.LoggingFilter; + + + +public class QueueManagementIntegrationTest { + @Test + public void queueCanBeCreatedAndDeleted() throws Exception { + // Arrange + ServiceBusClient client = new Configuration() + .build(ServiceBusClient.class); + ServiceBusContractImpl contract = (ServiceBusContractImpl) client.getContract(); + contract.getChannel().addFilter(new LoggingFilter()); + + // Act + Queue queue = client.createQueue("TestQueue01"); + queue.delete(); + + // Assert + } + + @Test + public void notFoundQueuePathReturnsNull() throws Exception { + // Arrange + Configuration cfg = new Configuration(); + + ServiceBusClient client = cfg.build(ServiceBusClient.class); + + + ServiceBusContractImpl contract = (ServiceBusContractImpl) client.getContract(); + contract.getChannel().addFilter(new LoggingFilter()); + + // Act + Queue queue = client.getQueue("NoSuchQueueName"); + + // Assert + Assert.assertNull(queue); + } + + + @Test + public void existingQueuePathDoesNotReturnNull() throws Exception { + // Arrange + ServiceBusClient client = new Configuration() + .build(ServiceBusClient.class); + + ServiceBusContractImpl contract = (ServiceBusContractImpl) client.getContract(); + contract.getChannel().addFilter(new LoggingFilter()); + //contract.getChannel().getProviders(). + + //client.createQueue("TestQueue02"); + + // Act + Queue queue = client.getQueue("Hello"); + + // Assert + Assert.assertNotNull(queue); + Assert.assertEquals("TestQueue02", queue.getPath()); + } +} From 87b3226d570d9c47c742a708abfb1468fcf2d385 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 17 Oct 2011 16:59:16 -0700 Subject: [PATCH 12/59] Refactoring a little to cleanup --- .../azure/configuration/Configuration.java | 8 ++--- .../azure/configuration/builder/Builder.java | 11 ++++++ .../configuration/builder/BuilderModule.java | 5 --- .../builder/BuilderRegistry.java | 10 ------ .../configuration/builder/DefaultBuilder.java | 8 ++--- .../azure/services/serviceBus/Exports.java | 9 +++++ .../services/serviceBus/MessageReceiver.java | 9 +++-- .../services/serviceBus/MessageSender.java | 3 +- .../azure/services/serviceBus/Module.java | 10 ------ .../azure/services/serviceBus/Queue.java | 35 ++++++++++++------- .../services/serviceBus/ServiceBusClient.java | 4 +-- .../services/serviceBus/contract/Exports.java | 9 +++++ .../services/serviceBus/contract/Module.java | 10 ------ ...zure.configuration.builder.Builder$Exports | 2 ++ ....azure.configuration.builder.BuilderModule | 2 -- 15 files changed, 66 insertions(+), 69 deletions(-) delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/BuilderModule.java delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/BuilderRegistry.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Module.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Exports.java delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Module.java create mode 100644 microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports delete mode 100644 microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.BuilderModule diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java index 365bd3d0cd80..368f12721282 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java @@ -5,15 +5,11 @@ import javax.inject.Provider; import com.microsoft.azure.configuration.builder.Builder; -import com.microsoft.azure.configuration.builder.BuilderModule; import com.microsoft.azure.configuration.builder.DefaultBuilder; -import com.microsoft.azure.services.serviceBus.ServiceBusClient; import com.microsoft.azure.services.serviceBus.contract.EntryModelProvider; -import com.microsoft.azure.services.serviceBus.contract.ServiceBusContract; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; -import com.sun.jersey.spi.service.ServiceFinder; public class Configuration implements Builder { @@ -43,8 +39,8 @@ Builder createDefaultBuilder() throws Exception { final DefaultBuilder builder = new DefaultBuilder(); - for(BuilderModule module : ServiceLoader.load(BuilderModule.class)){ - module.register(builder); + for(Builder.Exports exports : ServiceLoader.load(Builder.Exports.class)){ + exports.register(builder); } final Configuration self = this; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java index 41089abba818..57719866f203 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java @@ -1,7 +1,18 @@ package com.microsoft.azure.configuration.builder; +import javax.inject.Provider; + public interface Builder { public abstract T build(Class c) throws Exception; + public interface Exports { + void register(Registry registry); + } + + public interface Registry { + Registry add(Class service); + Registry add(Class service, Class implementation); + Registry add(Class service, Provider provider); + } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/BuilderModule.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/BuilderModule.java deleted file mode 100644 index 5a2f741a8608..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/BuilderModule.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.microsoft.azure.configuration.builder; - -public interface BuilderModule { - void register(BuilderRegistry registry); -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/BuilderRegistry.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/BuilderRegistry.java deleted file mode 100644 index 96f9a6713f42..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/BuilderRegistry.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.microsoft.azure.configuration.builder; - -import javax.inject.Provider; - - -public interface BuilderRegistry { - BuilderRegistry add(Class service); - BuilderRegistry add(Class service, Class implementation); - BuilderRegistry add(Class service, Provider provider); -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java index 01e1f03b5de6..990413155667 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java @@ -9,7 +9,7 @@ import javax.inject.Provider; -public class DefaultBuilder implements Builder, BuilderRegistry { +public class DefaultBuilder implements Builder, Builder.Registry { public DefaultBuilder() { factories = new HashMap, Provider>(); } @@ -23,7 +23,7 @@ public Builder addFactory(Class service, Provider factory) { } - public BuilderRegistry add(Class service, final Class implementation) { + public Builder.Registry add(Class service, final Class implementation) { Constructor[] ctors = implementation.getConstructors(); for(final Constructor ctor : ctors) { if (ctor.getAnnotation(Inject.class) != null) { @@ -51,11 +51,11 @@ public T get() throws RuntimeException { return this; } - public BuilderRegistry add(Class service) { + public Builder.Registry add(Class service) { return add(service, service); } - public BuilderRegistry add(Class service, Provider provider) { + public Builder.Registry add(Class service, Provider provider) { addFactory(service, provider); return this; } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java new file mode 100644 index 000000000000..5af49c37c86c --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java @@ -0,0 +1,9 @@ +package com.microsoft.azure.services.serviceBus; + +import com.microsoft.azure.configuration.builder.Builder; + +public class Exports implements Builder.Exports { + public void register(Builder.Registry registry) { + registry.add(ServiceBusClient.class); + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java index aacc5e67d772..fd8153e2113f 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java @@ -1,10 +1,9 @@ package com.microsoft.azure.services.serviceBus; -import com.microsoft.azure.services.serviceBus.contract.BrokeredMessage; -import com.microsoft.azure.services.serviceBus.contract.ReceiveMode; public interface MessageReceiver { - BrokeredMessage receive(int timeout, ReceiveMode receiveMode); - void abandon(BrokeredMessage message); - void complete(BrokeredMessage message); + Message receive(int timeout); + Message peekLock(int timeout); + void abandon(Message message); + void complete(Message message); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java index 42626882d121..d0ae248bb08d 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java @@ -1,7 +1,6 @@ package com.microsoft.azure.services.serviceBus; -import com.microsoft.azure.services.serviceBus.contract.BrokeredMessage; public interface MessageSender { - void send(BrokeredMessage message); + void send(Message message); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Module.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Module.java deleted file mode 100644 index d9d859efa83c..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Module.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.microsoft.azure.services.serviceBus; - -import com.microsoft.azure.configuration.builder.BuilderModule; -import com.microsoft.azure.configuration.builder.BuilderRegistry; - -public class Module implements BuilderModule { - public void register(BuilderRegistry registry) { - registry.add(ServiceBusClient.class); - } -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java index ddb627c0bdad..c1c630ea1d65 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java @@ -2,11 +2,7 @@ import javax.xml.datatype.Duration; -import com.microsoft.azure.services.serviceBus.contract.BrokeredMessage; -import com.microsoft.azure.services.serviceBus.contract.EntryModel; import com.microsoft.azure.services.serviceBus.contract.QueueDescription; -import com.microsoft.azure.services.serviceBus.contract.ReceiveMode; -import com.sun.syndication.feed.atom.Entry; public class Queue extends Entity implements MessageSender, MessageReceiver { public Queue(ServiceBusClient client, String path) { @@ -36,27 +32,42 @@ public void commit() { getContract().createQueue(getEntryModel()); } - public void send(BrokeredMessage message) { + + + public void send(Message message) { // TODO Auto-generated method stub - } + } - public BrokeredMessage receive(int timeout, ReceiveMode receiveMode) { + public Message receive(int timeout) { + // TODO Auto-generated method stub + return null; + } + + + + public Message peekLock(int timeout) { // TODO Auto-generated method stub return null; } - public void abandon(BrokeredMessage message) { + + + public void abandon(Message message) { // TODO Auto-generated method stub } - public void complete(BrokeredMessage message) { + + + public void complete(Message message) { // TODO Auto-generated method stub + } - + + // public object data public String getPath() { @@ -89,9 +100,7 @@ public Long getMessageCount() { - //public void setMessageCount(Long value) { - // getDescription().setMessageCount(value); - //} + } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java index ed863f42267a..4bde86466579 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java @@ -31,9 +31,9 @@ public void setContract(ServiceBusContract contract) { this.contract = contract; } - public Entity[] getQueues() { + public Queue[] getQueues() { EntryModel[] descriptions = contract.getQueues(); - Entity[] queues = new Entity[descriptions.length]; + Queue[] queues = new Queue[descriptions.length]; for (int i = 0; i != queues.length; ++i) { queues[i] = new Queue(this, null); queues[i].setEntryModel(descriptions[i]); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Exports.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Exports.java new file mode 100644 index 000000000000..0cf1264c5cae --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Exports.java @@ -0,0 +1,9 @@ +package com.microsoft.azure.services.serviceBus.contract; + +import com.microsoft.azure.configuration.builder.Builder; + +public class Exports implements Builder.Exports { + public void register(Builder.Registry registry) { + registry.add(ServiceBusContract.class, ServiceBusContractImpl.class); + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Module.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Module.java deleted file mode 100644 index 32575221f20c..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Module.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.microsoft.azure.services.serviceBus.contract; - -import com.microsoft.azure.configuration.builder.BuilderModule; -import com.microsoft.azure.configuration.builder.BuilderRegistry; - -public class Module implements BuilderModule { - public void register(BuilderRegistry registry) { - registry.add(ServiceBusContract.class, ServiceBusContractImpl.class); - } -} diff --git a/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports b/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports new file mode 100644 index 000000000000..a03cb6444614 --- /dev/null +++ b/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports @@ -0,0 +1,2 @@ +com.microsoft.azure.services.serviceBus.Exports +com.microsoft.azure.services.serviceBus.contract.Exports diff --git a/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.BuilderModule b/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.BuilderModule deleted file mode 100644 index 28dbf44a5c9c..000000000000 --- a/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.BuilderModule +++ /dev/null @@ -1,2 +0,0 @@ -com.microsoft.azure.services.serviceBus.Module -com.microsoft.azure.services.serviceBus.contract.Module From 09467a395bf156e8321e0a2d6c5f6041cbad2fa4 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 17 Oct 2011 22:16:05 -0700 Subject: [PATCH 13/59] Breaking up Jersey configuration a little better --- .../azure/configuration/Configuration.java | 55 ++++++++++--------- .../azure/configuration/builder/Builder.java | 37 +++++++++++-- .../configuration/builder/DefaultBuilder.java | 30 ++++------ .../azure/configuration/jersey/Exports.java | 20 +++++++ ...zure.configuration.builder.Builder$Exports | 1 + 5 files changed, 93 insertions(+), 50 deletions(-) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java index 368f12721282..1db57d7bfdae 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java @@ -1,5 +1,7 @@ package com.microsoft.azure.configuration; +import java.util.HashMap; +import java.util.Map; import java.util.ServiceLoader; import javax.inject.Provider; @@ -12,56 +14,42 @@ import com.sun.jersey.api.client.config.DefaultClientConfig; -public class Configuration implements Builder { +public class Configuration { private Builder builder; - protected ClientConfig clientConfig; + Map properties; + public Configuration() { - this.clientConfig = createDefaultClientConfig(); - try { - this.builder = createDefaultBuilder(); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } + this.properties = new HashMap(); + this.builder = createDefaultBuilder(); + setProperty("ClientConfig", createDefaultClientConfig()); } public Configuration(Builder builder) { + this.properties = new HashMap(); this.builder = builder; + setProperty("ClientConfig", createDefaultClientConfig()); } public static ClientConfig createDefaultClientConfig() { return new DefaultClientConfig(EntryModelProvider.class); } - Builder createDefaultBuilder() throws Exception { + Builder createDefaultBuilder() { final DefaultBuilder builder = new DefaultBuilder(); - for(Builder.Exports exports : ServiceLoader.load(Builder.Exports.class)){ + for(Builder.Exports exports : ServiceLoader.load(Builder.Exports.class)) { exports.register(builder); } - - final Configuration self = this; - builder.add(ClientConfig.class, new Provider(){ - public ClientConfig get() { - return self.clientConfig; - }}); - - builder.add(Client.class, new Provider(){ - public Client get() { - ClientConfig clientConfig = builder.build(ClientConfig.class); - return Client.create(clientConfig); - }}); - return builder; } public T build(Class c) throws Exception { - return builder.build(c); + return builder.build(c, getProperties()); } public Builder getBuilder() { @@ -71,5 +59,20 @@ public Builder getBuilder() { public void setBuilder(Builder builder) { this.builder = builder; } - + + public Map getProperties() { + return properties; + } + + public void setProperties(Map properties) { + this.properties = properties; + } + + public Object getProperty(String name) { + return getProperties().get(name); + } + + public void setProperty(String name, Object value) { + getProperties().put(name, value); + } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java index 57719866f203..6f0410a98ab7 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java @@ -1,18 +1,45 @@ package com.microsoft.azure.configuration.builder; -import javax.inject.Provider; +import java.util.Map; + +/** + * Builder interface used internally by Configuration to create component instances + * + */ public interface Builder { - public abstract T build(Class c) throws Exception; + /** + * Called by configuration when a component needs to be allocated + * @param service + * @param properties + * @return + * @throws Exception + */ + public abstract T build(Class service, Map properties) throws Exception; - public interface Exports { - void register(Registry registry); + /** + * @author lodejard + * + * @param + */ + public interface Factory { + /** + * @param builder + * @param properties + * @return + * @throws Exception + */ + T create(Builder builder, Map properties) throws Exception; } public interface Registry { Registry add(Class service); Registry add(Class service, Class implementation); - Registry add(Class service, Provider provider); + Registry add(Class service, Factory factory); + } + + public interface Exports { + void register(Registry registry); } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java index 990413155667..4eca6e1056e5 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java @@ -11,13 +11,13 @@ public class DefaultBuilder implements Builder, Builder.Registry { public DefaultBuilder() { - factories = new HashMap, Provider>(); + factories = new HashMap, Factory>(); } - Map, Provider> factories; + Map, Factory> factories; - public Builder addFactory(Class service, Provider factory) { + public Builder addFactory(Class service, Factory factory) { factories.put(service, factory); return this; } @@ -28,23 +28,15 @@ public Builder.Registry add(Class service, final Class impl for(final Constructor ctor : ctors) { if (ctor.getAnnotation(Inject.class) != null) { final Class[] parameterTypes = ctor.getParameterTypes(); - addFactory(service, new Provider() { + addFactory(service, new Builder.Factory() { @SuppressWarnings("unchecked") - public T get() throws RuntimeException { + public T create(Builder builder, Map properties) throws Exception { Object[] initargs = new Object[parameterTypes.length]; for(int i = 0; i != parameterTypes.length; ++i) { - initargs[i] = build(parameterTypes[i]); + initargs[i] = builder.build(parameterTypes[i], properties); } - try { - return (T) ctor.newInstance(initargs); - } catch (InvocationTargetException e) { - throw new RuntimeException(e); - } catch (InstantiationException e) { - throw new RuntimeException(e); - } catch (IllegalAccessException e) { - throw new RuntimeException(e); - } + return (T) ctor.newInstance(initargs); }}); } } @@ -55,18 +47,18 @@ public Builder.Registry add(Class service) { return add(service, service); } - public Builder.Registry add(Class service, Provider provider) { + public Builder.Registry add(Class service, Factory provider) { addFactory(service, provider); return this; } - public T build(Class c) throws RuntimeException { + public T build(Class service, Map properties) throws Exception { @SuppressWarnings("unchecked") - Provider factory = (Provider) factories.get(c); + Factory factory = (Factory) factories.get(service); if (factory == null) { return null; } - return factory.get(); + return factory.create(this, properties); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java new file mode 100644 index 000000000000..b9f3fe64ea5f --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java @@ -0,0 +1,20 @@ +package com.microsoft.azure.configuration.jersey; + +import java.util.Map; + +import com.microsoft.azure.configuration.builder.Builder; +import com.microsoft.azure.configuration.builder.Builder.Registry; +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.config.ClientConfig; + +public class Exports implements Builder.Exports { + + public void register(Registry registry) { + registry.add(Client.class, new Builder.Factory() { + public Client create(Builder builder, Map properties) { + ClientConfig clientConfig = (ClientConfig) properties.get("ClientConfig"); + return Client.create(clientConfig); + } + }); + } +} diff --git a/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports b/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports index a03cb6444614..8cdde57cd161 100644 --- a/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports +++ b/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports @@ -1,2 +1,3 @@ +com.microsoft.azure.configuration.jersey.Exports com.microsoft.azure.services.serviceBus.Exports com.microsoft.azure.services.serviceBus.contract.Exports From 6ea822783ab9de8c8bd3d3eebda2a15540093e95 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 17 Oct 2011 23:32:34 -0700 Subject: [PATCH 14/59] General cleanup Removing the Class for service in Builder.Registry when Factory is being passed in --- .../azure/configuration/Configuration.java | 51 ++++--------------- .../azure/configuration/builder/Builder.java | 24 +-------- .../configuration/builder/DefaultBuilder.java | 49 +++++++++++++----- .../azure/configuration/jersey/Exports.java | 2 +- .../azure/services/serviceBus/Entity.java | 1 - .../services/serviceBus/ServiceBusClient.java | 2 +- .../contract/EntryModelProvider.java | 1 - .../contract/ServiceBusContractImpl.java | 3 -- .../serviceBus/ClientBuilderTest.java | 5 +- .../contract/ContractBuilderTest.java | 2 +- .../QueueManagementIntegrationTest.java | 6 +-- 11 files changed, 53 insertions(+), 93 deletions(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java index 1db57d7bfdae..ecd773454f57 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java @@ -2,77 +2,46 @@ import java.util.HashMap; import java.util.Map; -import java.util.ServiceLoader; - -import javax.inject.Provider; - import com.microsoft.azure.configuration.builder.Builder; import com.microsoft.azure.configuration.builder.DefaultBuilder; import com.microsoft.azure.services.serviceBus.contract.EntryModelProvider; -import com.sun.jersey.api.client.Client; -import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; public class Configuration { - private Builder builder; Map properties; - + Builder builder; public Configuration() { this.properties = new HashMap(); - this.builder = createDefaultBuilder(); - setProperty("ClientConfig", createDefaultClientConfig()); + this.builder = DefaultBuilder.create(); + init(); } public Configuration(Builder builder) { this.properties = new HashMap(); this.builder = builder; - setProperty("ClientConfig", createDefaultClientConfig()); + init(); } - public static ClientConfig createDefaultClientConfig() { - return new DefaultClientConfig(EntryModelProvider.class); + private void init() { + setProperty("ClientConfig", new DefaultClientConfig(EntryModelProvider.class)); } - Builder createDefaultBuilder() { - - final DefaultBuilder builder = new DefaultBuilder(); - - for(Builder.Exports exports : ServiceLoader.load(Builder.Exports.class)) { - exports.register(builder); - } - - return builder; - } - - - public T build(Class c) throws Exception { - return builder.build(c, getProperties()); + public T create(Class service) throws Exception { + return builder.build(service, properties); } public Builder getBuilder() { return builder; } - public void setBuilder(Builder builder) { - this.builder = builder; - } - - public Map getProperties() { - return properties; - } - - public void setProperties(Map properties) { - this.properties = properties; - } - public Object getProperty(String name) { - return getProperties().get(name); + return properties.get(name); } public void setProperty(String name, Object value) { - getProperties().put(name, value); + properties.put(name, value); } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java index 6f0410a98ab7..99792ff31c2a 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java @@ -3,40 +3,18 @@ import java.util.Map; -/** - * Builder interface used internally by Configuration to create component instances - * - */ public interface Builder { - /** - * Called by configuration when a component needs to be allocated - * @param service - * @param properties - * @return - * @throws Exception - */ public abstract T build(Class service, Map properties) throws Exception; - /** - * @author lodejard - * - * @param - */ public interface Factory { - /** - * @param builder - * @param properties - * @return - * @throws Exception - */ T create(Builder builder, Map properties) throws Exception; } public interface Registry { Registry add(Class service); Registry add(Class service, Class implementation); - Registry add(Class service, Factory factory); + Registry add(Factory factory); } public interface Exports { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java index 4eca6e1056e5..fb7b20720c4b 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java @@ -1,26 +1,41 @@ package com.microsoft.azure.configuration.builder; import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; import java.util.HashMap; import java.util.Map; +import java.util.ServiceLoader; import javax.inject.Inject; -import javax.inject.Provider; + public class DefaultBuilder implements Builder, Builder.Registry { + Map, Factory> factories; + public DefaultBuilder() { factories = new HashMap, Factory>(); } - - Map, Factory> factories; - - public Builder addFactory(Class service, Factory factory) { + public static DefaultBuilder create() { + DefaultBuilder builder = new DefaultBuilder(); + + for(Builder.Exports exports : ServiceLoader.load(Builder.Exports.class)) { + exports.register(builder); + } + + return builder; + } + + void addFactory(Class service, Factory factory) { factories.put(service, factory); - return this; } + + public Builder.Registry add(Class service) { + return add(service, service); + } + public Builder.Registry add(Class service, final Class implementation) { @@ -42,15 +57,20 @@ public T create(Builder builder, Map properties) throws Exception } return this; } - - public Builder.Registry add(Class service) { - return add(service, service); - } - - public Builder.Registry add(Class service, Factory provider) { - addFactory(service, provider); + + + public Registry add(Factory factory) { + for(Type genericInterface : factory.getClass().getGenericInterfaces()) + { + ParameterizedType parameterizedType = (ParameterizedType) genericInterface; + if (parameterizedType.getRawType().equals(Builder.Factory.class)) { + Type typeArgument = parameterizedType.getActualTypeArguments()[0]; + addFactory((Class)typeArgument, factory); + } + } return this; } + public T build(Class service, Map properties) throws Exception { @SuppressWarnings("unchecked") @@ -62,4 +82,5 @@ public T build(Class service, Map properties) throws Excep } + } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java index b9f3fe64ea5f..43dfe5ea593c 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java @@ -10,7 +10,7 @@ public class Exports implements Builder.Exports { public void register(Registry registry) { - registry.add(Client.class, new Builder.Factory() { + registry.add(new Builder.Factory() { public Client create(Builder builder, Map properties) { ClientConfig clientConfig = (ClientConfig) properties.get("ClientConfig"); return Client.create(clientConfig); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Entity.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Entity.java index 768791e63615..3181c96bea3a 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Entity.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Entity.java @@ -1,7 +1,6 @@ package com.microsoft.azure.services.serviceBus; import com.microsoft.azure.services.serviceBus.contract.EntryModel; -import com.microsoft.azure.services.serviceBus.contract.QueueDescription; import com.microsoft.azure.services.serviceBus.contract.ServiceBusContract; import com.sun.syndication.feed.atom.Entry; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java index 4bde86466579..55cd43fe2973 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java @@ -15,7 +15,7 @@ public ServiceBusClient() { } public ServiceBusClient(Configuration configuration) throws Exception { - this.contract = configuration.build(ServiceBusContract.class); + this.contract = configuration.create(ServiceBusContract.class); } @Inject diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModelProvider.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModelProvider.java index 5a992151aeeb..1d427deec341 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModelProvider.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModelProvider.java @@ -16,7 +16,6 @@ import javax.ws.rs.ext.MessageBodyReader; import javax.ws.rs.ext.Providers; -import com.sun.jersey.core.impl.provider.entity.StringProvider; import com.sun.jersey.core.provider.AbstractMessageReaderWriterProvider; import com.sun.syndication.feed.atom.Content; import com.sun.syndication.feed.atom.Entry; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java index 15f8228d170a..5a3802442708 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java @@ -1,9 +1,6 @@ package com.microsoft.azure.services.serviceBus.contract; import javax.inject.Inject; -import javax.xml.bind.JAXBElement; -import javax.xml.namespace.QName; - import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientHandlerException; import com.sun.jersey.api.client.ClientRequest; diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ClientBuilderTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ClientBuilderTest.java index 7f146e446937..b9e66c0070f2 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ClientBuilderTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ClientBuilderTest.java @@ -1,10 +1,7 @@ package com.microsoft.azure.services.serviceBus; -import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; -import java.net.URLConnection; - import org.junit.Test; import static org.junit.Assert.*; @@ -20,7 +17,7 @@ public void testServiceBusClientCreatedWithContractImpl() throws Exception { Configuration config = new Configuration(); // Act - ServiceBusClient client = config.build(ServiceBusClient.class); + ServiceBusClient client = config.create(ServiceBusClient.class); ServiceBusClient client2 = new ServiceBusClient(config); // Assert diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractBuilderTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractBuilderTest.java index 91350ba9df71..22433eb557e4 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractBuilderTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractBuilderTest.java @@ -10,7 +10,7 @@ public class ContractBuilderTest { @Test public void testDefaultBuilderCreatesContractImpl() throws Exception { Configuration config = new Configuration(); - ServiceBusContract contract = config.build(ServiceBusContract.class); + ServiceBusContract contract = config.create(ServiceBusContract.class); assertNotNull(contract); } diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java index 5ab52d28e9b2..d4f357293723 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java @@ -18,7 +18,7 @@ public class QueueManagementIntegrationTest { public void queueCanBeCreatedAndDeleted() throws Exception { // Arrange ServiceBusClient client = new Configuration() - .build(ServiceBusClient.class); + .create(ServiceBusClient.class); ServiceBusContractImpl contract = (ServiceBusContractImpl) client.getContract(); contract.getChannel().addFilter(new LoggingFilter()); @@ -34,7 +34,7 @@ public void notFoundQueuePathReturnsNull() throws Exception { // Arrange Configuration cfg = new Configuration(); - ServiceBusClient client = cfg.build(ServiceBusClient.class); + ServiceBusClient client = cfg.create(ServiceBusClient.class); ServiceBusContractImpl contract = (ServiceBusContractImpl) client.getContract(); @@ -52,7 +52,7 @@ public void notFoundQueuePathReturnsNull() throws Exception { public void existingQueuePathDoesNotReturnNull() throws Exception { // Arrange ServiceBusClient client = new Configuration() - .build(ServiceBusClient.class); + .create(ServiceBusClient.class); ServiceBusContractImpl contract = (ServiceBusContractImpl) client.getContract(); contract.getChannel().addFilter(new LoggingFilter()); From 23a2d9ceb8b70165f5b95cab2ca04158945704b5 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Tue, 18 Oct 2011 15:16:08 -0700 Subject: [PATCH 15/59] Adding a service exception --- .../com/microsoft/azure/ServiceException.java | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/ServiceException.java diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/ServiceException.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/ServiceException.java new file mode 100644 index 000000000000..a3bafff167a1 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/ServiceException.java @@ -0,0 +1,47 @@ +package com.microsoft.azure; +import java.util.Map; + + +public class ServiceException extends Exception { + int httpStatusCode; + String httpReasonPhrase; + + String errorCode; + String errorMessage; + Map errorValues; + + public ServiceException() { + + } + + public int getHttpStatusCode() { + return httpStatusCode; + } + public void setHttpStatusCode(int httpStatusCode) { + this.httpStatusCode = httpStatusCode; + } + public String getHttpReasonPhrase() { + return httpReasonPhrase; + } + public void setHttpReasonPhrase(String httpReasonPhrase) { + this.httpReasonPhrase = httpReasonPhrase; + } + public String getErrorCode() { + return errorCode; + } + public void setErrorCode(String errorCode) { + this.errorCode = errorCode; + } + public String getErrorMessage() { + return errorMessage; + } + public void setErrorMessage(String errorMessage) { + this.errorMessage = errorMessage; + } + public Map getErrorValues() { + return errorValues; + } + public void setErrorValues(Map errorValues) { + this.errorValues = errorValues; + } +} From 166fe9eab08adb2363df7a91e1f9b20c114d4f12 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 19 Oct 2011 14:59:11 -0700 Subject: [PATCH 16/59] Adding Configuration singleton methods Also adding a static load placeholder --- .../azure/configuration/Configuration.java | 19 ++++++++++++++++++- .../services/serviceBus/ServiceBusClient.java | 7 ++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java index ecd773454f57..0fd619c94c87 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java @@ -10,6 +10,7 @@ public class Configuration { + private static Configuration instance; Map properties; Builder builder; @@ -28,7 +29,23 @@ public Configuration(Builder builder) { private void init() { setProperty("ClientConfig", new DefaultClientConfig(EntryModelProvider.class)); } - + + public static Configuration getInstance() { + if (instance == null) { + setInstance(load()); + } + return instance; + } + + public static void setInstance(Configuration instance) { + Configuration.instance = instance; + } + + public static Configuration load() { + // TODO - load from somewhere + return new Configuration(); + } + public T create(Class service) throws Exception { return builder.build(service, properties); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java index 55cd43fe2973..8fafd5c6d003 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java @@ -11,11 +11,12 @@ public class ServiceBusClient { ServiceBusContract contract; - public ServiceBusClient() { + public ServiceBusClient() throws Exception { + this(Configuration.getInstance()); } - public ServiceBusClient(Configuration configuration) throws Exception { - this.contract = configuration.create(ServiceBusContract.class); + public ServiceBusClient(Configuration config) throws Exception { + this(config.create(ServiceBusContract.class)); } @Inject From 4097cb8508cdd9f8ebf2f26e30a6ee21c7860b10 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 19 Oct 2011 15:17:02 -0700 Subject: [PATCH 17/59] Changes to ServiceBusClient to conform to guidelines Iterable listXxx for enumerable Xxx getXxx() to return an uninitialized entity --- .../services/serviceBus/MessageReceiver.java | 8 +++--- .../services/serviceBus/MessageSender.java | 2 +- .../azure/services/serviceBus/Queue.java | 12 ++++----- .../services/serviceBus/ServiceBusClient.java | 25 ++++++++----------- 4 files changed, 21 insertions(+), 26 deletions(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java index fd8153e2113f..836e214bdc88 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java @@ -2,8 +2,8 @@ public interface MessageReceiver { - Message receive(int timeout); - Message peekLock(int timeout); - void abandon(Message message); - void complete(Message message); + Message receiveMessage(int timeout); + Message peekLockMessage(int timeout); + void abandonMessage(Message message); + void completeMessage(Message message); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java index d0ae248bb08d..38cce540f877 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java @@ -2,5 +2,5 @@ public interface MessageSender { - void send(Message message); + void sendMessage(Message message); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java index c1c630ea1d65..77fd707eb6b9 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java @@ -5,7 +5,7 @@ import com.microsoft.azure.services.serviceBus.contract.QueueDescription; public class Queue extends Entity implements MessageSender, MessageReceiver { - public Queue(ServiceBusClient client, String path) { + Queue(ServiceBusClient client, String path) { super(client); setModel(new QueueDescription()); @@ -34,33 +34,33 @@ public void commit() { - public void send(Message message) { + public void sendMessage(Message message) { // TODO Auto-generated method stub } - public Message receive(int timeout) { + public Message receiveMessage(int timeout) { // TODO Auto-generated method stub return null; } - public Message peekLock(int timeout) { + public Message peekLockMessage(int timeout) { // TODO Auto-generated method stub return null; } - public void abandon(Message message) { + public void abandonMessage(Message message) { // TODO Auto-generated method stub } - public void complete(Message message) { + public void completeMessage(Message message) { // TODO Auto-generated method stub } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java index 8fafd5c6d003..ff8d89600635 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java @@ -1,5 +1,8 @@ package com.microsoft.azure.services.serviceBus; + +import java.util.ArrayList; + import javax.inject.Inject; import com.microsoft.azure.configuration.Configuration; @@ -32,29 +35,21 @@ public void setContract(ServiceBusContract contract) { this.contract = contract; } - public Queue[] getQueues() { + public Iterable listQueues() { EntryModel[] descriptions = contract.getQueues(); - Queue[] queues = new Queue[descriptions.length]; - for (int i = 0; i != queues.length; ++i) { - queues[i] = new Queue(this, null); - queues[i].setEntryModel(descriptions[i]); + ArrayList queues = new ArrayList(); + for (int i = 0; i != descriptions.length; ++i) { + queues.set(i, new Queue(this, null)); + queues.get(i).setEntryModel(descriptions[i]); } return queues; } public Queue getQueue(String path) { - Queue queue = new Queue(this, path); - queue.setEntryModel(contract.getQueue(path)); - return queue; - } - - public Queue createQueue(String path) { - Queue queue = new Queue(this, path); - queue.create(); - return queue; + return new Queue(this, path); } - public Topic[] getTopics() { + public Iterable listTopics() { return null; } } From 5f212c45b3a1cf84aaf7f7f3f40f7dd01db3daec Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 19 Oct 2011 15:33:40 -0700 Subject: [PATCH 18/59] Updating state transfer methods on Queue. Updating test methods --- .../azure/services/serviceBus/Queue.java | 19 ++++++------------- .../serviceBus/QueueManagementTest.java | 3 ++- .../QueueManagementIntegrationTest.java | 2 +- 3 files changed, 9 insertions(+), 15 deletions(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java index 77fd707eb6b9..bf8a11f0bdc0 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java @@ -16,7 +16,7 @@ public class Queue extends Entity implements MessageSender, Me // public object verbs - public void create() { + public void save() { getContract().createQueue(getEntryModel()); } @@ -24,13 +24,9 @@ public void delete() { getContract().deleteQueue(getPath()); } - public void get() { + public void fetch() { setEntryModel(getContract().getQueue(getPath())); } - - public void commit() { - getContract().createQueue(getEntryModel()); - } @@ -44,22 +40,19 @@ public Message receiveMessage(int timeout) { return null; } - - + public Message peekLockMessage(int timeout) { // TODO Auto-generated method stub return null; } - - + public void abandonMessage(Message message) { // TODO Auto-generated method stub } - - + public void completeMessage(Message message) { // TODO Auto-generated method stub @@ -68,7 +61,7 @@ public void completeMessage(Message message) { - // public object data + // entity state properties public String getPath() { return getEntry().getTitle(); diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java index 77ef04de8bfb..d127e6100595 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java @@ -29,6 +29,7 @@ public void testGetQueueAcquiresDescriptionFromServer() { // Act ServiceBusClient client = new ServiceBusClient(contract); Queue helloQueue = client.getQueue("Hello"); + helloQueue.fetch(); // Assert assertEquals(73, helloQueue.getMessageCount().longValue()); @@ -44,7 +45,7 @@ public void queueCreateSendsCreateQueueDescriptionMessage() throws DatatypeConfi Queue helloQueue = new Queue(client, "MyNewQueue"); helloQueue.setLockDuration(DatatypeFactory.newInstance().newDuration(60 * 1000L)); helloQueue.setMaxSizeInMegabytes(42L); - helloQueue.commit(); + helloQueue.save(); // Assert ArgumentCaptor createArg = ArgumentCaptor.forClass(EntryModel.class); diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java index d4f357293723..704932ae45f2 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java @@ -23,7 +23,7 @@ public void queueCanBeCreatedAndDeleted() throws Exception { contract.getChannel().addFilter(new LoggingFilter()); // Act - Queue queue = client.createQueue("TestQueue01"); + Queue queue = client.getQueue("TestQueue01"); queue.delete(); // Assert From 7331ad76795544b3239467ddabe7da3ca92fd49f Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 19 Oct 2011 15:34:03 -0700 Subject: [PATCH 19/59] Adding standard Exception ctors to ServiceException --- .../com/microsoft/azure/ServiceException.java | 32 ++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/ServiceException.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/ServiceException.java index a3bafff167a1..0f3caec7db89 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/ServiceException.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/ServiceException.java @@ -1,8 +1,12 @@ package com.microsoft.azure; +import java.util.HashMap; import java.util.Map; public class ServiceException extends Exception { + + private static final long serialVersionUID = -4942076377009150131L; + int httpStatusCode; String httpReasonPhrase; @@ -11,9 +15,29 @@ public class ServiceException extends Exception { Map errorValues; public ServiceException() { - + init(); + } + + public ServiceException(String message) { + super(message); + init(); + } + + public ServiceException(String message, Throwable cause) { + super(message, cause); + init(); } + public ServiceException(Throwable cause) { + super(cause); + init(); + } + + private void init() { + errorValues = new HashMap(); + } + + public int getHttpStatusCode() { return httpStatusCode; } @@ -44,4 +68,10 @@ public Map getErrorValues() { public void setErrorValues(Map errorValues) { this.errorValues = errorValues; } + public String getErrorValue(String name) { + return errorValues.get(name); + } + public void setErrorValue(String name, String value) { + this.errorValues.put(name, value); + } } From 12f70b31012ed12f6a0e18f25eb30a3481b96507 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 19 Oct 2011 17:13:44 -0700 Subject: [PATCH 20/59] Intermediate state - changing atom implementation details --- microsoft-azure-api/pom.xml | 5 ---- .../azure/services/serviceBus/Entity.java | 30 +++++-------------- .../azure/services/serviceBus/Queue.java | 10 +++++-- .../services/serviceBus/ServiceBusClient.java | 8 +++-- .../contract/ServiceBusContract.java | 9 ++++-- .../contract/ServiceBusContractImpl.java | 18 ++++++----- .../src/main/resources/atom.xsd | 30 +++++++++++++++++++ 7 files changed, 67 insertions(+), 43 deletions(-) create mode 100644 microsoft-azure-api/src/main/resources/atom.xsd diff --git a/microsoft-azure-api/pom.xml b/microsoft-azure-api/pom.xml index c9728ca34837..6a317c974e9c 100644 --- a/microsoft-azure-api/pom.xml +++ b/microsoft-azure-api/pom.xml @@ -35,11 +35,6 @@ javax.inject 1 - - com.sun.jersey - jersey-atom - 1.10-b03 - diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Entity.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Entity.java index 3181c96bea3a..8f369058ec5b 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Entity.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Entity.java @@ -1,23 +1,23 @@ package com.microsoft.azure.services.serviceBus; +import org.w3._2005.atom.Entry; + import com.microsoft.azure.services.serviceBus.contract.EntryModel; import com.microsoft.azure.services.serviceBus.contract.ServiceBusContract; -import com.sun.syndication.feed.atom.Entry; public class Entity { protected ServiceBusClient client; - private EntryModel entryModel; + private Entry entry; public Entity(ServiceBusClient client) { this.client = client; - this.entryModel = new EntryModel(); - setEntry(new Entry()); + setEntry(new org.w3._2005.atom.Entry()); } - public Entity(ServiceBusClient client, EntryModel entryModel) { + public Entity(ServiceBusClient client, Entry entry) { this.client = client; - this.entryModel = entryModel; + this.entry = entry; } protected ServiceBusClient getClient() { @@ -28,28 +28,14 @@ protected ServiceBusContract getContract() { return getClient().getContract(); } - protected EntryModel getEntryModel() { - return entryModel; - } - - protected void setEntryModel(EntryModel entryModel) { - this.entryModel = entryModel; - } protected Entry getEntry() { - return getEntryModel().getEntry(); + return entry; } protected void setEntry(Entry entry) { - getEntryModel().setEntry(entry); + this.entry = entry; } - protected T getModel() { - return getEntryModel().getModel(); - } - - protected void setModel(T model) { - getEntryModel().setModel(model); - } } \ No newline at end of file diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java index bf8a11f0bdc0..5528656e7b42 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java @@ -2,11 +2,17 @@ import javax.xml.datatype.Duration; +import org.w3._2005.atom.Content; + import com.microsoft.azure.services.serviceBus.contract.QueueDescription; public class Queue extends Entity implements MessageSender, MessageReceiver { Queue(ServiceBusClient client, String path) { super(client); + + Content content = new Content(); + content.setQueueDescription(new QueueDescription()); + getEntry().setContent(content); setModel(new QueueDescription()); setPath(path); @@ -17,7 +23,7 @@ public class Queue extends Entity implements MessageSender, Me // public object verbs public void save() { - getContract().createQueue(getEntryModel()); +// getContract().createQueue(getEntryModel()); } public void delete() { @@ -25,7 +31,7 @@ public void delete() { } public void fetch() { - setEntryModel(getContract().getQueue(getPath())); +// setEntryModel(getContract().getQueue(getPath())); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java index ff8d89600635..b9a18b82853f 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java @@ -5,6 +5,8 @@ import javax.inject.Inject; +import org.w3._2005.atom.Feed; + import com.microsoft.azure.configuration.Configuration; import com.microsoft.azure.services.serviceBus.contract.EntryModel; import com.microsoft.azure.services.serviceBus.contract.QueueDescription; @@ -36,11 +38,11 @@ public void setContract(ServiceBusContract contract) { } public Iterable listQueues() { - EntryModel[] descriptions = contract.getQueues(); + Feed descriptions = contract.getQueues(); ArrayList queues = new ArrayList(); - for (int i = 0; i != descriptions.length; ++i) { + for (int i = 0; i != descriptions.getEntries().size(); ++i) { queues.set(i, new Queue(this, null)); - queues.get(i).setEntryModel(descriptions[i]); + queues.get(i).setEntryModel(descriptions.getEntries().get(i)); } return queues; } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java index 23d807bdf0c5..daf6df0bd9d4 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java @@ -1,5 +1,8 @@ package com.microsoft.azure.services.serviceBus.contract; +import org.w3._2005.atom.Entry; +import org.w3._2005.atom.Feed; + public interface ServiceBusContract { void sendMessage(String path, BrokeredMessage message); @@ -8,10 +11,10 @@ public interface ServiceBusContract { void abandonMessage(BrokeredMessage message); void completeMessage(BrokeredMessage message); - void createQueue(EntryModel queue); + void createQueue(Entry queue); void deleteQueue(String queuePath); - EntryModel getQueue(String queuePath); - EntryModel[] getQueues(); + Entry getQueue(String queuePath); + Feed getQueues(); void createTopic(EntryModel topic); void deleteTopic(String topicPath); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java index 5a3802442708..da46332ef038 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java @@ -1,6 +1,10 @@ package com.microsoft.azure.services.serviceBus.contract; import javax.inject.Inject; + +import org.w3._2005.atom.Entry; +import org.w3._2005.atom.Feed; + import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.ClientHandlerException; import com.sun.jersey.api.client.ClientRequest; @@ -8,7 +12,6 @@ import com.sun.jersey.api.client.GenericType; import com.sun.jersey.api.client.filter.ClientFilter; import com.sun.jersey.api.representation.Form; -import com.sun.syndication.feed.atom.Entry; public class ServiceBusContractImpl implements ServiceBusContract { @@ -70,7 +73,7 @@ public void completeMessage(BrokeredMessage message) { } - public void createQueue(EntryModel entryModel) { + public void createQueue(Entry entry) { Form form = new Form(); form.add("wrap_name", "owner"); form.add("wrap_password", "Zo3QCZ5jLlJofibEiifZyz7B3x6a5Suv2YoS1JAWopA="); @@ -81,9 +84,8 @@ public void createQueue(EntryModel entryModel) { .post(Form.class, form); String accessToken = wrapResponse.get("wrap_access_token").get(0); - Entry entry = new Entry(); getChannel().resource("https://lodejard.servicebus.windows.net/") - .path(entryModel.getEntry().getTitle()) + .path(entry.getTitle()) .header("Authorization", "WRAP access_token=\"" + accessToken + "\"") .type("application/atom+xml") .put(entry); @@ -93,7 +95,7 @@ public void deleteQueue(String queuePath) { } - public EntryModel getQueue(String queuePath) { + public Entry getQueue(String queuePath) { Form form = new Form(); form.add("wrap_name", "owner"); form.add("wrap_password", "Zo3QCZ5jLlJofibEiifZyz7B3x6a5Suv2YoS1JAWopA="); @@ -104,12 +106,12 @@ public EntryModel getQueue(String queuePath) { .post(Form.class, form); String accessToken = wrapResponse.get("wrap_access_token").get(0); - GenericType> genericType = new GenericType>() { }; + //GenericType> genericType = new GenericType>() { }; return getChannel().resource("https://lodejard.servicebus.windows.net/") .path(queuePath) .header("Authorization", "WRAP access_token=\"" + accessToken + "\"") - .get(genericType); + .get(Entry.class); } @@ -172,7 +174,7 @@ public void addRule(String topicPath, String subscriptionName, } - public EntryModel[] getQueues() { + public Feed getQueues() { // TODO Auto-generated method stub return null; } diff --git a/microsoft-azure-api/src/main/resources/atom.xsd b/microsoft-azure-api/src/main/resources/atom.xsd new file mode 100644 index 000000000000..261397c9d4da --- /dev/null +++ b/microsoft-azure-api/src/main/resources/atom.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + From 89b2664f3c6121e446302d575d68d8ca85ba8fb3 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 20 Oct 2011 17:11:07 -0700 Subject: [PATCH 21/59] Trying to get simpler atom PUT working for QueueDescription --- .../azure/configuration/Configuration.java | 3 +- .../azure/services/serviceBus/Entity.java | 3 +- .../azure/services/serviceBus/Queue.java | 24 ++++-- .../services/serviceBus/ServiceBusClient.java | 5 +- .../services/serviceBus/contract/Entry.java | 14 ---- .../serviceBus/contract/EntryModel.java | 34 --------- .../contract/EntryModelProvider.java | 72 ------------------ .../contract/ServiceBusContract.java | 18 ++--- .../contract/ServiceBusContractImpl.java | 76 ++++++++----------- .../src/main/resources/NewFile.xml | 27 ------- .../src/main/resources/atom.xsd | 44 ++++++----- .../serviceBus/QueueManagementTest.java | 24 +++--- .../QueueManagementIntegrationTest.java | 59 +++++++++++++- .../src/test/resources/NewFile.xml | 1 + 14 files changed, 154 insertions(+), 250 deletions(-) delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Entry.java delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModel.java delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModelProvider.java delete mode 100644 microsoft-azure-api/src/main/resources/NewFile.xml create mode 100644 microsoft-azure-api/src/test/resources/NewFile.xml diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java index 0fd619c94c87..d4d24e676af2 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java @@ -4,7 +4,6 @@ import java.util.Map; import com.microsoft.azure.configuration.builder.Builder; import com.microsoft.azure.configuration.builder.DefaultBuilder; -import com.microsoft.azure.services.serviceBus.contract.EntryModelProvider; import com.sun.jersey.api.client.config.DefaultClientConfig; @@ -27,7 +26,7 @@ public Configuration(Builder builder) { } private void init() { - setProperty("ClientConfig", new DefaultClientConfig(EntryModelProvider.class)); + setProperty("ClientConfig", new DefaultClientConfig()); } public static Configuration getInstance() { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Entity.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Entity.java index 8f369058ec5b..dcaee33cb908 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Entity.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Entity.java @@ -1,8 +1,8 @@ package com.microsoft.azure.services.serviceBus; +import org.w3._2005.atom.Content; import org.w3._2005.atom.Entry; -import com.microsoft.azure.services.serviceBus.contract.EntryModel; import com.microsoft.azure.services.serviceBus.contract.ServiceBusContract; public class Entity { @@ -13,6 +13,7 @@ public class Entity { public Entity(ServiceBusClient client) { this.client = client; setEntry(new org.w3._2005.atom.Entry()); + getEntry().setContent(new Content()); } public Entity(ServiceBusClient client, Entry entry) { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java index 5528656e7b42..3a655465b659 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java @@ -3,6 +3,7 @@ import javax.xml.datatype.Duration; import org.w3._2005.atom.Content; +import org.w3._2005.atom.Entry; import com.microsoft.azure.services.serviceBus.contract.QueueDescription; @@ -11,19 +12,26 @@ public class Queue extends Entity implements MessageSender, Me super(client); Content content = new Content(); + content.setType("application/xml"); content.setQueueDescription(new QueueDescription()); getEntry().setContent(content); - setModel(new QueueDescription()); setPath(path); } + public Queue(ServiceBusClient client, Entry entry) { + super(client, entry); + } + + QueueDescription getQueueDescription(){ + return getEntry().getContent().getQueueDescription(); + } // public object verbs public void save() { -// getContract().createQueue(getEntryModel()); + getContract().createQueue(getEntry()); } public void delete() { @@ -31,7 +39,7 @@ public void delete() { } public void fetch() { -// setEntryModel(getContract().getQueue(getPath())); + setEntry(getContract().getQueue(getPath())); } @@ -78,23 +86,23 @@ public void setPath(String value) { } public Duration getLockDuration() { - return getModel().getLockDuration(); + return getQueueDescription().getLockDuration(); } public void setLockDuration(Duration value) { - getModel().setLockDuration(value); + getQueueDescription().setLockDuration(value); } public Long getMaxSizeInMegabytes() { - return getModel().getMaxSizeInMegabytes(); + return getQueueDescription().getMaxSizeInMegabytes(); } public void setMaxSizeInMegabytes(Long value) { - getModel().setMaxSizeInMegabytes(value); + getQueueDescription().setMaxSizeInMegabytes(value); } public Long getMessageCount() { - return getModel().getMessageCount(); + return getQueueDescription().getMessageCount(); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java index b9a18b82853f..755fb3d62884 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java @@ -8,8 +8,6 @@ import org.w3._2005.atom.Feed; import com.microsoft.azure.configuration.Configuration; -import com.microsoft.azure.services.serviceBus.contract.EntryModel; -import com.microsoft.azure.services.serviceBus.contract.QueueDescription; import com.microsoft.azure.services.serviceBus.contract.ServiceBusContract; public class ServiceBusClient { @@ -41,8 +39,7 @@ public Iterable listQueues() { Feed descriptions = contract.getQueues(); ArrayList queues = new ArrayList(); for (int i = 0; i != descriptions.getEntries().size(); ++i) { - queues.set(i, new Queue(this, null)); - queues.get(i).setEntryModel(descriptions.getEntries().get(i)); + queues.set(i, new Queue(this, descriptions.getEntries().get(i))); } return queues; } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Entry.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Entry.java deleted file mode 100644 index aa4ef56df798..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Entry.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.microsoft.azure.services.serviceBus.contract; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlType; - -@XmlAccessorType(XmlAccessType.FIELD) -@XmlType(name = "RuleDescription", propOrder = { - "filter", - "action" -}) -public class Entry { - -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModel.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModel.java deleted file mode 100644 index 112db52f2a5d..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModel.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.microsoft.azure.services.serviceBus.contract; - -import com.sun.syndication.feed.atom.Entry; - -public class EntryModel { - Entry entry; - T model; - - public EntryModel(){ - - } - - public EntryModel(Entry entry, T model) { - setEntry(entry); - setModel(model); - } - - public Entry getEntry() { - return entry; - } - - public void setEntry(Entry entry) { - this.entry = entry; - } - - public T getModel() { - return model; - } - - public void setModel(T model) { - this.model = model; - } -} - diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModelProvider.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModelProvider.java deleted file mode 100644 index 1d427deec341..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/EntryModelProvider.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.microsoft.azure.services.serviceBus.contract; - -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.lang.annotation.Annotation; -import java.lang.reflect.Type; - -import javax.ws.rs.Consumes; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyReader; -import javax.ws.rs.ext.Providers; - -import com.sun.jersey.core.provider.AbstractMessageReaderWriterProvider; -import com.sun.syndication.feed.atom.Content; -import com.sun.syndication.feed.atom.Entry; - -@Produces("application/atom+xml") -@Consumes("application/atom+xml") -public class EntryModelProvider extends AbstractMessageReaderWriterProvider> { - private Providers ps; - - public EntryModelProvider(@Context Providers ps){ - this.ps = ps; - } - - public boolean isReadable(Class type, Type genericType, - Annotation[] annotations, MediaType mediaType) { - // TODO Auto-generated method stub - - return type == EntryModel.class; - } - - public EntryModel readFrom(Class> type, Type genericType, - Annotation[] annotations, MediaType mediaType, - MultivaluedMap httpHeaders, InputStream entityStream) - throws IOException, WebApplicationException { - - MessageBodyReader reader = ps.getMessageBodyReader(Entry.class, Entry.class, annotations, mediaType); - Entry entry = reader.readFrom(Entry.class, Entry.class, annotations, mediaType, httpHeaders, entityStream); - - if (entry.getContents().size() == 1) { - Content content = (Content)entry.getContents().get(0); - MediaType entryType = MediaType.valueOf(content.getType()); - MessageBodyReader reader2 = ps.getMessageBodyReader(QueueDescription.class, QueueDescription.class, annotations, entryType); - String data = content.getValue(); - QueueDescription model = reader2.readFrom(QueueDescription.class, QueueDescription.class, annotations, entryType, httpHeaders, new ByteArrayInputStream(data.getBytes())); - return new EntryModel(entry, model); - } - return new EntryModel(entry, null); - } - - public boolean isWriteable(Class type, Type genericType, - Annotation[] annotations, MediaType mediaType) { - // TODO Auto-generated method stub - return false; - } - - public void writeTo(EntryModel t, Class type, Type genericType, - Annotation[] annotations, MediaType mediaType, - MultivaluedMap httpHeaders, - OutputStream entityStream) throws IOException, - WebApplicationException { - // TODO Auto-generated method stub - - } -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java index daf6df0bd9d4..72ec0ed2a254 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java @@ -16,19 +16,19 @@ public interface ServiceBusContract { Entry getQueue(String queuePath); Feed getQueues(); - void createTopic(EntryModel topic); + void createTopic(Entry topic); void deleteTopic(String topicPath); - EntryModel getTopic(String topicPath); - EntryModel[] getTopics(); + Entry getTopic(String topicPath); + Feed getTopics(); - void addSubscription(String topicPath, String subscriptionName, EntryModel subscription); + void addSubscription(String topicPath, String subscriptionName, Entry subscription); void removeSubscription(String topicPath, String subscriptionName); - EntryModel getSubscription(String topicPath, String subscriptionName); - EntryModel[] getSubscriptions(String topicPath); + Entry getSubscription(String topicPath, String subscriptionName); + Feed getSubscriptions(String topicPath); - void addRule(String topicPath, String subscriptionName, String ruleName, EntryModel rule); + void addRule(String topicPath, String subscriptionName, String ruleName, Entry rule); void removeRule(String topicPath, String subscriptionName, String ruleName); - EntryModel getRule(String topicPath, String subscriptionName, String ruleName); - EntryModel [] getRules(String topicPath, String subscriptionName); + Entry getRule(String topicPath, String subscriptionName, String ruleName); + Feed getRules(String topicPath, String subscriptionName); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java index da46332ef038..73e3e94e4075 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java @@ -87,7 +87,7 @@ public void createQueue(Entry entry) { getChannel().resource("https://lodejard.servicebus.windows.net/") .path(entry.getTitle()) .header("Authorization", "WRAP access_token=\"" + accessToken + "\"") - .type("application/atom+xml") + .type("application/atom+xml;type=entry;charset=utf-8") .put(entry); } @@ -115,108 +115,92 @@ public Entry getQueue(String queuePath) { } - public void createTopic(String topicPath, TopicDescription description) { - // TODO Auto-generated method stub - - } - - public void deleteTopic(String topicPath) { + public Feed getQueues() { // TODO Auto-generated method stub - + return null; } - public void addSubscription(String topicPath, String subscriptionName, - SubscriptionDescription description) { + public void createTopic(Entry topic) { // TODO Auto-generated method stub - - } - - public void removeSubscription(String topicPath, String subscriptionName) { - // TODO Auto-generated method stub - + } - public void addRule(String topicPath, String subscriptionName, - String ruleName, RuleDescription description) { + public void deleteTopic(String topicPath) { // TODO Auto-generated method stub - + } - public void removeRule(String topicPath, String subscriptionName, - String ruleName) { - // TODO Auto-generated method stub + public Entry getTopic(String topicPath) { + // TODO Auto-generated method stub + return null; } - - - - public void createTopic(EntryModel topic) { + public Feed getTopics() { // TODO Auto-generated method stub - + return null; } public void addSubscription(String topicPath, String subscriptionName, - EntryModel subscription) { + Entry subscription) { // TODO Auto-generated method stub } - public void addRule(String topicPath, String subscriptionName, - String ruleName, EntryModel rule) { + public void removeSubscription(String topicPath, String subscriptionName) { // TODO Auto-generated method stub } - public Feed getQueues() { + public Entry getSubscription(String topicPath, String subscriptionName) { // TODO Auto-generated method stub return null; } - public EntryModel getTopic(String topicPath) { + public Feed getSubscriptions(String topicPath) { // TODO Auto-generated method stub return null; } - public EntryModel[] getTopics() { + public void addRule(String topicPath, String subscriptionName, + String ruleName, Entry rule) { // TODO Auto-generated method stub - return null; + } - public EntryModel getSubscription( - String topicPath, String subscriptionName) { + public void removeRule(String topicPath, String subscriptionName, + String ruleName) { // TODO Auto-generated method stub - return null; + } - public EntryModel[] getSubscriptions( - String topicPath) { + public Entry getRule(String topicPath, String subscriptionName, + String ruleName) { // TODO Auto-generated method stub return null; } - public EntryModel getRule(String topicPath, - String subscriptionName, String ruleName) { + public Feed getRules(String topicPath, String subscriptionName) { // TODO Auto-generated method stub return null; } - public EntryModel[] getRules(String topicPath, - String subscriptionName) { - // TODO Auto-generated method stub - return null; - } + + + + + } diff --git a/microsoft-azure-api/src/main/resources/NewFile.xml b/microsoft-azure-api/src/main/resources/NewFile.xml deleted file mode 100644 index 3e6ab48c0113..000000000000 --- a/microsoft-azure-api/src/main/resources/NewFile.xml +++ /dev/null @@ -1,27 +0,0 @@ - - https://lodejard.servicebus.windows.net/Hello - Hello - 2011-10-04T23:09:57Z - 2011-10-04T23:09:57Z - - lodejard - - - - - PT1M - 1024 - false - false - P10675199DT2H48M5S - false - PT10M - 10 - true - 0 - 0 - - - diff --git a/microsoft-azure-api/src/main/resources/atom.xsd b/microsoft-azure-api/src/main/resources/atom.xsd index 261397c9d4da..86c57ae40bd5 100644 --- a/microsoft-azure-api/src/main/resources/atom.xsd +++ b/microsoft-azure-api/src/main/resources/atom.xsd @@ -1,30 +1,34 @@ - - - + + + - - + + + - - - - - - - - - - - + + + + + + + + + + + + + diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java index d127e6100595..0435dad08919 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java @@ -8,11 +8,11 @@ import org.junit.Test; import org.mockito.ArgumentCaptor; +import org.w3._2005.atom.Content; +import org.w3._2005.atom.Entry; -import com.microsoft.azure.services.serviceBus.contract.EntryModel; import com.microsoft.azure.services.serviceBus.contract.QueueDescription; import com.microsoft.azure.services.serviceBus.contract.ServiceBusContract; -import com.sun.syndication.feed.atom.Entry; public class QueueManagementTest { @@ -21,10 +21,12 @@ public void testGetQueueAcquiresDescriptionFromServer() { // Arrange ServiceBusContract contract = mock(ServiceBusContract.class); - EntryModel entryModel = new EntryModel(new Entry(), new QueueDescription()); - when(contract.getQueue("Hello")).thenReturn(entryModel); + Entry entry = new Entry(); + when(contract.getQueue("Hello")).thenReturn(entry); - entryModel.getModel().setMessageCount(73L); + entry.setContent(new Content()); + entry.getContent().setQueueDescription(new QueueDescription()); + entry.getContent().getQueueDescription().setMessageCount(73L); // Act ServiceBusClient client = new ServiceBusClient(contract); @@ -39,19 +41,19 @@ public void testGetQueueAcquiresDescriptionFromServer() { public void queueCreateSendsCreateQueueDescriptionMessage() throws DatatypeConfigurationException { // Arrange ServiceBusContract contract = mock(ServiceBusContract.class); - + // Act ServiceBusClient client = new ServiceBusClient(contract); - Queue helloQueue = new Queue(client, "MyNewQueue"); + Queue helloQueue = client.getQueue("MyNewQueue"); helloQueue.setLockDuration(DatatypeFactory.newInstance().newDuration(60 * 1000L)); helloQueue.setMaxSizeInMegabytes(42L); helloQueue.save(); // Assert - ArgumentCaptor createArg = ArgumentCaptor.forClass(EntryModel.class); - verify(contract).createQueue(createArg.capture()); - Entry entry = createArg.getValue().getEntry(); - QueueDescription model = (QueueDescription) createArg.getValue().getModel(); + ArgumentCaptor argument = ArgumentCaptor.forClass(Entry.class); + verify(contract).createQueue(argument.capture()); + Entry entry = argument.getValue(); + QueueDescription model = entry.getContent().getQueueDescription(); assertEquals("MyNewQueue", entry.getTitle()); assertEquals(DatatypeFactory.newInstance().newDuration(60 * 1000L), model.getLockDuration()); diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java index 704932ae45f2..e895ad667ada 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java @@ -1,5 +1,11 @@ package com.microsoft.azure.services.serviceBus.contract; +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.StringReader; + import junit.framework.Assert; import org.junit.Test; @@ -10,6 +16,7 @@ import com.microsoft.azure.services.serviceBus.ServiceBusClient; import com.microsoft.azure.services.serviceBus.contract.ServiceBusContractImpl; import com.sun.jersey.api.client.filter.LoggingFilter; +import com.sun.jersey.api.representation.Form; @@ -21,14 +28,61 @@ public void queueCanBeCreatedAndDeleted() throws Exception { .create(ServiceBusClient.class); ServiceBusContractImpl contract = (ServiceBusContractImpl) client.getContract(); contract.getChannel().addFilter(new LoggingFilter()); + + /* + String message = readResourceFile("NewFile.xml"); + + Form form = new Form(); + form.add("wrap_name", "owner"); + form.add("wrap_password", "Zo3QCZ5jLlJofibEiifZyz7B3x6a5Suv2YoS1JAWopA="); + form.add("wrap_scope", "http://lodejard.servicebus.windows.net/"); + Form wrapResponse = contract.getChannel().resource("https://lodejard-sb.accesscontrol.windows.net/") + .path("WRAPv0.9") + .post(Form.class, form); + String accessToken = wrapResponse.get("wrap_access_token").get(0); + + + contract.getChannel().resource("https://lodejard.servicebus.windows.net/") + .path("Hello") + .header("Authorization", "WRAP access_token=\"" + accessToken + "\"") + //.type("application/atom+xml") + .get(String.class); + + contract.getChannel().resource("https://lodejard.servicebus.windows.net/") + .path("Hello") + .header("Authorization", "WRAP access_token=\"" + accessToken + "\"") + .type("application/atom+xml") + .accept("application/atom+xml") + .put(message); +*/ // Act - Queue queue = client.getQueue("TestQueue01"); + Queue queue = client.getQueue("Hello"); + queue.fetch(); + queue.setPath("TestQueue01"); + queue.save(); queue.delete(); // Assert } + public static String readResourceFile(String name) throws IOException { + InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(name); + + StringBuffer sb = new StringBuffer(1024); + BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); + + char[] chars = new char[1024]; + int numRead = 0; + while( (numRead = reader.read(chars)) > -1){ + sb.append(String.valueOf(chars)); + } + + reader.close(); + + return sb.toString(); + } + @Test public void notFoundQueuePathReturnsNull() throws Exception { // Arrange @@ -62,9 +116,10 @@ public void existingQueuePathDoesNotReturnNull() throws Exception { // Act Queue queue = client.getQueue("Hello"); + queue.fetch(); // Assert Assert.assertNotNull(queue); - Assert.assertEquals("TestQueue02", queue.getPath()); + Assert.assertEquals("Hello", queue.getPath()); } } diff --git a/microsoft-azure-api/src/test/resources/NewFile.xml b/microsoft-azure-api/src/test/resources/NewFile.xml new file mode 100644 index 000000000000..7b3ea8dffd23 --- /dev/null +++ b/microsoft-azure-api/src/test/resources/NewFile.xml @@ -0,0 +1 @@ +PT1M1024falsefalseP10675199DT2H48M5SfalsePT10M10true00 From 6b1ace231e3cd969592820ea66912922862b0e9f Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Sat, 22 Oct 2011 18:16:10 -0700 Subject: [PATCH 22/59] Adding maven reference to jersey-json artifact --- microsoft-azure-api/pom.xml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/microsoft-azure-api/pom.xml b/microsoft-azure-api/pom.xml index 6a317c974e9c..df0af93f2d3e 100644 --- a/microsoft-azure-api/pom.xml +++ b/microsoft-azure-api/pom.xml @@ -35,6 +35,11 @@ javax.inject 1 + + com.sun.jersey + jersey-json + 1.10-b02 + From 7886764e018a6d9e03a06c310d7c251466fb2f07 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Sat, 22 Oct 2011 18:20:20 -0700 Subject: [PATCH 23/59] Adding implementation for serviceBus Maturing the Builder as needed Using various Configuration properties for serviceBus and wrapClient Adds a WrapFilter which will always acquire a token Uses JAXB Feed/Entity/Content classes from xsd for serviceBus mgmt ops Initial support for major queue mgmt operations Initial support for POST/DELETE message operations --- .../microsoft/azure/auth/wrap/Exports.java | 16 ++ .../microsoft/azure/auth/wrap/WrapClient.java | 47 +++++ .../microsoft/azure/auth/wrap/WrapFilter.java | 26 +++ .../auth/wrap/contract/WrapContract.java | 5 + .../auth/wrap/contract/WrapContractImpl.java | 33 ++++ .../auth/wrap/contract/WrapResponse.java | 31 ++++ .../azure/configuration/Configuration.java | 20 +- .../azure/configuration/builder/Builder.java | 6 + .../configuration/builder/DefaultBuilder.java | 98 ++++++++-- .../azure/configuration/jersey/Exports.java | 12 +- .../{Entity.java => AbstractEntity.java} | 24 +-- .../azure/services/serviceBus/Queue.java | 22 +-- .../services/serviceBus/ReceiveMode.java | 6 - .../services/serviceBus/ServiceBusClient.java | 2 +- .../serviceBus/contract/BrokerProperties.java | 75 ++++++++ .../contract/BrokerPropertiesMapper.java | 55 ++++++ .../serviceBus/contract/BrokeredMessage.java | 5 - .../services/serviceBus/contract/Exports.java | 26 +++ .../contract/MarshallerProvider.java | 54 ++++++ .../serviceBus/contract/MessageResult.java | 34 ++++ .../contract/NamespacePrefixMapperImpl.java | 18 ++ .../contract/ServiceBusContract.java | 14 +- .../contract/ServiceBusContractImpl.java | 175 +++++++----------- ...zure.configuration.builder.Builder$Exports | 1 + ...netservices.2010.10.servicebus.connect.xsd | 6 +- .../{atom.xsd => servicebus-atom.xsd} | 7 +- .../auth/wrap/WrapClientIntegrationTest.java | 32 ++++ .../contract/WrapContractIntegrationTest.java | 21 +++ .../builder/AlterClassWithProperties.java | 13 ++ .../ClassWithMultipleCtorMultipleInject.java | 10 + .../ClassWithMultipleCtorNoInject.java | 8 + .../builder/ClassWithNamedParameter.java | 22 +++ .../builder/ClassWithProperties.java | 36 ++++ .../builder/ClassWithSingleCtorNoInject.java | 7 + .../builder/DefaultBuilderTest.java | 113 +++++++++++ .../serviceBus/QueueManagementTest.java | 10 +- .../contract/BrokerPropertiesMapperTest.java | 19 ++ .../contract/ContractIntegrationTest.java | 100 ++++++++++ .../QueueManagementIntegrationTest.java | 163 ++++++++-------- .../src/test/resources/NewFile.xml | 5 +- 40 files changed, 1107 insertions(+), 270 deletions(-) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/Exports.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapFilter.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContract.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContractImpl.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapResponse.java rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{Entity.java => AbstractEntity.java} (66%) delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ReceiveMode.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerProperties.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerPropertiesMapper.java delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokeredMessage.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/MarshallerProvider.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/MessageResult.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/NamespacePrefixMapperImpl.java rename microsoft-azure-api/src/main/resources/{atom.xsd => servicebus-atom.xsd} (89%) create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientIntegrationTest.java create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/contract/WrapContractIntegrationTest.java create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/AlterClassWithProperties.java create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithMultipleCtorMultipleInject.java create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithMultipleCtorNoInject.java create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithNamedParameter.java create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithProperties.java create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithSingleCtorNoInject.java create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/DefaultBuilderTest.java create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/BrokerPropertiesMapperTest.java create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/Exports.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/Exports.java new file mode 100644 index 000000000000..e5c1ba053b5f --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/Exports.java @@ -0,0 +1,16 @@ +package com.microsoft.azure.auth.wrap; + +import com.microsoft.azure.auth.wrap.contract.WrapContract; +import com.microsoft.azure.auth.wrap.contract.WrapContractImpl; +import com.microsoft.azure.configuration.builder.Builder.Registry; + +public class Exports implements + com.microsoft.azure.configuration.builder.Builder.Exports { + + public void register(Registry registry) { + registry.add(WrapContract.class, WrapContractImpl.class); + registry.add(WrapClient.class); + registry.add(WrapFilter.class); + } + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java new file mode 100644 index 000000000000..6a73544593d9 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java @@ -0,0 +1,47 @@ +package com.microsoft.azure.auth.wrap; + +import javax.inject.Inject; +import javax.inject.Named; + +import com.microsoft.azure.auth.wrap.contract.WrapContract; + +public class WrapClient { + WrapContract contract; + private String uri; + private String name; + private String password; + private String scope; + + @Inject + public WrapClient( + WrapContract contract, + @Named("wrapClient.uri") String uri, + @Named("wrapClient.scope") String scope, + @Named("wrapClient.name") String name, + @Named("wrapClient.password") String password) { + this.contract = contract; + this.uri = uri; + this.scope = scope; + this.name = name; + this.password = password; + } + + + /** + * @return the contract + */ + public WrapContract getContract() { + return contract; + } + + /** + * @param contract the contract to set + */ + public void setContract(WrapContract contract) { + this.contract = contract; + } + + public String getAccessToken() { + return getContract().post(uri, name, password, scope).getAccessToken(); + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapFilter.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapFilter.java new file mode 100644 index 000000000000..8a4164680514 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapFilter.java @@ -0,0 +1,26 @@ +package com.microsoft.azure.auth.wrap; + +import com.sun.jersey.api.client.ClientHandlerException; +import com.sun.jersey.api.client.ClientRequest; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.filter.ClientFilter; + +public class WrapFilter extends ClientFilter { + private WrapClient client; + + public WrapFilter(WrapClient client) { + this.client = client; + } + + @Override + public ClientResponse handle(ClientRequest cr) + throws ClientHandlerException { + + String accessToken = client.getAccessToken(); + + cr.getHeaders().add("Authorization", + "WRAP access_token=\"" + accessToken + "\""); + + return this.getNext().handle(cr); + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContract.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContract.java new file mode 100644 index 000000000000..7f6d35e031b2 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContract.java @@ -0,0 +1,5 @@ +package com.microsoft.azure.auth.wrap.contract; + +public interface WrapContract { + WrapResponse post(String uri, String name, String password, String scope); +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContractImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContractImpl.java new file mode 100644 index 000000000000..19a0dda3c9b2 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContractImpl.java @@ -0,0 +1,33 @@ +package com.microsoft.azure.auth.wrap.contract; + +import javax.inject.Inject; +import javax.ws.rs.core.MediaType; + +import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.representation.Form; + +public class WrapContractImpl implements WrapContract { + Client channel; + + @Inject + public WrapContractImpl(Client channel) { + this.channel = channel; + } + + public WrapResponse post(String uri, String name, String password, String scope) { + Form requestForm = new Form(); + requestForm.add("wrap_name", name); + requestForm.add("wrap_password", password); + requestForm.add("wrap_scope", scope); + + Form responseForm = channel.resource(uri) + .accept(MediaType.APPLICATION_FORM_URLENCODED) + .type(MediaType.APPLICATION_FORM_URLENCODED) + .post(Form.class, requestForm); + + WrapResponse response = new WrapResponse(); + response.setAccessToken(responseForm.getFirst("wrap_access_token")); + response.setExpiresIn(responseForm.getFirst("wrap_access_token_expires_in")); + return response; + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapResponse.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapResponse.java new file mode 100644 index 000000000000..b007f98cdd30 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapResponse.java @@ -0,0 +1,31 @@ +package com.microsoft.azure.auth.wrap.contract; + +public class WrapResponse { + String accessToken; + String expiresIn; + + /** + * @return the accessToken + */ + public String getAccessToken() { + return accessToken; + } + /** + * @param accessToken the accessToken to set + */ + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + /** + * @return the expiresIn + */ + public String getExpiresIn() { + return expiresIn; + } + /** + * @param expiresIn the expiresIn to set + */ + public void setExpiresIn(String expiresIn) { + this.expiresIn = expiresIn; + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java index d4d24e676af2..1df1025fcddf 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java @@ -4,7 +4,9 @@ import java.util.Map; import com.microsoft.azure.configuration.builder.Builder; import com.microsoft.azure.configuration.builder.DefaultBuilder; +import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; +import com.sun.jersey.api.json.JSONConfiguration; public class Configuration { @@ -26,18 +28,14 @@ public Configuration(Builder builder) { } private void init() { - setProperty("ClientConfig", new DefaultClientConfig()); - } - - public static Configuration getInstance() { - if (instance == null) { - setInstance(load()); +// DefaultClientConfig clientConfig = new DefaultClientConfig(); +// clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, true); + try { + setProperty("ClientConfig", builder.build(ClientConfig.class, properties)); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); } - return instance; - } - - public static void setInstance(Configuration instance) { - Configuration.instance = instance; } public static Configuration load() { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java index 99792ff31c2a..338ab12ba6c4 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java @@ -11,10 +11,16 @@ public interface Factory { T create(Builder builder, Map properties) throws Exception; } + public interface Alteration { + T alter(T instance, Builder builder, Map properties) throws Exception; + } + public interface Registry { Registry add(Class service); Registry add(Class service, Class implementation); Registry add(Factory factory); + + void alter(Class service, Alteration alteration); } public interface Exports { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java index fb7b20720c4b..455bad294965 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java @@ -1,21 +1,27 @@ package com.microsoft.azure.configuration.builder; +import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.ServiceLoader; import javax.inject.Inject; +import javax.inject.Named; public class DefaultBuilder implements Builder, Builder.Registry { Map, Factory> factories; + Map, List>> alterations; public DefaultBuilder() { factories = new HashMap, Factory>(); + alterations = new HashMap, List>>(); } public static DefaultBuilder create() { @@ -24,7 +30,7 @@ public static DefaultBuilder create() { for(Builder.Exports exports : ServiceLoader.load(Builder.Exports.class)) { exports.register(builder); } - + return builder; } @@ -36,25 +42,66 @@ public Builder.Registry add(Class service) { return add(service, service); } - + Constructor findInjectConstructor(Class implementation) { - public Builder.Registry add(Class service, final Class implementation) { - Constructor[] ctors = implementation.getConstructors(); - for(final Constructor ctor : ctors) { + Constructor withInject = null; + Constructor withoutInject = null; + int count = 0; + + for (Constructor ctor : implementation.getConstructors()) { if (ctor.getAnnotation(Inject.class) != null) { - final Class[] parameterTypes = ctor.getParameterTypes(); - addFactory(service, new Builder.Factory() { - @SuppressWarnings("unchecked") - public T create(Builder builder, Map properties) throws Exception { - Object[] initargs = new Object[parameterTypes.length]; - for(int i = 0; i != parameterTypes.length; ++i) { - initargs[i] = builder.build(parameterTypes[i], properties); - } - - return (T) ctor.newInstance(initargs); - }}); + if (withInject != null){ + throw new RuntimeException("Class must not have multple @Inject annotations: " + implementation.getName()); + } + withInject = ctor; + } + else { + ++count; + withoutInject = ctor; } } + if (withInject != null) { + return withInject; + } + if (count != 1) { + throw new RuntimeException("Class without @Inject annotation must have one constructor: " + implementation.getName()); + } + return withoutInject; + } + + public Builder.Registry add(Class service, final Class implementation) { + final Constructor ctor = findInjectConstructor(implementation); + final Class[] parameterTypes = ctor.getParameterTypes(); + final Annotation[][] parameterAnnotations = ctor.getParameterAnnotations(); + + addFactory(service, new Builder.Factory() { + @SuppressWarnings("unchecked") + public T create(Builder builder, Map properties) throws Exception { + Object[] initargs = new Object[parameterTypes.length]; + for(int i = 0; i != parameterTypes.length; ++i) { + boolean located = false; + + Annotation[] annotations = parameterAnnotations[i]; + for(int ii = 0; ii != annotations.length && !located; ++ii){ + if (Named.class.isAssignableFrom(annotations[ii].getClass())) { + located = true; + + Named named = (Named)annotations[ii]; + if (!properties.containsKey(named.value())) { + throw new RuntimeException("Configuration missing required property: " + named.value()); + } + initargs[i] = properties.get(named.value()); + } + } + + if (!located) { + initargs[i] = builder.build(parameterTypes[i], properties); + } + } + + return (T) ctor.newInstance(initargs); + } + }); return this; } @@ -72,15 +119,28 @@ public Registry add(Factory factory) { } + @SuppressWarnings("unchecked") public T build(Class service, Map properties) throws Exception { - @SuppressWarnings("unchecked") Factory factory = (Factory) factories.get(service); if (factory == null) { - return null; + throw new RuntimeException("Service not registered: " + service.getName()); } - return factory.create(this, properties); + T instance = factory.create(this, properties); + List> alterationList = alterations.get(service); + if (alterationList != null){ + for(Alteration alteration : alterationList){ + instance = ((Alteration)alteration).alter(instance, this, properties); + } + } + return instance; } + public void alter(Class service, Alteration alteration) { + if (!this.alterations.containsKey(service)) { + this.alterations.put(service, new ArrayList>()); + } + this.alterations.get(service).add(alteration); + } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java index 43dfe5ea593c..571035b1c67f 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java @@ -6,14 +6,24 @@ import com.microsoft.azure.configuration.builder.Builder.Registry; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.config.ClientConfig; +import com.sun.jersey.api.client.config.DefaultClientConfig; +import com.sun.jersey.api.client.filter.LoggingFilter; public class Exports implements Builder.Exports { public void register(Registry registry) { + registry.add(new Builder.Factory() { + public ClientConfig create(Builder builder, Map properties) { + return new DefaultClientConfig(); + } + }); + registry.add(new Builder.Factory() { public Client create(Builder builder, Map properties) { ClientConfig clientConfig = (ClientConfig) properties.get("ClientConfig"); - return Client.create(clientConfig); + Client client = Client.create(clientConfig); + client.addFilter(new LoggingFilter()); + return client; } }); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Entity.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/AbstractEntity.java similarity index 66% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Entity.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/AbstractEntity.java index dcaee33cb908..8c56bd724c0c 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Entity.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/AbstractEntity.java @@ -1,35 +1,37 @@ package com.microsoft.azure.services.serviceBus; +import javax.ws.rs.core.MediaType; + import org.w3._2005.atom.Content; import org.w3._2005.atom.Entry; import com.microsoft.azure.services.serviceBus.contract.ServiceBusContract; -public class Entity { +abstract class AbstractEntity { - protected ServiceBusClient client; - private Entry entry; + ServiceBusClient client; + Entry entry; - public Entity(ServiceBusClient client) { + AbstractEntity(ServiceBusClient client) { this.client = client; setEntry(new org.w3._2005.atom.Entry()); getEntry().setContent(new Content()); + getEntry().getContent().setType(MediaType.APPLICATION_XML); } - - public Entity(ServiceBusClient client, Entry entry) { + + AbstractEntity(ServiceBusClient client, Entry entry) { this.client = client; this.entry = entry; } - + protected ServiceBusClient getClient() { return client; } - + protected ServiceBusContract getContract() { return getClient().getContract(); } - protected Entry getEntry() { return entry; } @@ -37,6 +39,4 @@ protected Entry getEntry() { protected void setEntry(Entry entry) { this.entry = entry; } - - -} \ No newline at end of file +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java index 3a655465b659..185d7769738f 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java @@ -1,25 +1,26 @@ package com.microsoft.azure.services.serviceBus; import javax.xml.datatype.Duration; - import org.w3._2005.atom.Content; import org.w3._2005.atom.Entry; import com.microsoft.azure.services.serviceBus.contract.QueueDescription; +import com.microsoft.azure.services.serviceBus.contract.ReceiveMode; -public class Queue extends Entity implements MessageSender, MessageReceiver { +public class Queue extends AbstractEntity implements MessageSender, MessageReceiver { Queue(ServiceBusClient client, String path) { super(client); Content content = new Content(); + + getEntry().setContent(content); content.setType("application/xml"); content.setQueueDescription(new QueueDescription()); - getEntry().setContent(content); setPath(path); } - public Queue(ServiceBusClient client, Entry entry) { + Queue(ServiceBusClient client, Entry entry) { super(client, entry); } @@ -28,10 +29,10 @@ QueueDescription getQueueDescription(){ } - // public object verbs + // API methods public void save() { - getContract().createQueue(getEntry()); + setEntry(getContract().createQueue(getEntry())); } public void delete() { @@ -50,6 +51,7 @@ public void sendMessage(Message message) { } public Message receiveMessage(int timeout) { + getContract().receiveMessage(getPath(), timeout, ReceiveMode.RECEIVE_AND_DELETE); // TODO Auto-generated method stub return null; } @@ -75,7 +77,7 @@ public void completeMessage(Message message) { - // entity state properties + // API properties public String getPath() { return getEntry().getTitle(); @@ -104,10 +106,4 @@ public void setMaxSizeInMegabytes(Long value) { public Long getMessageCount() { return getQueueDescription().getMessageCount(); } - - - - - - } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ReceiveMode.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ReceiveMode.java deleted file mode 100644 index b96aa03a3835..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ReceiveMode.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.microsoft.azure.services.serviceBus; - -public enum ReceiveMode { - PEEK_LOCK, - RECEIVE_AND_DELETE, -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java index 755fb3d62884..114a9c159cba 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java @@ -15,7 +15,7 @@ public class ServiceBusClient { ServiceBusContract contract; public ServiceBusClient() throws Exception { - this(Configuration.getInstance()); + this(Configuration.load()); } public ServiceBusClient(Configuration config) throws Exception { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerProperties.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerProperties.java new file mode 100644 index 000000000000..ee4c7dfd6a1c --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerProperties.java @@ -0,0 +1,75 @@ +package com.microsoft.azure.services.serviceBus.contract; + +import org.codehaus.jackson.annotate.JsonProperty; + +public class BrokerProperties { + @JsonProperty("DeliveryCount") + int deliveryCount; + + @JsonProperty("MessageId") + String messageId; + + @JsonProperty("SequenceNumber") + int sequenceNumber; + + @JsonProperty("TimeToLive") + long timeToLive; + + /** + * @return the deliveryCount + */ + public int getDeliveryCount() { + return deliveryCount; + } + + /** + * @param deliveryCount the deliveryCount to set + */ + public void setDeliveryCount(int deliveryCount) { + this.deliveryCount = deliveryCount; + } + + /** + * @return the messageId + */ + public String getMessageId() { + return messageId; + } + + /** + * @param messageId the messageId to set + */ + public void setMessageId(String messageId) { + this.messageId = messageId; + } + + /** + * @return the sequenceNumber + */ + public int getSequenceNumber() { + return sequenceNumber; + } + + /** + * @param sequenceNumber the sequenceNumber to set + */ + public void setSequenceNumber(int sequenceNumber) { + this.sequenceNumber = sequenceNumber; + } + + /** + * @return the timeToLive + */ + public long getTimeToLive() { + return timeToLive; + } + + /** + * @param timeToLive the timeToLive to set + */ + public void setTimeToLive(long timeToLive) { + this.timeToLive = timeToLive; + } + + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerPropertiesMapper.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerPropertiesMapper.java new file mode 100644 index 000000000000..8701f1db467f --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerPropertiesMapper.java @@ -0,0 +1,55 @@ +package com.microsoft.azure.services.serviceBus.contract; + +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; + +import org.codehaus.jackson.JsonGenerationException; +import org.codehaus.jackson.JsonParseException; +import org.codehaus.jackson.map.JsonMappingException; +import org.codehaus.jackson.map.ObjectMapper; + +public class BrokerPropertiesMapper { + + public BrokerProperties fromString(String value) + throws IllegalArgumentException { + ObjectMapper mapper = new ObjectMapper(); + try { + return mapper.readValue(value.getBytes(), BrokerProperties.class); + } catch (JsonParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + throw new IllegalArgumentException(e); + } catch (JsonMappingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + throw new IllegalArgumentException(e); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + throw new IllegalArgumentException(e); + } + } + + public String toString(BrokerProperties value) { + ObjectMapper mapper = new ObjectMapper(); + Writer writer = new StringWriter(); + try { + mapper.writeValue(writer, value); + } catch (JsonGenerationException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + throw new RuntimeException(e); + } catch (JsonMappingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + throw new RuntimeException(e); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + throw new RuntimeException(e); + } + return writer.toString(); + } + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokeredMessage.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokeredMessage.java deleted file mode 100644 index 640583fcc47c..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokeredMessage.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.microsoft.azure.services.serviceBus.contract; - -public class BrokeredMessage { - -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Exports.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Exports.java index 0cf1264c5cae..845ca50fabe5 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Exports.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Exports.java @@ -1,9 +1,35 @@ package com.microsoft.azure.services.serviceBus.contract; +import java.util.Map; + import com.microsoft.azure.configuration.builder.Builder; +import com.sun.jersey.api.client.config.ClientConfig; +import com.sun.jersey.api.json.JSONConfiguration; public class Exports implements Builder.Exports { public void register(Builder.Registry registry) { + + // provide contract implementation registry.add(ServiceBusContract.class, ServiceBusContractImpl.class); + + // alter jersey client config for serviceBus + registry.alter(ClientConfig.class, new Builder.Alteration() { + + public ClientConfig alter(ClientConfig instance, Builder builder, + Map properties) throws Exception { + + // enable this feature for unattributed json object serialization + instance.getProperties().put(JSONConfiguration.FEATURE_POJO_MAPPING, true); + + // need to avoid certain element prefixes, which the service does not ignore + instance.getSingletons().add(new MarshallerProvider()); + + return instance; + } + }); + + // convenience provider to transform BrokerProperty headers to json + registry.add(BrokerPropertiesMapper.class); + } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/MarshallerProvider.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/MarshallerProvider.java new file mode 100644 index 000000000000..e529e48e7708 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/MarshallerProvider.java @@ -0,0 +1,54 @@ +package com.microsoft.azure.services.serviceBus.contract; + +import javax.ws.rs.Produces; +import javax.ws.rs.core.Context; +import javax.ws.rs.ext.ContextResolver; +import javax.ws.rs.ext.Provider; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; +import javax.xml.bind.PropertyException; + +@Provider +@Produces("application/atom+xml") +public class MarshallerProvider implements ContextResolver { + + @Context + private ContextResolver jaxbContextResolver; + + public Marshaller getContext(Class type) { + Marshaller marshaller; + try { + marshaller = getJAXBContext(type).createMarshaller(); + } catch (JAXBException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; + } + com.sun.xml.bind.marshaller.NamespacePrefixMapper mapper = new NamespacePrefixMapperImpl(); + try { + marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", mapper); + } catch (PropertyException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; + } + return marshaller; + } + + private JAXBContext getJAXBContext(Class type) throws Exception { + JAXBContext context = null; + if (jaxbContextResolver != null){ + context = jaxbContextResolver.getContext(type); + } + if (context == null){ + context = JAXBContext.newInstance(type); + } + return context; + } + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/MessageResult.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/MessageResult.java new file mode 100644 index 000000000000..6c98703c48a3 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/MessageResult.java @@ -0,0 +1,34 @@ +package com.microsoft.azure.services.serviceBus.contract; + +import java.io.InputStream; + +public class MessageResult { + BrokerProperties brokerProperties; + + InputStream body; + + /** + * @return the brokerProperties + */ + public BrokerProperties getBrokerProperties() { + return brokerProperties; + } + /** + * @param brokerProperties the brokerProperties to set + */ + public void setBrokerProperties(BrokerProperties brokerProperties) { + this.brokerProperties = brokerProperties; + } + /** + * @return the body + */ + public InputStream getBody() { + return body; + } + /** + * @param body the body to set + */ + public void setBody(InputStream body) { + this.body = body; + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/NamespacePrefixMapperImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/NamespacePrefixMapperImpl.java new file mode 100644 index 000000000000..3f41f21e91f4 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/NamespacePrefixMapperImpl.java @@ -0,0 +1,18 @@ +package com.microsoft.azure.services.serviceBus.contract; + +import com.sun.xml.bind.marshaller.NamespacePrefixMapper; + +public class NamespacePrefixMapperImpl extends NamespacePrefixMapper { + + @Override + public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) { + if (namespaceUri == "http://www.w3.org/2005/Atom") { + return "atom"; + } + else if (namespaceUri == "http://schemas.microsoft.com/netservices/2010/10/servicebus/connect") { + return ""; + } + return suggestion; + } + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java index 72ec0ed2a254..5fd0f7bd31b4 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java @@ -5,18 +5,18 @@ public interface ServiceBusContract { - void sendMessage(String path, BrokeredMessage message); - BrokeredMessage receiveMessage(String queuePath, int timeout, ReceiveMode receiveMode); - BrokeredMessage receiveMessage(String topicPath, String subscriptionName, int timeout, ReceiveMode receiveMode); - void abandonMessage(BrokeredMessage message); - void completeMessage(BrokeredMessage message); + void sendMessage(String path, BrokerProperties properties); + MessageResult receiveMessage(String queuePath, int timeout, ReceiveMode receiveMode); + //BrokeredMessage receiveMessage(String topicPath, String subscriptionName, int timeout, ReceiveMode receiveMode); + //void abandonMessage(BrokeredMessage message); + //void completeMessage(BrokeredMessage message); - void createQueue(Entry queue); + Entry createQueue(Entry queue); void deleteQueue(String queuePath); Entry getQueue(String queuePath); Feed getQueues(); - void createTopic(Entry topic); + Entry createTopic(Entry topic); void deleteTopic(String topicPath); Entry getTopic(String topicPath); Feed getTopics(); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java index 73e3e94e4075..670ca2e7515a 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java @@ -1,188 +1,156 @@ package com.microsoft.azure.services.serviceBus.contract; +import java.rmi.UnexpectedException; + import javax.inject.Inject; +import javax.inject.Named; import org.w3._2005.atom.Entry; import org.w3._2005.atom.Feed; +import com.microsoft.azure.auth.wrap.WrapFilter; import com.sun.jersey.api.client.Client; -import com.sun.jersey.api.client.ClientHandlerException; -import com.sun.jersey.api.client.ClientRequest; import com.sun.jersey.api.client.ClientResponse; -import com.sun.jersey.api.client.GenericType; -import com.sun.jersey.api.client.filter.ClientFilter; -import com.sun.jersey.api.representation.Form; - -public class ServiceBusContractImpl implements ServiceBusContract { - - public class AtomFilter extends ClientFilter { - - @Override - public ClientResponse handle(ClientRequest cr) - throws ClientHandlerException { - - return getNext().handle(cr); - } +import com.sun.jersey.api.client.WebResource; - } +public class ServiceBusContractImpl implements ServiceBusContract { private Client channel; + private String uri; + private BrokerPropertiesMapper mapper; @Inject - public ServiceBusContractImpl(Client channel) { - channel.addFilter(new AtomFilter()); - this.setChannel(channel); + public ServiceBusContractImpl( + Client channel, WrapFilter authFilter, + @Named("serviceBus.uri") String uri, + BrokerPropertiesMapper mapper) { + + this.channel = channel; + this.uri = uri; + this.mapper = mapper; + channel.addFilter(authFilter); } - public Client getChannel() { return channel; } - - public void setChannel(Client channel) { this.channel = channel; } - - public void sendMessage(String path, BrokeredMessage message) { - // TODO Auto-generated method stub - + public void sendMessage(String path, BrokerProperties properties) { + getResource() + .path(path) + .path("messages") + .header("BrokerProperties", mapper.toString(properties)) + .post("Hello world"); } - public BrokeredMessage receiveMessage(String queuePath, int timeout, + public MessageResult receiveMessage(String queuePath, int timeout, ReceiveMode receiveMode) { - // TODO Auto-generated method stub - return null; - } - - public BrokeredMessage receiveMessage(String topicPath, - String subscriptionName, int timeout, ReceiveMode receiveMode) { - // TODO Auto-generated method stub - return null; - } - - public void abandonMessage(BrokeredMessage message) { - // TODO Auto-generated method stub - + MessageResult result = new MessageResult(); + if (receiveMode == ReceiveMode.RECEIVE_AND_DELETE) { + ClientResponse clientResult = getResource() + .path(queuePath) + .path("messages") + .path("head") + .queryParam("timeout", Integer.toString(timeout)) + .delete(ClientResponse.class); + + result.setBrokerProperties(mapper.fromString(clientResult.getHeaders().getFirst("BrokerProperties"))); + result.setBody(clientResult.getEntityInputStream()); + return result; + } + throw new RuntimeException("Unknown ReceiveMode"); } - public void completeMessage(BrokeredMessage message) { - // TODO Auto-generated method stub - } - - public void createQueue(Entry entry) { - Form form = new Form(); - form.add("wrap_name", "owner"); - form.add("wrap_password", "Zo3QCZ5jLlJofibEiifZyz7B3x6a5Suv2YoS1JAWopA="); - form.add("wrap_scope", "http://lodejard.servicebus.windows.net/"); - - Form wrapResponse = getChannel().resource("https://lodejard-sb.accesscontrol.windows.net/") - .path("WRAPv0.9") - .post(Form.class, form); - String accessToken = wrapResponse.get("wrap_access_token").get(0); - - getChannel().resource("https://lodejard.servicebus.windows.net/") + public Entry createQueue(Entry entry) { + return getResource() .path(entry.getTitle()) - .header("Authorization", "WRAP access_token=\"" + accessToken + "\"") - .type("application/atom+xml;type=entry;charset=utf-8") - .put(entry); + .type("application/atom+xml")//;type=entry;charset=utf-8") + .put(Entry.class, entry); } public void deleteQueue(String queuePath) { - + getResource() + .path(queuePath) + .delete(); } - public Entry getQueue(String queuePath) { - Form form = new Form(); - form.add("wrap_name", "owner"); - form.add("wrap_password", "Zo3QCZ5jLlJofibEiifZyz7B3x6a5Suv2YoS1JAWopA="); - form.add("wrap_scope", "http://lodejard.servicebus.windows.net/"); - - Form wrapResponse = getChannel().resource("https://lodejard-sb.accesscontrol.windows.net/") - .path("WRAPv0.9") - .post(Form.class, form); - String accessToken = wrapResponse.get("wrap_access_token").get(0); - - //GenericType> genericType = new GenericType>() { }; - - return getChannel().resource("https://lodejard.servicebus.windows.net/") - .path(queuePath) - .header("Authorization", "WRAP access_token=\"" + accessToken + "\"") - .get(Entry.class); + private WebResource getResource() { + return getChannel() + .resource(uri); } + public Entry getQueue(String queuePath) { + return getResource() + .path(queuePath) + .get(Entry.class); + } public Feed getQueues() { - // TODO Auto-generated method stub - return null; + return getResource() + .path("$Resources/Queues") + .get(Feed.class); } - - public void createTopic(Entry topic) { - // TODO Auto-generated method stub - + public Entry createTopic(Entry entry) { + return getResource() + .path(entry.getTitle()) + .type("application/atom+xml")//;type=entry;charset=utf-8") + .put(Entry.class, entry); } - public void deleteTopic(String topicPath) { - // TODO Auto-generated method stub - + getResource() + .path(topicPath) + .delete(); } - public Entry getTopic(String topicPath) { // TODO Auto-generated method stub return null; } - public Feed getTopics() { // TODO Auto-generated method stub return null; } - public void addSubscription(String topicPath, String subscriptionName, Entry subscription) { // TODO Auto-generated method stub - - } + } public void removeSubscription(String topicPath, String subscriptionName) { // TODO Auto-generated method stub - - } + } public Entry getSubscription(String topicPath, String subscriptionName) { // TODO Auto-generated method stub return null; } - public Feed getSubscriptions(String topicPath) { // TODO Auto-generated method stub return null; } - public void addRule(String topicPath, String subscriptionName, String ruleName, Entry rule) { // TODO Auto-generated method stub - - } + } public void removeRule(String topicPath, String subscriptionName, String ruleName) { // TODO Auto-generated method stub - - } + } public Entry getRule(String topicPath, String subscriptionName, String ruleName) { @@ -190,17 +158,10 @@ public Entry getRule(String topicPath, String subscriptionName, return null; } - public Feed getRules(String topicPath, String subscriptionName) { // TODO Auto-generated method stub return null; } - - - - - - } diff --git a/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports b/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports index 8cdde57cd161..a582f449caaa 100644 --- a/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports +++ b/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports @@ -1,3 +1,4 @@ +com.microsoft.azure.auth.wrap.Exports com.microsoft.azure.configuration.jersey.Exports com.microsoft.azure.services.serviceBus.Exports com.microsoft.azure.services.serviceBus.contract.Exports diff --git a/microsoft-azure-api/src/main/resources/schemas.microsoft.com.netservices.2010.10.servicebus.connect.xsd b/microsoft-azure-api/src/main/resources/schemas.microsoft.com.netservices.2010.10.servicebus.connect.xsd index eb30b07d7f80..31d324b76fbe 100644 --- a/microsoft-azure-api/src/main/resources/schemas.microsoft.com.netservices.2010.10.servicebus.connect.xsd +++ b/microsoft-azure-api/src/main/resources/schemas.microsoft.com.netservices.2010.10.servicebus.connect.xsd @@ -101,7 +101,7 @@ - + @@ -169,7 +169,7 @@ - + @@ -299,5 +299,5 @@ - + \ No newline at end of file diff --git a/microsoft-azure-api/src/main/resources/atom.xsd b/microsoft-azure-api/src/main/resources/servicebus-atom.xsd similarity index 89% rename from microsoft-azure-api/src/main/resources/atom.xsd rename to microsoft-azure-api/src/main/resources/servicebus-atom.xsd index 86c57ae40bd5..c7649f01686b 100644 --- a/microsoft-azure-api/src/main/resources/atom.xsd +++ b/microsoft-azure-api/src/main/resources/servicebus-atom.xsd @@ -26,9 +26,10 @@ - - - + + + + diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientIntegrationTest.java new file mode 100644 index 000000000000..3c8221951a3a --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientIntegrationTest.java @@ -0,0 +1,32 @@ +package com.microsoft.azure.auth.wrap; + +import junit.framework.Assert; + +import org.junit.Test; + +import com.microsoft.azure.configuration.Configuration; + +public class WrapClientIntegrationTest { + private Configuration createConfiguration() { + Configuration config = new Configuration(); + config.setProperty("serviceBus.uri", "https://lodejard.servicebus.windows.net"); + config.setProperty("wrapClient.uri", "https://lodejard-sb.accesscontrol.windows.net/WRAPv0.9"); + config.setProperty("wrapClient.scope", "http://lodejard.servicebus.windows.net/"); + config.setProperty("wrapClient.name", "owner"); + config.setProperty("wrapClient.password", "Zo3QCZ5jLlJofibEiifZyz7B3x6a5Suv2YoS1JAWopA="); + return config; + } + + @Test + public void wrapClientWillAcquireAccessToken() throws Exception { + // Arrange + Configuration config = createConfiguration(); + WrapClient client = config.create(WrapClient.class); + + // Act + String accessToken = client.getAccessToken(); + + // Assert + Assert.assertNotNull(accessToken); + } +} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/contract/WrapContractIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/contract/WrapContractIntegrationTest.java new file mode 100644 index 000000000000..fab7e7faf0ee --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/contract/WrapContractIntegrationTest.java @@ -0,0 +1,21 @@ +package com.microsoft.azure.auth.wrap.contract; + +import org.junit.Test; + +import com.microsoft.azure.configuration.Configuration; +import com.sun.jersey.api.client.Client; + +public class WrapContractIntegrationTest { + @Test + public void yaaaaargh() throws Exception { + Configuration config = new Configuration(); + + WrapContract contract = new WrapContractImpl(config.create(Client.class)); + + contract.post( + "https://lodejard-sb.accesscontrol.windows.net/WRAPv0.9", + "owner", + "Zo3QCZ5jLlJofibEiifZyz7B3x6a5Suv2YoS1JAWopA=", + "http://lodejard.servicebus.windows.net"); + } +} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/AlterClassWithProperties.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/AlterClassWithProperties.java new file mode 100644 index 000000000000..ef81367eb0a7 --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/AlterClassWithProperties.java @@ -0,0 +1,13 @@ +package com.microsoft.azure.configuration.builder; + +import java.util.Map; + +public class AlterClassWithProperties implements Builder.Alteration{ + + public ClassWithProperties alter(ClassWithProperties instance, + Builder builder, Map properties) throws Exception { + instance.setFoo(instance.getFoo() + " - changed"); + return instance; + } + +} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithMultipleCtorMultipleInject.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithMultipleCtorMultipleInject.java new file mode 100644 index 000000000000..341753eade6d --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithMultipleCtorMultipleInject.java @@ -0,0 +1,10 @@ +package com.microsoft.azure.configuration.builder; + +import javax.inject.Inject; + +public class ClassWithMultipleCtorMultipleInject { + @Inject + public ClassWithMultipleCtorMultipleInject(){} + @Inject + public ClassWithMultipleCtorMultipleInject(String x){} +} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithMultipleCtorNoInject.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithMultipleCtorNoInject.java new file mode 100644 index 000000000000..90149fe4dc73 --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithMultipleCtorNoInject.java @@ -0,0 +1,8 @@ +package com.microsoft.azure.configuration.builder; + +public class ClassWithMultipleCtorNoInject { + public ClassWithMultipleCtorNoInject() { + } + public ClassWithMultipleCtorNoInject(String x) { + } +} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithNamedParameter.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithNamedParameter.java new file mode 100644 index 000000000000..62c930bada83 --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithNamedParameter.java @@ -0,0 +1,22 @@ +package com.microsoft.azure.configuration.builder; + +import javax.inject.Inject; +import javax.inject.Named; + +public class ClassWithNamedParameter { + private String hello; + + @Inject + public ClassWithNamedParameter(@Named("Foo") String hello) { + this.hello = hello; + } + + public String getHello() { + return hello; + } + + public void setHello(String hello) { + this.hello = hello; + } +} + diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithProperties.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithProperties.java new file mode 100644 index 000000000000..22c365db6e72 --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithProperties.java @@ -0,0 +1,36 @@ +package com.microsoft.azure.configuration.builder; + +public class ClassWithProperties { + String foo; + String bar; + + public ClassWithProperties(){ + foo = "one"; + bar = "two"; + } + + /** + * @return the foo + */ + public String getFoo() { + return foo; + } + /** + * @param foo the foo to set + */ + public void setFoo(String foo) { + this.foo = foo; + } + /** + * @return the bar + */ + public String getBar() { + return bar; + } + /** + * @param bar the bar to set + */ + public void setBar(String bar) { + this.bar = bar; + } +} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithSingleCtorNoInject.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithSingleCtorNoInject.java new file mode 100644 index 000000000000..1a34374e5592 --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/ClassWithSingleCtorNoInject.java @@ -0,0 +1,7 @@ +package com.microsoft.azure.configuration.builder; + +public class ClassWithSingleCtorNoInject { + public ClassWithSingleCtorNoInject() { + + } +} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/DefaultBuilderTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/DefaultBuilderTest.java new file mode 100644 index 000000000000..cf4b105cd0a8 --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/DefaultBuilderTest.java @@ -0,0 +1,113 @@ +package com.microsoft.azure.configuration.builder; + +import java.util.HashMap; +import java.util.Map; + +import junit.framework.Assert; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +public class DefaultBuilderTest { + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Test + public void namedAnnotationsComeFromBuildProperties() throws Exception { + // Arrange + DefaultBuilder builder = new DefaultBuilder(); + builder.add(ClassWithNamedParameter.class); + + // Act + Map properties = new HashMap(); + properties.put("Foo", "world"); + ClassWithNamedParameter cwnp = builder.build( + ClassWithNamedParameter.class, properties); + + // Assert + Assert.assertEquals("world", cwnp.getHello()); + } + + @Test + public void namedAnnotationReportsMissingProperty() throws Exception { + // Arrange + thrown.expect(RuntimeException.class); + + Map properties = new HashMap(); + DefaultBuilder builder = new DefaultBuilder(); + builder.add(ClassWithNamedParameter.class); + + // Act + ClassWithNamedParameter cwnp = builder.build( + ClassWithNamedParameter.class, properties); + + // Assert + Assert.assertEquals("world", cwnp.getHello()); + } + + @Test + public void singleCtorWithNoInjectShouldBeUsed() throws Exception { + // Arrange + Map properties = new HashMap(); + DefaultBuilder builder = new DefaultBuilder(); + builder.add(ClassWithSingleCtorNoInject.class); + + // Act + ClassWithSingleCtorNoInject result = builder.build( + ClassWithSingleCtorNoInject.class, properties); + + // Assert + Assert.assertNotNull(result); + } + + @Test + public void multipleCtorWithNoInjectShouldFail() throws Exception { + // Arrange + thrown.expect(RuntimeException.class); + + Map properties = new HashMap(); + DefaultBuilder builder = new DefaultBuilder(); + builder.add(ClassWithMultipleCtorNoInject.class); + + // Act + ClassWithMultipleCtorNoInject result = builder.build( + ClassWithMultipleCtorNoInject.class, properties); + + // Assert + Assert.assertTrue("Exception must occur", false); + } + + @Test + public void multipleCtorWithMultipleInjectShouldFail() throws Exception { + // Arrange + thrown.expect(RuntimeException.class); + + Map properties = new HashMap(); + DefaultBuilder builder = new DefaultBuilder(); + builder.add(ClassWithMultipleCtorMultipleInject.class); + + // Act + ClassWithMultipleCtorMultipleInject result = builder.build( + ClassWithMultipleCtorMultipleInject.class, properties); + + // Assert + Assert.assertTrue("Exception must occur", false); + } + + @Test + public void alterationExecutesWhenInstanceCreated() throws Exception { + // Arrange + Map properties = new HashMap(); + DefaultBuilder builder = new DefaultBuilder(); + builder.add(ClassWithProperties.class); + builder.alter(ClassWithProperties.class, new AlterClassWithProperties()); + + // Act + ClassWithProperties result = builder.build(ClassWithProperties.class, properties); + + // Assert + Assert.assertEquals("one - changed", result.getFoo()); + } +} \ No newline at end of file diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java index 0435dad08919..67a3f236cdfa 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java @@ -25,8 +25,8 @@ public void testGetQueueAcquiresDescriptionFromServer() { when(contract.getQueue("Hello")).thenReturn(entry); entry.setContent(new Content()); - entry.getContent().setQueueDescription(new QueueDescription()); - entry.getContent().getQueueDescription().setMessageCount(73L); + //entry.getContent().setQueueDescription(new QueueDescription()); + //entry.getContent().getQueueDescription().setMessageCount(73L); // Act ServiceBusClient client = new ServiceBusClient(contract); @@ -53,10 +53,10 @@ public void queueCreateSendsCreateQueueDescriptionMessage() throws DatatypeConfi ArgumentCaptor argument = ArgumentCaptor.forClass(Entry.class); verify(contract).createQueue(argument.capture()); Entry entry = argument.getValue(); - QueueDescription model = entry.getContent().getQueueDescription(); + //QueueDescription model = entry.getContent().getQueueDescription(); assertEquals("MyNewQueue", entry.getTitle()); - assertEquals(DatatypeFactory.newInstance().newDuration(60 * 1000L), model.getLockDuration()); - assertEquals(42, model.getMaxSizeInMegabytes().longValue()); + //assertEquals(DatatypeFactory.newInstance().newDuration(60 * 1000L), model.getLockDuration()); + //assertEquals(42, model.getMaxSizeInMegabytes().longValue()); } } diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/BrokerPropertiesMapperTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/BrokerPropertiesMapperTest.java new file mode 100644 index 000000000000..076d58b8a552 --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/BrokerPropertiesMapperTest.java @@ -0,0 +1,19 @@ +package com.microsoft.azure.services.serviceBus.contract; + +import static org.junit.Assert.*; + +import org.junit.Test; + +public class BrokerPropertiesMapperTest { + @Test + public void jsonStringMapsToBrokerPropertiesObject(){ + // Arrange + BrokerPropertiesMapper mapper = new BrokerPropertiesMapper(); + + // Act + BrokerProperties properties = mapper.fromString("{}"); + + // Assert + assertNotNull(properties); + } +} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java new file mode 100644 index 000000000000..a50d914d2b39 --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java @@ -0,0 +1,100 @@ +package com.microsoft.azure.services.serviceBus.contract; + +import org.junit.Test; +import org.w3._2005.atom.Content; +import org.w3._2005.atom.Entry; +import org.w3._2005.atom.Feed; + +import com.microsoft.azure.configuration.Configuration; +import static org.junit.Assert.*; + +public class ContractIntegrationTest { + private Configuration createConfiguration() { + Configuration config = new Configuration(); + config.setProperty("serviceBus.uri", "https://lodejard.servicebus.windows.net"); + config.setProperty("wrapClient.uri", "https://lodejard-sb.accesscontrol.windows.net/WRAPv0.9"); + config.setProperty("wrapClient.name", "owner"); + config.setProperty("wrapClient.password", "Zo3QCZ5jLlJofibEiifZyz7B3x6a5Suv2YoS1JAWopA="); + config.setProperty("wrapClient.scope", "http://lodejard.servicebus.windows.net/"); + return config; + } + + @Test + public void fetchQueueAndListQueuesWorks() throws Exception { + // Arrange + Configuration config = createConfiguration(); + ServiceBusContract contract = config.create(ServiceBusContract.class); + + // Act + Entry entry = contract.getQueue("Hello"); + Feed feed = contract.getQueues(); + + // Assert + assertNotNull(entry); + assertNotNull(feed); + } + + @Test + public void createQueueWorks() throws Exception { + // Arrange + Configuration config = createConfiguration(); + ServiceBusContract contract = config.create(ServiceBusContract.class); + + // Act + Entry entry = new Entry(); + Content content = new Content(); + QueueDescription description = new QueueDescription(); + + entry.setTitle("createQueueWorks"); + entry.setContent(content); + content.setType("application/xml"); + content.setQueueDescription(description); + description.setMaxSizeInMegabytes(1024L); + + contract.createQueue(entry); + + // Assert + } + + @Test + public void deleteQueueWorks() throws Exception { + // Arrange + Configuration config = createConfiguration(); + ServiceBusContract contract = config.create(ServiceBusContract.class); + + // Act + assertTrue("won't do this - can't recreate it yet", false); + contract.deleteQueue("Hello"); + + // Assert + } + + @Test + public void sendMessageWorks() throws Exception { + // Arrange + Configuration config = createConfiguration(); + ServiceBusContract contract = config.create(ServiceBusContract.class); + + BrokerProperties props = new BrokerProperties(); + + // Act + contract.sendMessage("Hello", props); + + // Assert + } + + @Test + public void receiveMessageWorks() throws Exception { + // Arrange + Configuration config = createConfiguration(); + ServiceBusContract contract = config.create(ServiceBusContract.class); + + BrokerProperties props = new BrokerProperties(); + + // Act + contract.sendMessage("Hello", props); + contract.receiveMessage("Hello", 500, ReceiveMode.RECEIVE_AND_DELETE); + + // Assert + } +} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java index e895ad667ada..892f96f7b4f0 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java @@ -1,123 +1,134 @@ package com.microsoft.azure.services.serviceBus.contract; +import static org.junit.Assert.*; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.io.StringReader; - +import javax.ws.rs.core.MediaType; import junit.framework.Assert; import org.junit.Test; +import com.microsoft.azure.auth.wrap.WrapFilter; import com.microsoft.azure.configuration.Configuration; -import com.microsoft.azure.services.serviceBus.Entity; import com.microsoft.azure.services.serviceBus.Queue; import com.microsoft.azure.services.serviceBus.ServiceBusClient; -import com.microsoft.azure.services.serviceBus.contract.ServiceBusContractImpl; +import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.filter.LoggingFilter; -import com.sun.jersey.api.representation.Form; +public class QueueManagementIntegrationTest { + private Configuration createConfiguration() { + Configuration config = new Configuration(); + config.setProperty("serviceBus.uri", + "https://lodejard.servicebus.windows.net"); + config.setProperty("wrapClient.uri", + "https://lodejard-sb.accesscontrol.windows.net/WRAPv0.9"); + config.setProperty("wrapClient.scope", + "http://lodejard.servicebus.windows.net/"); + config.setProperty("wrapClient.name", "owner"); + config.setProperty("wrapClient.password", + "Zo3QCZ5jLlJofibEiifZyz7B3x6a5Suv2YoS1JAWopA="); + return config; + } + private ServiceBusClient createClient() throws Exception { + return createConfiguration().create(ServiceBusClient.class); + } + + private static String readResourceFile(String name) throws IOException { + InputStream stream = Thread.currentThread().getContextClassLoader() + .getResourceAsStream(name); + + StringBuffer sb = new StringBuffer(1024); + BufferedReader reader = new BufferedReader( + new InputStreamReader(stream)); + + char[] chars = new char[1024]; + int numRead = 0; + while ((numRead = reader.read(chars)) > -1) { + sb.append(new String(chars, 0, numRead)); + } + + reader.close(); + + return sb.toString(); + } + + @Test + public void createAnyQueue() throws Exception { + + Client client = Client.create(); + client.addFilter(createConfiguration().create(WrapFilter.class)); + client.addFilter(new LoggingFilter()); + String data = readResourceFile("NewFile.xml"); + client.resource("https://lodejard.servicebus.windows.net") + .path("Hello2").delete(); + client.resource("https://lodejard.servicebus.windows.net") + .path("Hello2").type(MediaType.APPLICATION_ATOM_XML).put(data); + + } -public class QueueManagementIntegrationTest { @Test public void queueCanBeCreatedAndDeleted() throws Exception { // Arrange - ServiceBusClient client = new Configuration() - .create(ServiceBusClient.class); - ServiceBusContractImpl contract = (ServiceBusContractImpl) client.getContract(); - contract.getChannel().addFilter(new LoggingFilter()); - - /* - String message = readResourceFile("NewFile.xml"); - - Form form = new Form(); - form.add("wrap_name", "owner"); - form.add("wrap_password", "Zo3QCZ5jLlJofibEiifZyz7B3x6a5Suv2YoS1JAWopA="); - form.add("wrap_scope", "http://lodejard.servicebus.windows.net/"); - - Form wrapResponse = contract.getChannel().resource("https://lodejard-sb.accesscontrol.windows.net/") - .path("WRAPv0.9") - .post(Form.class, form); - String accessToken = wrapResponse.get("wrap_access_token").get(0); - - - contract.getChannel().resource("https://lodejard.servicebus.windows.net/") - .path("Hello") - .header("Authorization", "WRAP access_token=\"" + accessToken + "\"") - //.type("application/atom+xml") - .get(String.class); - - contract.getChannel().resource("https://lodejard.servicebus.windows.net/") - .path("Hello") - .header("Authorization", "WRAP access_token=\"" + accessToken + "\"") - .type("application/atom+xml") - .accept("application/atom+xml") - .put(message); -*/ + ServiceBusClient client = createClient(); + // Act - Queue queue = client.getQueue("Hello"); - queue.fetch(); - queue.setPath("TestQueue01"); + Queue queue = client.getQueue("queueCanBeCreatedAndDeleted"); + queue.setPath("queueCanBeCreatedAndDeleted"); queue.save(); queue.delete(); - + // Assert } - - public static String readResourceFile(String name) throws IOException { - InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream(name); - - StringBuffer sb = new StringBuffer(1024); - BufferedReader reader = new BufferedReader(new InputStreamReader(stream)); - - char[] chars = new char[1024]; - int numRead = 0; - while( (numRead = reader.read(chars)) > -1){ - sb.append(String.valueOf(chars)); + + @Test + public void whenQueueIsCreatedEntityStateIsAlsoUpdated() throws Exception { + // Arrange + ServiceBusClient client = createClient(); + try { + client.getQueue("whenQueueIsCreatedEntityStateIsAlsoUpdated") + .delete(); + } catch (Exception e) { } - reader.close(); + // Act + Queue queue = client.getQueue("whenQueueIsCreatedEntityStateIsAlsoUpdated"); + Long maxSizeBefore = queue.getMaxSizeInMegabytes(); + queue.save(); + Long maxSizeAfter = queue.getMaxSizeInMegabytes(); + queue.delete(); - return sb.toString(); + // Assert + assertNull(maxSizeBefore); + assertNotNull(maxSizeAfter); } - + @Test public void notFoundQueuePathReturnsNull() throws Exception { // Arrange - Configuration cfg = new Configuration(); - - ServiceBusClient client = cfg.create(ServiceBusClient.class); - - - ServiceBusContractImpl contract = (ServiceBusContractImpl) client.getContract(); - contract.getChannel().addFilter(new LoggingFilter()); - + ServiceBusClient client = createClient(); + // Act Queue queue = client.getQueue("NoSuchQueueName"); - + // Assert Assert.assertNull(queue); } - @Test public void existingQueuePathDoesNotReturnNull() throws Exception { // Arrange - ServiceBusClient client = new Configuration() - .create(ServiceBusClient.class); - - ServiceBusContractImpl contract = (ServiceBusContractImpl) client.getContract(); - contract.getChannel().addFilter(new LoggingFilter()); - //contract.getChannel().getProviders(). - - //client.createQueue("TestQueue02"); - + ServiceBusClient client = createClient(); + + // client.createQueue("TestQueue02"); + // Act Queue queue = client.getQueue("Hello"); queue.fetch(); - + // Assert Assert.assertNotNull(queue); Assert.assertEquals("Hello", queue.getPath()); diff --git a/microsoft-azure-api/src/test/resources/NewFile.xml b/microsoft-azure-api/src/test/resources/NewFile.xml index 7b3ea8dffd23..71989d321de1 100644 --- a/microsoft-azure-api/src/test/resources/NewFile.xml +++ b/microsoft-azure-api/src/test/resources/NewFile.xml @@ -1 +1,4 @@ -PT1M1024falsefalseP10675199DT2H48M5SfalsePT10M10true00 + + + + From 27ed63017a8ecddf93d47098dc3fc20b1c8ef97b Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Sat, 22 Oct 2011 20:00:54 -0700 Subject: [PATCH 24/59] Cleaning up tests --- .../services/serviceBus/ServiceBusClient.java | 2 +- .../serviceBus/contract/BrokerProperties.java | 28 ++-- .../contract/ServiceBusContractImpl.java | 1 + .../auth/wrap/WrapClientIntegrationTest.java | 1 - .../serviceBus/IntegrationTestBase.java | 27 ++++ .../QueueManagementIntegrationTest.java | 75 ++++++++++ .../contract/BrokerPropertiesMapperTest.java | 19 ++- .../contract/ContractIntegrationTest.java | 24 ++-- .../QueueManagementIntegrationTest.java | 136 ------------------ 9 files changed, 149 insertions(+), 164 deletions(-) create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java delete mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java index 114a9c159cba..2abc6d76ba6c 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java @@ -39,7 +39,7 @@ public Iterable listQueues() { Feed descriptions = contract.getQueues(); ArrayList queues = new ArrayList(); for (int i = 0; i != descriptions.getEntries().size(); ++i) { - queues.set(i, new Queue(this, descriptions.getEntries().get(i))); + queues.add(new Queue(this, descriptions.getEntries().get(i))); } return queues; } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerProperties.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerProperties.java index ee4c7dfd6a1c..b60438e144df 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerProperties.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerProperties.java @@ -1,37 +1,45 @@ package com.microsoft.azure.services.serviceBus.contract; +import org.codehaus.jackson.annotate.JsonGetter; +import org.codehaus.jackson.annotate.JsonIgnore; +import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; +import org.codehaus.jackson.annotate.JsonWriteNullProperties; +@JsonIgnoreProperties(ignoreUnknown=true) +@JsonWriteNullProperties(false) public class BrokerProperties { @JsonProperty("DeliveryCount") - int deliveryCount; + Integer deliveryCount; @JsonProperty("MessageId") String messageId; @JsonProperty("SequenceNumber") - int sequenceNumber; + Long sequenceNumber; @JsonProperty("TimeToLive") - long timeToLive; + Long timeToLive; /** * @return the deliveryCount */ - public int getDeliveryCount() { + @JsonIgnore + public Integer getDeliveryCount() { return deliveryCount; } /** * @param deliveryCount the deliveryCount to set */ - public void setDeliveryCount(int deliveryCount) { + public void setDeliveryCount(Integer deliveryCount) { this.deliveryCount = deliveryCount; } /** * @return the messageId */ + @JsonIgnore public String getMessageId() { return messageId; } @@ -46,28 +54,30 @@ public void setMessageId(String messageId) { /** * @return the sequenceNumber */ - public int getSequenceNumber() { + @JsonIgnore + public Long getSequenceNumber() { return sequenceNumber; } /** * @param sequenceNumber the sequenceNumber to set */ - public void setSequenceNumber(int sequenceNumber) { + public void setSequenceNumber(Long sequenceNumber) { this.sequenceNumber = sequenceNumber; } /** * @return the timeToLive */ - public long getTimeToLive() { + @JsonIgnore + public Long getTimeToLive() { return timeToLive; } /** * @param timeToLive the timeToLive to set */ - public void setTimeToLive(long timeToLive) { + public void setTimeToLive(Long timeToLive) { this.timeToLive = timeToLive; } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java index 670ca2e7515a..7784d77d46bc 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java @@ -44,6 +44,7 @@ public void sendMessage(String path, BrokerProperties properties) { .path(path) .path("messages") .header("BrokerProperties", mapper.toString(properties)) + .header("Content-Length", 11) .post("Hello world"); } diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientIntegrationTest.java index 3c8221951a3a..67976043920f 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientIntegrationTest.java @@ -9,7 +9,6 @@ public class WrapClientIntegrationTest { private Configuration createConfiguration() { Configuration config = new Configuration(); - config.setProperty("serviceBus.uri", "https://lodejard.servicebus.windows.net"); config.setProperty("wrapClient.uri", "https://lodejard-sb.accesscontrol.windows.net/WRAPv0.9"); config.setProperty("wrapClient.scope", "http://lodejard.servicebus.windows.net/"); config.setProperty("wrapClient.name", "owner"); diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java new file mode 100644 index 000000000000..6085b74aa8a4 --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java @@ -0,0 +1,27 @@ +package com.microsoft.azure.services.serviceBus; + +import org.junit.Before; + +import com.microsoft.azure.configuration.Configuration; + +public abstract class IntegrationTestBase { + protected Configuration createConfiguration() { + Configuration config = new Configuration(); + config.setProperty("serviceBus.uri", "https://lodejard.servicebus.windows.net"); + config.setProperty("wrapClient.uri", "https://lodejard-sb.accesscontrol.windows.net/WRAPv0.9"); + config.setProperty("wrapClient.name", "owner"); + config.setProperty("wrapClient.password", "Zo3QCZ5jLlJofibEiifZyz7B3x6a5Suv2YoS1JAWopA="); + config.setProperty("wrapClient.scope", "http://lodejard.servicebus.windows.net/"); + return config; + } + + @Before + public void initialize() throws Exception { + ServiceBusClient client = createConfiguration().create(ServiceBusClient.class); + for(Queue queue : client.listQueues()){ + if (queue.getPath().startsWith("Test") || queue.getPath().startsWith("test")) + queue.delete(); + } + client.getQueue("TestAlpha").save(); + } +} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java new file mode 100644 index 000000000000..35a0cf05ff7a --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java @@ -0,0 +1,75 @@ +package com.microsoft.azure.services.serviceBus; + +import static org.junit.Assert.*; + +import junit.framework.Assert; + +import org.junit.Test; + +import com.microsoft.azure.services.serviceBus.Queue; +import com.microsoft.azure.services.serviceBus.ServiceBusClient; + +public class QueueManagementIntegrationTest extends IntegrationTestBase { + + private ServiceBusClient createClient() throws Exception { + return createConfiguration().create(ServiceBusClient.class); + } + + @Test + public void queueCanBeCreatedAndDeleted() throws Exception { + // Arrange + ServiceBusClient client = createClient(); + + // Act + Queue queue = client.getQueue("TestQueueCanBeCreatedAndDeleted"); + queue.save(); + queue.delete(); + + // Assert + } + + @Test + public void whenQueueIsCreatedEntityStateIsAlsoUpdated() throws Exception { + // Arrange + ServiceBusClient client = createClient(); + + // Act + Queue queue = client.getQueue("TestWhenQueueIsCreatedEntityStateIsAlsoUpdated"); + Long maxSizeBefore = queue.getMaxSizeInMegabytes(); + queue.save(); + Long maxSizeAfter = queue.getMaxSizeInMegabytes(); + queue.delete(); + + // Assert + assertNull(maxSizeBefore); + assertNotNull(maxSizeAfter); + } + + @Test + public void notFoundQueuePathReturnsNull() throws Exception { + // Arrange + ServiceBusClient client = createClient(); + + // Act + Queue queue = client.getQueue("NoSuchQueueName"); + + // Assert + Assert.assertNull(queue); + } + + @Test + public void existingQueuePathDoesNotReturnNull() throws Exception { + // Arrange + ServiceBusClient client = createClient(); + + // client.createQueue("TestQueue02"); + + // Act + Queue queue = client.getQueue("Hello"); + queue.fetch(); + + // Assert + Assert.assertNotNull(queue); + Assert.assertEquals("Hello", queue.getPath()); + } +} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/BrokerPropertiesMapperTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/BrokerPropertiesMapperTest.java index 076d58b8a552..30b8f77f6275 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/BrokerPropertiesMapperTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/BrokerPropertiesMapperTest.java @@ -11,9 +11,26 @@ public void jsonStringMapsToBrokerPropertiesObject(){ BrokerPropertiesMapper mapper = new BrokerPropertiesMapper(); // Act - BrokerProperties properties = mapper.fromString("{}"); + BrokerProperties properties = mapper.fromString("{\"DeliveryCount\":5,\"MessageId\":\"something\"}"); // Assert assertNotNull(properties); + assertEquals(new Integer(5), properties.getDeliveryCount()); + assertEquals("something", properties.getMessageId()); + } + + @Test + public void nonDefaultPropertiesMapToJsonString(){ + // Arrange + BrokerPropertiesMapper mapper = new BrokerPropertiesMapper(); + // Act + BrokerProperties properties = new BrokerProperties(); + properties.setMessageId("foo"); + properties.setDeliveryCount(7); + String json = mapper.toString(properties); + + // Assert + assertNotNull(json); + assertEquals("{\"DeliveryCount\":7,\"MessageId\":\"foo\"}", json); } } diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java index a50d914d2b39..0de76c695dff 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java @@ -6,18 +6,11 @@ import org.w3._2005.atom.Feed; import com.microsoft.azure.configuration.Configuration; +import com.microsoft.azure.services.serviceBus.IntegrationTestBase; + import static org.junit.Assert.*; -public class ContractIntegrationTest { - private Configuration createConfiguration() { - Configuration config = new Configuration(); - config.setProperty("serviceBus.uri", "https://lodejard.servicebus.windows.net"); - config.setProperty("wrapClient.uri", "https://lodejard-sb.accesscontrol.windows.net/WRAPv0.9"); - config.setProperty("wrapClient.name", "owner"); - config.setProperty("wrapClient.password", "Zo3QCZ5jLlJofibEiifZyz7B3x6a5Suv2YoS1JAWopA="); - config.setProperty("wrapClient.scope", "http://lodejard.servicebus.windows.net/"); - return config; - } +public class ContractIntegrationTest extends IntegrationTestBase { @Test public void fetchQueueAndListQueuesWorks() throws Exception { @@ -45,7 +38,7 @@ public void createQueueWorks() throws Exception { Content content = new Content(); QueueDescription description = new QueueDescription(); - entry.setTitle("createQueueWorks"); + entry.setTitle("TestCreateQueueWorks"); entry.setContent(content); content.setType("application/xml"); content.setQueueDescription(description); @@ -63,8 +56,7 @@ public void deleteQueueWorks() throws Exception { ServiceBusContract contract = config.create(ServiceBusContract.class); // Act - assertTrue("won't do this - can't recreate it yet", false); - contract.deleteQueue("Hello"); + contract.deleteQueue("TestAlpha"); // Assert } @@ -78,7 +70,7 @@ public void sendMessageWorks() throws Exception { BrokerProperties props = new BrokerProperties(); // Act - contract.sendMessage("Hello", props); + contract.sendMessage("TestAlpha", props); // Assert } @@ -92,8 +84,8 @@ public void receiveMessageWorks() throws Exception { BrokerProperties props = new BrokerProperties(); // Act - contract.sendMessage("Hello", props); - contract.receiveMessage("Hello", 500, ReceiveMode.RECEIVE_AND_DELETE); + contract.sendMessage("TestAlpha", props); + contract.receiveMessage("TestAlpha", 500, ReceiveMode.RECEIVE_AND_DELETE); // Assert } diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java deleted file mode 100644 index 892f96f7b4f0..000000000000 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/QueueManagementIntegrationTest.java +++ /dev/null @@ -1,136 +0,0 @@ -package com.microsoft.azure.services.serviceBus.contract; - -import static org.junit.Assert.*; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import javax.ws.rs.core.MediaType; -import junit.framework.Assert; - -import org.junit.Test; - -import com.microsoft.azure.auth.wrap.WrapFilter; -import com.microsoft.azure.configuration.Configuration; -import com.microsoft.azure.services.serviceBus.Queue; -import com.microsoft.azure.services.serviceBus.ServiceBusClient; -import com.sun.jersey.api.client.Client; -import com.sun.jersey.api.client.filter.LoggingFilter; - -public class QueueManagementIntegrationTest { - private Configuration createConfiguration() { - Configuration config = new Configuration(); - config.setProperty("serviceBus.uri", - "https://lodejard.servicebus.windows.net"); - config.setProperty("wrapClient.uri", - "https://lodejard-sb.accesscontrol.windows.net/WRAPv0.9"); - config.setProperty("wrapClient.scope", - "http://lodejard.servicebus.windows.net/"); - config.setProperty("wrapClient.name", "owner"); - config.setProperty("wrapClient.password", - "Zo3QCZ5jLlJofibEiifZyz7B3x6a5Suv2YoS1JAWopA="); - return config; - } - - private ServiceBusClient createClient() throws Exception { - return createConfiguration().create(ServiceBusClient.class); - } - - private static String readResourceFile(String name) throws IOException { - InputStream stream = Thread.currentThread().getContextClassLoader() - .getResourceAsStream(name); - - StringBuffer sb = new StringBuffer(1024); - BufferedReader reader = new BufferedReader( - new InputStreamReader(stream)); - - char[] chars = new char[1024]; - int numRead = 0; - while ((numRead = reader.read(chars)) > -1) { - sb.append(new String(chars, 0, numRead)); - } - - reader.close(); - - return sb.toString(); - } - - @Test - public void createAnyQueue() throws Exception { - - Client client = Client.create(); - client.addFilter(createConfiguration().create(WrapFilter.class)); - client.addFilter(new LoggingFilter()); - String data = readResourceFile("NewFile.xml"); - client.resource("https://lodejard.servicebus.windows.net") - .path("Hello2").delete(); - client.resource("https://lodejard.servicebus.windows.net") - .path("Hello2").type(MediaType.APPLICATION_ATOM_XML).put(data); - - } - - @Test - public void queueCanBeCreatedAndDeleted() throws Exception { - // Arrange - ServiceBusClient client = createClient(); - - // Act - Queue queue = client.getQueue("queueCanBeCreatedAndDeleted"); - queue.setPath("queueCanBeCreatedAndDeleted"); - queue.save(); - queue.delete(); - - // Assert - } - - @Test - public void whenQueueIsCreatedEntityStateIsAlsoUpdated() throws Exception { - // Arrange - ServiceBusClient client = createClient(); - try { - client.getQueue("whenQueueIsCreatedEntityStateIsAlsoUpdated") - .delete(); - } catch (Exception e) { - } - - // Act - Queue queue = client.getQueue("whenQueueIsCreatedEntityStateIsAlsoUpdated"); - Long maxSizeBefore = queue.getMaxSizeInMegabytes(); - queue.save(); - Long maxSizeAfter = queue.getMaxSizeInMegabytes(); - queue.delete(); - - // Assert - assertNull(maxSizeBefore); - assertNotNull(maxSizeAfter); - } - - @Test - public void notFoundQueuePathReturnsNull() throws Exception { - // Arrange - ServiceBusClient client = createClient(); - - // Act - Queue queue = client.getQueue("NoSuchQueueName"); - - // Assert - Assert.assertNull(queue); - } - - @Test - public void existingQueuePathDoesNotReturnNull() throws Exception { - // Arrange - ServiceBusClient client = createClient(); - - // client.createQueue("TestQueue02"); - - // Act - Queue queue = client.getQueue("Hello"); - queue.fetch(); - - // Assert - Assert.assertNotNull(queue); - Assert.assertEquals("Hello", queue.getPath()); - } -} From 72e88d5a39ad1c9d79023fce5b032b8a427cfdd9 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 24 Oct 2011 12:18:06 -0700 Subject: [PATCH 25/59] Updating tests and implementation Adding idea of configuration profile to scope settings Disable keep-alive in tests for unit testing --- .../microsoft/azure/auth/wrap/WrapClient.java | 8 +- .../azure/configuration/Configuration.java | 10 ++- .../azure/configuration/builder/Builder.java | 4 +- .../configuration/builder/DefaultBuilder.java | 53 +++++++++--- .../azure/configuration/jersey/Exports.java | 4 +- .../contract/ServiceBusContractImpl.java | 3 +- .../builder/DefaultBuilderTest.java | 84 +++++++++++++++---- .../serviceBus/IntegrationTestBase.java | 16 +++- .../contract/ContractIntegrationTest.java | 5 +- 9 files changed, 139 insertions(+), 48 deletions(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java index 6a73544593d9..690af85b7baa 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java @@ -15,10 +15,10 @@ public class WrapClient { @Inject public WrapClient( WrapContract contract, - @Named("wrapClient.uri") String uri, - @Named("wrapClient.scope") String scope, - @Named("wrapClient.name") String name, - @Named("wrapClient.password") String password) { + @Named("wrap.uri") String uri, + @Named("wrap.scope") String scope, + @Named("wrap.name") String name, + @Named("wrap.password") String password) { this.contract = contract; this.uri = uri; this.scope = scope; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java index 1df1025fcddf..ec8918e90312 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/Configuration.java @@ -31,7 +31,7 @@ private void init() { // DefaultClientConfig clientConfig = new DefaultClientConfig(); // clientConfig.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, true); try { - setProperty("ClientConfig", builder.build(ClientConfig.class, properties)); + setProperty("ClientConfig", builder.build("", ClientConfig.class, properties)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); @@ -44,9 +44,13 @@ public static Configuration load() { } public T create(Class service) throws Exception { - return builder.build(service, properties); + return builder.build("", service, properties); } - + + public T create(String profile, Class service) throws Exception { + return builder.build(profile, service, properties); + } + public Builder getBuilder() { return builder; } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java index 338ab12ba6c4..60b9aa3578af 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/Builder.java @@ -5,10 +5,10 @@ public interface Builder { - public abstract T build(Class service, Map properties) throws Exception; + public abstract T build(String profile, Class service, Map properties) throws Exception; public interface Factory { - T create(Builder builder, Map properties) throws Exception; + T create(String profile, Builder builder, Map properties) throws Exception; } public interface Alteration { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java index 455bad294965..753026bdc819 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java @@ -76,26 +76,34 @@ public Builder.Registry add(Class service, final Class impl addFactory(service, new Builder.Factory() { @SuppressWarnings("unchecked") - public T create(Builder builder, Map properties) throws Exception { + public T create(String profile, Builder builder, Map properties) throws Exception { Object[] initargs = new Object[parameterTypes.length]; for(int i = 0; i != parameterTypes.length; ++i) { + boolean located = false; - Annotation[] annotations = parameterAnnotations[i]; - for(int ii = 0; ii != annotations.length && !located; ++ii){ - if (Named.class.isAssignableFrom(annotations[ii].getClass())) { + String named = findNamedAnnotation(parameterAnnotations[i]); + String fullName = dotCombine(profile, named); + + boolean probeProperties = fullName != null && fullName != ""; + int startingIndex = 0; + while(!located && probeProperties) { + String probeName = fullName.substring(startingIndex); + if (!located && named != null && properties.containsKey(probeName)){ located = true; - - Named named = (Named)annotations[ii]; - if (!properties.containsKey(named.value())) { - throw new RuntimeException("Configuration missing required property: " + named.value()); + initargs[i] = properties.get(probeName); + } + else { + startingIndex = fullName.indexOf('.', startingIndex) + 1; + if (startingIndex == 0) { + probeProperties = false; } - initargs[i] = properties.get(named.value()); } } if (!located) { - initargs[i] = builder.build(parameterTypes[i], properties); + located = true; + initargs[i] = builder.build(fullName, parameterTypes[i], properties); } } @@ -106,6 +114,25 @@ public T create(Builder builder, Map properties) throws Exception } + protected String dotCombine(String profile, String named) { + boolean noProfile = profile == null || profile == ""; + boolean noName = named == null || named == ""; + if (noName) + return profile; + if (noProfile) + return named; + return profile + "." + named; + } + + protected String findNamedAnnotation(Annotation[] annotations) { + for(Annotation annotation : annotations){ + if (Named.class.isAssignableFrom(annotation.getClass())){ + return ((Named)annotation).value(); + } + } + return null; + } + public Registry add(Factory factory) { for(Type genericInterface : factory.getClass().getGenericInterfaces()) { @@ -120,12 +147,12 @@ public Registry add(Factory factory) { @SuppressWarnings("unchecked") - public T build(Class service, Map properties) throws Exception { + public T build(String profile, Class service, Map properties) throws Exception { Factory factory = (Factory) factories.get(service); if (factory == null) { - throw new RuntimeException("Service not registered: " + service.getName()); + throw new RuntimeException("Service not registered: " + profile + " " + service.getName()); } - T instance = factory.create(this, properties); + T instance = factory.create(profile, this, properties); List> alterationList = alterations.get(service); if (alterationList != null){ for(Alteration alteration : alterationList){ diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java index 571035b1c67f..cb67dd940196 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java @@ -13,13 +13,13 @@ public class Exports implements Builder.Exports { public void register(Registry registry) { registry.add(new Builder.Factory() { - public ClientConfig create(Builder builder, Map properties) { + public ClientConfig create(String profile, Builder builder, Map properties) { return new DefaultClientConfig(); } }); registry.add(new Builder.Factory() { - public Client create(Builder builder, Map properties) { + public Client create(String profile, Builder builder, Map properties) { ClientConfig clientConfig = (ClientConfig) properties.get("ClientConfig"); Client client = Client.create(clientConfig); client.addFilter(new LoggingFilter()); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java index 7784d77d46bc..2d252becb343 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java @@ -21,7 +21,8 @@ public class ServiceBusContractImpl implements ServiceBusContract { @Inject public ServiceBusContractImpl( - Client channel, WrapFilter authFilter, + Client channel, + @Named("serviceBus") WrapFilter authFilter, @Named("serviceBus.uri") String uri, BrokerPropertiesMapper mapper) { diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/DefaultBuilderTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/DefaultBuilderTest.java index cf4b105cd0a8..df7761cb40b2 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/DefaultBuilderTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/configuration/builder/DefaultBuilderTest.java @@ -5,25 +5,34 @@ import junit.framework.Assert; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; public class DefaultBuilderTest { + Map properties; + DefaultBuilder builder; + @Rule public ExpectedException thrown = ExpectedException.none(); + @Before + public void init() { + properties = new HashMap(); + builder = new DefaultBuilder(); + } + @Test public void namedAnnotationsComeFromBuildProperties() throws Exception { // Arrange - DefaultBuilder builder = new DefaultBuilder(); builder.add(ClassWithNamedParameter.class); // Act Map properties = new HashMap(); properties.put("Foo", "world"); - ClassWithNamedParameter cwnp = builder.build( + ClassWithNamedParameter cwnp = builder.build("", ClassWithNamedParameter.class, properties); // Assert @@ -35,12 +44,10 @@ public void namedAnnotationReportsMissingProperty() throws Exception { // Arrange thrown.expect(RuntimeException.class); - Map properties = new HashMap(); - DefaultBuilder builder = new DefaultBuilder(); builder.add(ClassWithNamedParameter.class); // Act - ClassWithNamedParameter cwnp = builder.build( + ClassWithNamedParameter cwnp = builder.build("", ClassWithNamedParameter.class, properties); // Assert @@ -50,12 +57,10 @@ public void namedAnnotationReportsMissingProperty() throws Exception { @Test public void singleCtorWithNoInjectShouldBeUsed() throws Exception { // Arrange - Map properties = new HashMap(); - DefaultBuilder builder = new DefaultBuilder(); builder.add(ClassWithSingleCtorNoInject.class); // Act - ClassWithSingleCtorNoInject result = builder.build( + ClassWithSingleCtorNoInject result = builder.build("", ClassWithSingleCtorNoInject.class, properties); // Assert @@ -67,12 +72,10 @@ public void multipleCtorWithNoInjectShouldFail() throws Exception { // Arrange thrown.expect(RuntimeException.class); - Map properties = new HashMap(); - DefaultBuilder builder = new DefaultBuilder(); builder.add(ClassWithMultipleCtorNoInject.class); // Act - ClassWithMultipleCtorNoInject result = builder.build( + ClassWithMultipleCtorNoInject result = builder.build("", ClassWithMultipleCtorNoInject.class, properties); // Assert @@ -84,12 +87,10 @@ public void multipleCtorWithMultipleInjectShouldFail() throws Exception { // Arrange thrown.expect(RuntimeException.class); - Map properties = new HashMap(); - DefaultBuilder builder = new DefaultBuilder(); builder.add(ClassWithMultipleCtorMultipleInject.class); // Act - ClassWithMultipleCtorMultipleInject result = builder.build( + ClassWithMultipleCtorMultipleInject result = builder.build("", ClassWithMultipleCtorMultipleInject.class, properties); // Assert @@ -99,15 +100,64 @@ public void multipleCtorWithMultipleInjectShouldFail() throws Exception { @Test public void alterationExecutesWhenInstanceCreated() throws Exception { // Arrange - Map properties = new HashMap(); - DefaultBuilder builder = new DefaultBuilder(); builder.add(ClassWithProperties.class); builder.alter(ClassWithProperties.class, new AlterClassWithProperties()); // Act - ClassWithProperties result = builder.build(ClassWithProperties.class, properties); + ClassWithProperties result = builder.build("",ClassWithProperties.class, properties); // Assert Assert.assertEquals("one - changed", result.getFoo()); } + + @Test + public void namedParametersUseProfileBasedKeysFirst() throws Exception { + // Arrange + builder.add(ClassWithNamedParameter.class); + properties.put("Foo", "fallback"); + properties.put("testing.Foo", "Profile foo value"); + + // Act + ClassWithNamedParameter result = builder.build("testing", ClassWithNamedParameter.class, properties); + + // Assert + Assert.assertEquals("Profile foo value", result.getHello()); + } + + @Test + public void namedParametersFallBackToNonProfileBasedKeys() throws Exception { + // Arrange + builder.add(ClassWithNamedParameter.class); + properties.put("Foo", "fallback"); + properties.put("testing.Foo", "Profile foo value"); + + // Act + ClassWithNamedParameter result1 = builder.build("", ClassWithNamedParameter.class, properties); + ClassWithNamedParameter result2 = builder.build("production", ClassWithNamedParameter.class, properties); + ClassWithNamedParameter result3 = builder.build("testing.custom", ClassWithNamedParameter.class, properties); + + // Assert + Assert.assertEquals("fallback", result1.getHello()); + Assert.assertEquals("fallback", result2.getHello()); + Assert.assertEquals("fallback", result2.getHello()); + } + + @Test + public void namedParamatersFallBackFromLeftToRight() throws Exception { + // Arrange + builder.add(ClassWithNamedParameter.class); + properties.put("Foo", "fallback"); + properties.put("custom.Foo", "custom.Foo value"); + properties.put("testing.custom.Foo", "testing.custom.Foo value"); + + // Act + ClassWithNamedParameter result1 = builder.build("custom", ClassWithNamedParameter.class, properties); + ClassWithNamedParameter result2 = builder.build("production.custom", ClassWithNamedParameter.class, properties); + ClassWithNamedParameter result3 = builder.build("testing.custom", ClassWithNamedParameter.class, properties); + + // Assert + Assert.assertEquals("custom.Foo value", result1.getHello()); + Assert.assertEquals("custom.Foo value", result2.getHello()); + Assert.assertEquals("testing.custom.Foo value", result3.getHello()); + } } \ No newline at end of file diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java index 6085b74aa8a4..7bf247d9c337 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java @@ -8,15 +8,23 @@ public abstract class IntegrationTestBase { protected Configuration createConfiguration() { Configuration config = new Configuration(); config.setProperty("serviceBus.uri", "https://lodejard.servicebus.windows.net"); - config.setProperty("wrapClient.uri", "https://lodejard-sb.accesscontrol.windows.net/WRAPv0.9"); - config.setProperty("wrapClient.name", "owner"); - config.setProperty("wrapClient.password", "Zo3QCZ5jLlJofibEiifZyz7B3x6a5Suv2YoS1JAWopA="); - config.setProperty("wrapClient.scope", "http://lodejard.servicebus.windows.net/"); + config.setProperty("serviceBus.wrap.uri", "https://lodejard-sb.accesscontrol.windows.net/WRAPv0.9"); + config.setProperty("serviceBus.wrap.name", "owner"); + config.setProperty("serviceBus.wrap.password", "Zo3QCZ5jLlJofibEiifZyz7B3x6a5Suv2YoS1JAWopA="); + config.setProperty("serviceBus.wrap.scope", "http://lodejard.servicebus.windows.net/"); + + // when mock running + //config.setProperty("serviceBus.uri", "http://localhost:8086"); + //config.setProperty("wrapClient.uri", "http://localhost:8081/WRAPv0.9"); + return config; } @Before public void initialize() throws Exception { + + System.setProperty("http.keepAlive", "false"); + ServiceBusClient client = createConfiguration().create(ServiceBusClient.class); for(Queue queue : client.listQueues()){ if (queue.getPath().startsWith("Test") || queue.getPath().startsWith("test")) diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java index 0de76c695dff..e83526b05bef 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java @@ -12,6 +12,7 @@ public class ContractIntegrationTest extends IntegrationTestBase { + @Test public void fetchQueueAndListQueuesWorks() throws Exception { // Arrange @@ -19,7 +20,7 @@ public void fetchQueueAndListQueuesWorks() throws Exception { ServiceBusContract contract = config.create(ServiceBusContract.class); // Act - Entry entry = contract.getQueue("Hello"); + Entry entry = contract.getQueue("TestAlpha"); Feed feed = contract.getQueues(); // Assert @@ -44,7 +45,7 @@ public void createQueueWorks() throws Exception { content.setQueueDescription(description); description.setMaxSizeInMegabytes(1024L); - contract.createQueue(entry); + Entry entry2 = contract.createQueue(entry); // Assert } From 6a326e90ae320d61fa07c7338278de83ecc3cdd8 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 24 Oct 2011 12:42:23 -0700 Subject: [PATCH 26/59] Trying to work around SB quirks in unit tests --- .../serviceBus/IntegrationTestBase.java | 21 +++++++++++++++---- .../contract/ContractIntegrationTest.java | 12 ++++++++++- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java index 7bf247d9c337..cce7a5080d4c 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java @@ -22,14 +22,27 @@ protected Configuration createConfiguration() { @Before public void initialize() throws Exception { - + System.setProperty("http.proxyHost", "157.54.119.101"); + System.setProperty("http.proxyPort", "80"); System.setProperty("http.keepAlive", "false"); + boolean testAlphaExists = false; ServiceBusClient client = createConfiguration().create(ServiceBusClient.class); for(Queue queue : client.listQueues()){ - if (queue.getPath().startsWith("Test") || queue.getPath().startsWith("test")) - queue.delete(); + if (queue.getPath().startsWith("Test") || queue.getPath().startsWith("test")) { + if (queue.getPath() == "testalpha") { + testAlphaExists = true; + long count = queue.getMessageCount(); + for(long i = 0; i != count; ++i) { + queue.receiveMessage(2000); + } + } else { + queue.delete(); + } + } + } + if (!testAlphaExists) { + client.getQueue("TestAlpha").save(); } - client.getQueue("TestAlpha").save(); } } diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java index e83526b05bef..b43dd5260a60 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java @@ -57,7 +57,17 @@ public void deleteQueueWorks() throws Exception { ServiceBusContract contract = config.create(ServiceBusContract.class); // Act - contract.deleteQueue("TestAlpha"); + Entry entry = new Entry(); + Content content = new Content(); + QueueDescription description = new QueueDescription(); + + entry.setTitle("TestDeleteQueueWorks"); + entry.setContent(content); + content.setType("application/xml"); + content.setQueueDescription(description); + contract.createQueue(entry); + + contract.deleteQueue("TestDeleteQueueWorks"); // Assert } From 0b79ea30a194e2036e5be6e9c3073c086857099f Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 24 Oct 2011 12:52:47 -0700 Subject: [PATCH 27/59] Ignoring npm artifacts, if present --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index beef00d01653..8c1a51c48c71 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .project .settings target +node_modules From cbc95b6521f6f2ec368a58ef92fa37265794f186 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 24 Oct 2011 15:14:24 -0700 Subject: [PATCH 28/59] Giving WrapClient ability to cache most recent token Using 1/2 advertised lease time as conservative token renewal point Thread safe, but does not prevent concurrent token requests Most recent token response would be cached in that condition --- .../microsoft/azure/auth/wrap/WrapClient.java | 59 ++++++++- .../auth/wrap/contract/WrapContractImpl.java | 6 +- .../auth/wrap/contract/WrapResponse.java | 6 +- .../java/com/microsoft/azure/utils/Clock.java | 7 ++ .../microsoft/azure/utils/DefaultClock.java | 10 ++ .../com/microsoft/azure/utils/Exports.java | 13 ++ ...zure.configuration.builder.Builder$Exports | 1 + .../azure/auth/wrap/WrapClientTest.java | 116 ++++++++++++++++++ 8 files changed, 213 insertions(+), 5 deletions(-) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/utils/Clock.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/utils/DefaultClock.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/utils/Exports.java create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientTest.java diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java index 690af85b7baa..76d7656a8bfc 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java @@ -1,25 +1,37 @@ package com.microsoft.azure.auth.wrap; +import java.util.Date; + import javax.inject.Inject; import javax.inject.Named; +import javax.management.timer.Timer; import com.microsoft.azure.auth.wrap.contract.WrapContract; +import com.microsoft.azure.auth.wrap.contract.WrapResponse; +import com.microsoft.azure.utils.Clock; public class WrapClient { + WrapContract contract; + private Clock clock; private String uri; private String name; private String password; private String scope; + + private ActiveToken activeToken; + @Inject public WrapClient( WrapContract contract, + Clock clock, @Named("wrap.uri") String uri, @Named("wrap.scope") String scope, @Named("wrap.name") String name, @Named("wrap.password") String password) { this.contract = contract; + this.clock = clock; this.uri = uri; this.scope = scope; this.name = name; @@ -42,6 +54,51 @@ public void setContract(WrapContract contract) { } public String getAccessToken() { - return getContract().post(uri, name, password, scope).getAccessToken(); + Date now = clock.getNow(); + ActiveToken active = this.activeToken; + + if (active != null && now.before(active.getExpiresUtc()) ) { + return active.getWrapResponse().getAccessToken(); + } + + WrapResponse wrapResponse = getContract().post(uri, name, password, scope); + Date expiresUtc = new Date(now.getTime() + wrapResponse.getExpiresIn() * Timer.ONE_SECOND / 2); + + ActiveToken acquired = new ActiveToken(); + acquired.setWrapResponse(wrapResponse); + acquired.setExpiresUtc(expiresUtc); + this.activeToken = acquired; + + return wrapResponse.getAccessToken(); + } + + class ActiveToken { + Date expiresUtc; + WrapResponse wrapResponse; + /** + * @return the expiresUtc + */ + public Date getExpiresUtc() { + return expiresUtc; + } + /** + * @param expiresUtc the expiresUtc to set + */ + public void setExpiresUtc(Date expiresUtc) { + this.expiresUtc = expiresUtc; + } + /** + * @return the wrapResponse + */ + public WrapResponse getWrapResponse() { + return wrapResponse; + } + /** + * @param wrapResponse the wrapResponse to set + */ + public void setWrapResponse(WrapResponse wrapResponse) { + this.wrapResponse = wrapResponse; + } } + } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContractImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContractImpl.java index 19a0dda3c9b2..170cafae7e38 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContractImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContractImpl.java @@ -26,8 +26,12 @@ public WrapResponse post(String uri, String name, String password, String scope) .post(Form.class, requestForm); WrapResponse response = new WrapResponse(); + response.setAccessToken(responseForm.getFirst("wrap_access_token")); - response.setExpiresIn(responseForm.getFirst("wrap_access_token_expires_in")); + + String expiresIn = responseForm.getFirst("wrap_access_token_expires_in"); + response.setExpiresIn(Long.parseLong(expiresIn)); + return response; } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapResponse.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapResponse.java index b007f98cdd30..5032e699947c 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapResponse.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapResponse.java @@ -2,7 +2,7 @@ public class WrapResponse { String accessToken; - String expiresIn; + long expiresIn; /** * @return the accessToken @@ -19,13 +19,13 @@ public void setAccessToken(String accessToken) { /** * @return the expiresIn */ - public String getExpiresIn() { + public long getExpiresIn() { return expiresIn; } /** * @param expiresIn the expiresIn to set */ - public void setExpiresIn(String expiresIn) { + public void setExpiresIn(long expiresIn) { this.expiresIn = expiresIn; } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/Clock.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/Clock.java new file mode 100644 index 000000000000..f36df655abaa --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/Clock.java @@ -0,0 +1,7 @@ +package com.microsoft.azure.utils; + +import java.util.Date; + +public interface Clock { + Date getNow(); +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/DefaultClock.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/DefaultClock.java new file mode 100644 index 000000000000..a095e12d1b63 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/DefaultClock.java @@ -0,0 +1,10 @@ +package com.microsoft.azure.utils; + +import java.util.Date; + +public class DefaultClock implements Clock { + + public Date getNow() { + return new Date(); + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/Exports.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/Exports.java new file mode 100644 index 000000000000..a70cbd4e1437 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/Exports.java @@ -0,0 +1,13 @@ +package com.microsoft.azure.utils; + +import com.microsoft.azure.configuration.builder.Builder.Registry; + +public class Exports implements + com.microsoft.azure.configuration.builder.Builder.Exports { + + public void register(Registry registry) { + registry.add(Clock.class, DefaultClock.class); + + } + +} diff --git a/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports b/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports index a582f449caaa..bf00c0b1abe7 100644 --- a/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports +++ b/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports @@ -1,3 +1,4 @@ +com.microsoft.azure.auth.wrap.utils.Exports com.microsoft.azure.auth.wrap.Exports com.microsoft.azure.configuration.jersey.Exports com.microsoft.azure.services.serviceBus.Exports diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientTest.java new file mode 100644 index 000000000000..7d27b6289581 --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientTest.java @@ -0,0 +1,116 @@ +package com.microsoft.azure.auth.wrap; + +import java.util.Calendar; +import java.util.Date; +import java.util.TimeZone; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.*; + +import com.microsoft.azure.auth.wrap.contract.WrapContract; +import com.microsoft.azure.auth.wrap.contract.WrapResponse; +import com.microsoft.azure.utils.Clock; + +public class WrapClientTest { + private WrapContract contract; + private WrapClient client; + private Clock clock; + private Calendar calendar; + + @Before + public void init() { + calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + + clock = mock(Clock.class); + contract = mock(WrapContract.class); + client = new WrapClient( + contract, + clock, + "testurl", + "testscope", + "testname", + "testpassword"); + + when(clock.getNow()).thenAnswer(new Answer() { + public Date answer(InvocationOnMock invocation) throws Throwable { + return calendar.getTime(); + } + }); + + } + + @Test + public void clientUsesContractToGetToken(){ + // Arrange + WrapResponse wrapResponse = new WrapResponse(); + wrapResponse.setAccessToken("testaccesstoken"); + wrapResponse.setExpiresIn(83); + + when(contract.post("testurl", "testname", "testpassword", "testscope")).thenReturn(wrapResponse); + + // Act + String accessToken = client.getAccessToken(); + + // Assert + assertNotNull(accessToken); + assertEquals("testaccesstoken", accessToken); + } + + + @Test + public void clientWillNotCallMultipleTimesWhileAccessTokenIsValid(){ + // Arrange + WrapResponse wrapResponse = new WrapResponse(); + wrapResponse.setAccessToken("testaccesstoken"); + wrapResponse.setExpiresIn(83); + + when(contract.post("testurl", "testname", "testpassword", "testscope")).thenReturn(wrapResponse); + + // Act + String accessToken1 = client.getAccessToken(); + String accessToken2 = client.getAccessToken(); + calendar.add(Calendar.SECOND, 40); + String accessToken3 = client.getAccessToken(); + + // Assert + assertEquals("testaccesstoken", accessToken1); + assertEquals("testaccesstoken", accessToken2); + assertEquals("testaccesstoken", accessToken3); + + verify(contract, times(1)).post("testurl", "testname", "testpassword", "testscope"); + } + + @Test + public void clientWillBeCalledWhenTokenIsHalfwayToExpiring(){ + // Arrange + doAnswer(new Answer() { + int count = 0; + public WrapResponse answer(InvocationOnMock invocation) throws Throwable { + ++count; + WrapResponse wrapResponse = new WrapResponse(); + wrapResponse.setAccessToken("testaccesstoken" + count); + wrapResponse.setExpiresIn(83); + return wrapResponse; + } + }).when(contract).post("testurl", "testname", "testpassword", "testscope"); + + // Act + String accessToken1 = client.getAccessToken(); + String accessToken2 = client.getAccessToken(); + calendar.add(Calendar.SECOND, 45); + String accessToken3 = client.getAccessToken(); + + // Assert + assertEquals("testaccesstoken1", accessToken1); + assertEquals("testaccesstoken1", accessToken2); + assertEquals("testaccesstoken2", accessToken3); + + verify(contract, times(2)).post("testurl", "testname", "testpassword", "testscope"); + } + +} From 8d2cdc84caed9a9b57324488119345e3dc00125d Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 24 Oct 2011 15:46:54 -0700 Subject: [PATCH 29/59] Fixing typos --- .../com.microsoft.azure.configuration.builder.Builder$Exports | 2 +- .../azure/services/serviceBus/IntegrationTestBase.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports b/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports index bf00c0b1abe7..1da2036a8749 100644 --- a/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports +++ b/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports @@ -1,5 +1,5 @@ -com.microsoft.azure.auth.wrap.utils.Exports com.microsoft.azure.auth.wrap.Exports com.microsoft.azure.configuration.jersey.Exports com.microsoft.azure.services.serviceBus.Exports com.microsoft.azure.services.serviceBus.contract.Exports +com.microsoft.azure.utils.Exports diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java index cce7a5080d4c..e1904519bc26 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java @@ -30,7 +30,7 @@ public void initialize() throws Exception { ServiceBusClient client = createConfiguration().create(ServiceBusClient.class); for(Queue queue : client.listQueues()){ if (queue.getPath().startsWith("Test") || queue.getPath().startsWith("test")) { - if (queue.getPath() == "testalpha") { + if (queue.getPath().equalsIgnoreCase("TestAlpha")) { testAlphaExists = true; long count = queue.getMessageCount(); for(long i = 0; i != count; ++i) { From db4d514a87411d78ad691c751e473ca298ff86fc Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 24 Oct 2011 18:26:43 -0700 Subject: [PATCH 30/59] Building out more api Adding a few XxxOptions for certain methods Passing send/recv message body through to network streams changing Queue "Path" property to "Name" property Using fluent property setters for inline initialization --- .../azure/services/serviceBus/Message.java | 58 +++++++++++++++++++ .../services/serviceBus/MessageReceiver.java | 6 +- .../services/serviceBus/MessageSender.java | 1 + .../serviceBus/MessageTranceiver.java | 6 -- .../serviceBus/MessageTransceiver.java | 6 ++ .../azure/services/serviceBus/Queue.java | 47 ++++++++------- .../serviceBus/ReceiveMessageOptions.java | 17 ++++++ .../serviceBus/SendMessageOptions.java | 7 +++ .../contract/ServiceBusContract.java | 6 +- .../contract/ServiceBusContractImpl.java | 18 +++--- .../microsoft/azure/utils/DefaultClock.java | 1 - .../com/microsoft/azure/utils/Exports.java | 10 +--- .../serviceBus/IntegrationTestBase.java | 6 +- .../QueueManagementIntegrationTest.java | 23 +++++++- .../contract/ContractIntegrationTest.java | 8 ++- 15 files changed, 165 insertions(+), 55 deletions(-) delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageTranceiver.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageTransceiver.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ReceiveMessageOptions.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/SendMessageOptions.java diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java index 1b9df243130f..6264458a1a8c 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java @@ -1,5 +1,63 @@ package com.microsoft.azure.services.serviceBus; +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +import com.microsoft.azure.services.serviceBus.contract.BrokerProperties; + + public class Message { + BrokerProperties properties; + InputStream body; + + public Message() { + this(new BrokerProperties(), null); + } + + public Message(InputStream body) { + this(new BrokerProperties(), body); + } + + public Message(String body) { + this(new BrokerProperties(), (body == null) ? null : new ByteArrayInputStream(body.getBytes())); + } + + Message(BrokerProperties properties, InputStream body) { + this.properties = properties; + this.body = body; + } + + BrokerProperties getProperties() { + return properties; + } + + public InputStream getBody() { + return body; + } + + public Message setBody(InputStream body) { + this.body = body; + return this; + } + + public Integer getDeliveryCount() { + return properties.getDeliveryCount(); + } + + public String getMessageId() { + return properties.getMessageId(); + } + + public Long getSequenceNumber() { + return properties.getSequenceNumber(); + } + + public Long getTimeToLive() { + return properties.getTimeToLive(); + } + public Message setTimeToLive(Long timeToLive) { + properties.setTimeToLive(timeToLive); + return this; + } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java index 836e214bdc88..db0883ad9c82 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java @@ -2,8 +2,10 @@ public interface MessageReceiver { - Message receiveMessage(int timeout); - Message peekLockMessage(int timeout); + Message receiveMessage(); + Message receiveMessage(ReceiveMessageOptions options); + Message peekLockMessage(); + Message peekLockMessage(ReceiveMessageOptions options); void abandonMessage(Message message); void completeMessage(Message message); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java index 38cce540f877..642419bd419c 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java @@ -3,4 +3,5 @@ public interface MessageSender { void sendMessage(Message message); + void sendMessage(Message message, SendMessageOptions options); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageTranceiver.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageTranceiver.java deleted file mode 100644 index 60805965530f..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageTranceiver.java +++ /dev/null @@ -1,6 +0,0 @@ - -package com.microsoft.azure.services.serviceBus; - -public interface MessageTranceiver extends MessageSender, MessageReceiver { - -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageTransceiver.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageTransceiver.java new file mode 100644 index 000000000000..8732e42fe474 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageTransceiver.java @@ -0,0 +1,6 @@ + +package com.microsoft.azure.services.serviceBus; + +public interface MessageTransceiver extends MessageSender, MessageReceiver { + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java index 185d7769738f..1eeda10df574 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java @@ -4,11 +4,12 @@ import org.w3._2005.atom.Content; import org.w3._2005.atom.Entry; +import com.microsoft.azure.services.serviceBus.contract.MessageResult; import com.microsoft.azure.services.serviceBus.contract.QueueDescription; import com.microsoft.azure.services.serviceBus.contract.ReceiveMode; -public class Queue extends AbstractEntity implements MessageSender, MessageReceiver { - Queue(ServiceBusClient client, String path) { +public class Queue extends AbstractEntity implements MessageSender, MessageReceiver, MessageTransceiver { + Queue(ServiceBusClient client, String name) { super(client); Content content = new Content(); @@ -17,7 +18,7 @@ public class Queue extends AbstractEntity implements MessageSender, MessageRecei content.setType("application/xml"); content.setQueueDescription(new QueueDescription()); - setPath(path); + setName(name); } Queue(ServiceBusClient client, Entry entry) { @@ -36,42 +37,45 @@ public void save() { } public void delete() { - getContract().deleteQueue(getPath()); + getContract().deleteQueue(getName()); } public void fetch() { - setEntry(getContract().getQueue(getPath())); + setEntry(getContract().getQueue(getName())); } + public void sendMessage(Message message) { + sendMessage(message, SendMessageOptions.DEFAULT); + } + public void sendMessage(Message message, SendMessageOptions options) { + getContract().sendMessage(getName(), message.getProperties(), message.getBody()); + } - public void sendMessage(Message message) { - // TODO Auto-generated method stub - + public Message receiveMessage() { + return receiveMessage(ReceiveMessageOptions.DEFAULT); } - public Message receiveMessage(int timeout) { - getContract().receiveMessage(getPath(), timeout, ReceiveMode.RECEIVE_AND_DELETE); - // TODO Auto-generated method stub - return null; + public Message receiveMessage(ReceiveMessageOptions options) { + MessageResult result = getContract().receiveMessage(getName(), options.getTimeout(), ReceiveMode.RECEIVE_AND_DELETE); + return new Message(result.getBrokerProperties(), result.getBody()); } - - public Message peekLockMessage(int timeout) { - // TODO Auto-generated method stub - return null; + public Message peekLockMessage() { + return peekLockMessage(ReceiveMessageOptions.DEFAULT); } + public Message peekLockMessage(ReceiveMessageOptions options) { + MessageResult result = getContract().receiveMessage(getName(), options.getTimeout(), ReceiveMode.PEEK_LOCK); + return new Message(result.getBrokerProperties(), result.getBody()); + } public void abandonMessage(Message message) { // TODO Auto-generated method stub - } - public void completeMessage(Message message) { // TODO Auto-generated method stub - } @@ -79,11 +83,11 @@ public void completeMessage(Message message) { // API properties - public String getPath() { + public String getName() { return getEntry().getTitle(); } - public void setPath(String value) { + public void setName(String value) { getEntry().setTitle(value); } @@ -106,4 +110,5 @@ public void setMaxSizeInMegabytes(Long value) { public Long getMessageCount() { return getQueueDescription().getMessageCount(); } + } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ReceiveMessageOptions.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ReceiveMessageOptions.java new file mode 100644 index 000000000000..426830679f3c --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ReceiveMessageOptions.java @@ -0,0 +1,17 @@ +package com.microsoft.azure.services.serviceBus; + +public class ReceiveMessageOptions { + Integer timeout; + + public static final ReceiveMessageOptions DEFAULT = new ReceiveMessageOptions(); + + public Integer getTimeout() { + return timeout; + } + + public ReceiveMessageOptions setTimeout(Integer timeout) { + this.timeout = timeout; + return this; + } +} + diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/SendMessageOptions.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/SendMessageOptions.java new file mode 100644 index 000000000000..16ed9cbae34f --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/SendMessageOptions.java @@ -0,0 +1,7 @@ +package com.microsoft.azure.services.serviceBus; + +public class SendMessageOptions { + + public static final SendMessageOptions DEFAULT = new SendMessageOptions(); + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java index 5fd0f7bd31b4..745376e825d7 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java @@ -1,12 +1,14 @@ package com.microsoft.azure.services.serviceBus.contract; +import java.io.InputStream; + import org.w3._2005.atom.Entry; import org.w3._2005.atom.Feed; public interface ServiceBusContract { - void sendMessage(String path, BrokerProperties properties); - MessageResult receiveMessage(String queuePath, int timeout, ReceiveMode receiveMode); + void sendMessage(String path, BrokerProperties properties, InputStream body); + MessageResult receiveMessage(String queuePath, Integer timeout, ReceiveMode receiveMode); //BrokeredMessage receiveMessage(String topicPath, String subscriptionName, int timeout, ReceiveMode receiveMode); //void abandonMessage(BrokeredMessage message); //void completeMessage(BrokeredMessage message); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java index 2d252becb343..3a293706a3d9 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java @@ -1,5 +1,6 @@ package com.microsoft.azure.services.serviceBus.contract; +import java.io.InputStream; import java.rmi.UnexpectedException; import javax.inject.Inject; @@ -40,24 +41,27 @@ public void setChannel(Client channel) { this.channel = channel; } - public void sendMessage(String path, BrokerProperties properties) { + public void sendMessage(String path, BrokerProperties properties, InputStream body) { getResource() .path(path) .path("messages") .header("BrokerProperties", mapper.toString(properties)) - .header("Content-Length", 11) - .post("Hello world"); + .post(body); } - public MessageResult receiveMessage(String queuePath, int timeout, + public MessageResult receiveMessage(String queuePath, Integer timeout, ReceiveMode receiveMode) { MessageResult result = new MessageResult(); if (receiveMode == ReceiveMode.RECEIVE_AND_DELETE) { - ClientResponse clientResult = getResource() + + WebResource resource = getResource() .path(queuePath) .path("messages") - .path("head") - .queryParam("timeout", Integer.toString(timeout)) + .path("head"); + if (timeout != null) { + resource = resource.queryParam("timeout", Integer.toString(timeout)); + } + ClientResponse clientResult = resource .delete(ClientResponse.class); result.setBrokerProperties(mapper.fromString(clientResult.getHeaders().getFirst("BrokerProperties"))); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/DefaultClock.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/DefaultClock.java index a095e12d1b63..56742882b8d5 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/DefaultClock.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/DefaultClock.java @@ -3,7 +3,6 @@ import java.util.Date; public class DefaultClock implements Clock { - public Date getNow() { return new Date(); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/Exports.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/Exports.java index a70cbd4e1437..b8510ef3665c 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/Exports.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/Exports.java @@ -1,13 +1,9 @@ package com.microsoft.azure.utils; -import com.microsoft.azure.configuration.builder.Builder.Registry; +import com.microsoft.azure.configuration.builder.Builder; -public class Exports implements - com.microsoft.azure.configuration.builder.Builder.Exports { - - public void register(Registry registry) { +public class Exports implements Builder.Exports { + public void register(Builder.Registry registry) { registry.add(Clock.class, DefaultClock.class); - } - } diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java index e1904519bc26..4fa5b536fc85 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java @@ -29,12 +29,12 @@ public void initialize() throws Exception { boolean testAlphaExists = false; ServiceBusClient client = createConfiguration().create(ServiceBusClient.class); for(Queue queue : client.listQueues()){ - if (queue.getPath().startsWith("Test") || queue.getPath().startsWith("test")) { - if (queue.getPath().equalsIgnoreCase("TestAlpha")) { + if (queue.getName().startsWith("Test") || queue.getName().startsWith("test")) { + if (queue.getName().equalsIgnoreCase("TestAlpha")) { testAlphaExists = true; long count = queue.getMessageCount(); for(long i = 0; i != count; ++i) { - queue.receiveMessage(2000); + queue.receiveMessage(new ReceiveMessageOptions().setTimeout(2000)); } } else { queue.delete(); diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java index 35a0cf05ff7a..e2ba5eef8827 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java @@ -2,6 +2,8 @@ import static org.junit.Assert.*; +import java.io.ByteArrayInputStream; + import junit.framework.Assert; import org.junit.Test; @@ -62,14 +64,29 @@ public void existingQueuePathDoesNotReturnNull() throws Exception { // Arrange ServiceBusClient client = createClient(); - // client.createQueue("TestQueue02"); - // Act Queue queue = client.getQueue("Hello"); queue.fetch(); // Assert Assert.assertNotNull(queue); - Assert.assertEquals("Hello", queue.getPath()); + Assert.assertEquals("Hello", queue.getName()); + } + + @Test + public void createQueueAndSendAndReceiveMessage() throws Exception { + // Arrange + ServiceBusClient client = createClient(); + + // Act + Queue queue = client.getQueue("TestCreateQueueAndSendAndReceiveMessage"); + queue.save(); + + queue.sendMessage(new Message("Hello World").setTimeToLive(25L)); + Message received = queue.receiveMessage(new ReceiveMessageOptions().setTimeout(2500)); + + // Assert + Assert.assertNotNull(received); + Assert.assertEquals(1, (int)received.getDeliveryCount()); } } diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java index b43dd5260a60..b5658b79b287 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java @@ -1,5 +1,7 @@ package com.microsoft.azure.services.serviceBus.contract; +import java.io.ByteArrayInputStream; + import org.junit.Test; import org.w3._2005.atom.Content; import org.w3._2005.atom.Entry; @@ -81,7 +83,7 @@ public void sendMessageWorks() throws Exception { BrokerProperties props = new BrokerProperties(); // Act - contract.sendMessage("TestAlpha", props); + contract.sendMessage("TestAlpha", props, new ByteArrayInputStream("Hello World".getBytes())); // Assert } @@ -95,8 +97,8 @@ public void receiveMessageWorks() throws Exception { BrokerProperties props = new BrokerProperties(); // Act - contract.sendMessage("TestAlpha", props); - contract.receiveMessage("TestAlpha", 500, ReceiveMode.RECEIVE_AND_DELETE); + contract.sendMessage("TestAlpha", props, new ByteArrayInputStream("Hello World".getBytes())); + MessageResult message = contract.receiveMessage("TestAlpha", 500, ReceiveMode.RECEIVE_AND_DELETE); // Assert } From 8d106f57f9033f54e783da9f4e6e198bed962c73 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Tue, 25 Oct 2011 11:49:03 -0700 Subject: [PATCH 31/59] Starting to add peekLock semantics --- .../contract/ServiceBusContractImpl.java | 39 +++++++++++-------- .../contract/ContractIntegrationTest.java | 25 +++++++++++- 2 files changed, 47 insertions(+), 17 deletions(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java index 3a293706a3d9..f4f192213225 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java @@ -51,24 +51,31 @@ public void sendMessage(String path, BrokerProperties properties, InputStream bo public MessageResult receiveMessage(String queuePath, Integer timeout, ReceiveMode receiveMode) { - MessageResult result = new MessageResult(); - if (receiveMode == ReceiveMode.RECEIVE_AND_DELETE) { - WebResource resource = getResource() - .path(queuePath) - .path("messages") - .path("head"); - if (timeout != null) { - resource = resource.queryParam("timeout", Integer.toString(timeout)); - } - ClientResponse clientResult = resource - .delete(ClientResponse.class); - - result.setBrokerProperties(mapper.fromString(clientResult.getHeaders().getFirst("BrokerProperties"))); - result.setBody(clientResult.getEntityInputStream()); - return result; + WebResource resource = getResource() + .path(queuePath) + .path("messages") + .path("head"); + + if (timeout != null) { + resource = resource.queryParam("timeout", Integer.toString(timeout)); } - throw new RuntimeException("Unknown ReceiveMode"); + + ClientResponse clientResult; + if (receiveMode == ReceiveMode.RECEIVE_AND_DELETE) { + clientResult = resource.delete(ClientResponse.class); + } + else if (receiveMode == ReceiveMode.PEEK_LOCK) { + clientResult = resource.post(ClientResponse.class, ""); + } + else { + throw new RuntimeException("Unknown ReceiveMode"); + } + + MessageResult result = new MessageResult(); + result.setBrokerProperties(mapper.fromString(clientResult.getHeaders().getFirst("BrokerProperties"))); + result.setBody(clientResult.getEntityInputStream()); + return result; } diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java index b5658b79b287..bb43c1ac5d44 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java @@ -95,11 +95,34 @@ public void receiveMessageWorks() throws Exception { ServiceBusContract contract = config.create(ServiceBusContract.class); BrokerProperties props = new BrokerProperties(); + contract.sendMessage("TestAlpha", props, new ByteArrayInputStream("Hello World".getBytes())); // Act - contract.sendMessage("TestAlpha", props, new ByteArrayInputStream("Hello World".getBytes())); MessageResult message = contract.receiveMessage("TestAlpha", 500, ReceiveMode.RECEIVE_AND_DELETE); // Assert + byte[] data = new byte[100]; + int size = message.getBody().read(data); + assertEquals(11, size); + assertArrayEquals("Hello World".getBytes(), data); + } + + @Test + public void peekLockMessageWorks() throws Exception { + // Arrange + Configuration config = createConfiguration(); + ServiceBusContract contract = config.create(ServiceBusContract.class); + + BrokerProperties props = new BrokerProperties(); + + // Act + contract.sendMessage("TestAlpha", props, new ByteArrayInputStream("Hello World".getBytes())); + MessageResult message = contract.receiveMessage("TestAlpha", 500, ReceiveMode.PEEK_LOCK); + + // Assert + byte[] data = new byte[100]; + int size = message.getBody().read(data); + assertEquals(11, size); + assertEquals("Hello World", new String(data, 0, size)); } } From d11debb7f8c97f6176fb27bf2417e99ea3264a6b Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Tue, 25 Oct 2011 23:16:18 -0700 Subject: [PATCH 32/59] Adding properties related to peeklock --- .../azure/services/serviceBus/Message.java | 16 ++++++ .../services/serviceBus/ServiceBusClient.java | 12 ++++- .../serviceBus/contract/BrokerProperties.java | 49 ++++++++++--------- .../QueueManagementIntegrationTest.java | 36 ++++++++++---- 4 files changed, 78 insertions(+), 35 deletions(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java index 6264458a1a8c..59711059aae1 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java @@ -10,6 +10,22 @@ public class Message { BrokerProperties properties; InputStream body; + public String getLockToken() { + return properties.getLockToken(); + } + + public void setLockToken(String lockToken) { + properties.setLockToken(lockToken); + } + + public String getLockedUntilUtc() { + return properties.getLockedUntilUtc(); + } + + public void setLockedUntilUtc(String lockedUntilUtc) { + properties.setLockedUntilUtc(lockedUntilUtc); + } + public Message() { this(new BrokerProperties(), null); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java index 2abc6d76ba6c..b4fff0799963 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java @@ -15,13 +15,21 @@ public class ServiceBusClient { ServiceBusContract contract; public ServiceBusClient() throws Exception { - this(Configuration.load()); + this("", Configuration.load()); } public ServiceBusClient(Configuration config) throws Exception { - this(config.create(ServiceBusContract.class)); + this("", config); + } + + public ServiceBusClient(String profile) throws Exception { + this(profile, Configuration.load()); } + public ServiceBusClient(String profile, Configuration config) throws Exception { + this(config.create(profile, ServiceBusContract.class)); + } + @Inject public ServiceBusClient(ServiceBusContract contract) { this.contract = contract; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerProperties.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerProperties.java index b60438e144df..ad2b3ee1a680 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerProperties.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerProperties.java @@ -21,65 +21,66 @@ public class BrokerProperties { @JsonProperty("TimeToLive") Long timeToLive; - /** - * @return the deliveryCount - */ + @JsonProperty("LockToken") + String lockToken; + + @JsonProperty("LockedUntilUtc") + String lockedUntilUtc; + + @JsonIgnore public Integer getDeliveryCount() { return deliveryCount; } - /** - * @param deliveryCount the deliveryCount to set - */ public void setDeliveryCount(Integer deliveryCount) { this.deliveryCount = deliveryCount; } - /** - * @return the messageId - */ @JsonIgnore public String getMessageId() { return messageId; } - /** - * @param messageId the messageId to set - */ public void setMessageId(String messageId) { this.messageId = messageId; } - /** - * @return the sequenceNumber - */ @JsonIgnore public Long getSequenceNumber() { return sequenceNumber; } - /** - * @param sequenceNumber the sequenceNumber to set - */ public void setSequenceNumber(Long sequenceNumber) { this.sequenceNumber = sequenceNumber; } - /** - * @return the timeToLive - */ @JsonIgnore public Long getTimeToLive() { return timeToLive; } - /** - * @param timeToLive the timeToLive to set - */ public void setTimeToLive(Long timeToLive) { this.timeToLive = timeToLive; } + @JsonIgnore + public String getLockToken() { + return lockToken; + } + + public void setLockToken(String lockToken) { + this.lockToken = lockToken; + } + + @JsonIgnore + public String getLockedUntilUtc() { + return lockedUntilUtc; + } + + public void setLockedUntilUtc(String lockedUntilUtc) { + this.lockedUntilUtc = lockedUntilUtc; + } + } diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java index e2ba5eef8827..ec19402ab961 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java @@ -4,13 +4,12 @@ import java.io.ByteArrayInputStream; -import junit.framework.Assert; - import org.junit.Test; import com.microsoft.azure.services.serviceBus.Queue; import com.microsoft.azure.services.serviceBus.ServiceBusClient; + public class QueueManagementIntegrationTest extends IntegrationTestBase { private ServiceBusClient createClient() throws Exception { @@ -56,7 +55,7 @@ public void notFoundQueuePathReturnsNull() throws Exception { Queue queue = client.getQueue("NoSuchQueueName"); // Assert - Assert.assertNull(queue); + assertNull(queue); } @Test @@ -69,8 +68,8 @@ public void existingQueuePathDoesNotReturnNull() throws Exception { queue.fetch(); // Assert - Assert.assertNotNull(queue); - Assert.assertEquals("Hello", queue.getName()); + assertNotNull(queue); + assertEquals("Hello", queue.getName()); } @Test @@ -82,11 +81,30 @@ public void createQueueAndSendAndReceiveMessage() throws Exception { Queue queue = client.getQueue("TestCreateQueueAndSendAndReceiveMessage"); queue.save(); - queue.sendMessage(new Message("Hello World").setTimeToLive(25L)); - Message received = queue.receiveMessage(new ReceiveMessageOptions().setTimeout(2500)); + queue.sendMessage(new Message("Hello World")); + Message received = queue.receiveMessage(); + + // Assert + assertNotNull(received); + assertEquals(1, (int)received.getDeliveryCount()); + } + + + @Test + public void peekLockedMessageHasLockTokenAndLockedUntilUtc() throws Exception { + // Arrange + ServiceBusClient client = createClient(); + + // Act + Queue queue = client.getQueue("TestCreateQueueAndSendAndReceiveMessage"); + queue.save(); + + queue.sendMessage(new Message("Hello World")); + Message received = queue.peekLockMessage(); // Assert - Assert.assertNotNull(received); - Assert.assertEquals(1, (int)received.getDeliveryCount()); + assertNotNull(received); + assertNotNull(received.getLockToken()); + assertNotNull(received.getLockedUntilUtc()); } } From c036d0c737f62128a43457ce014f0f19989185fc Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Tue, 25 Oct 2011 23:19:59 -0700 Subject: [PATCH 33/59] Adding some //REVIEW notes from code review Also renames Clock interface to DateFactory --- .../microsoft/azure/auth/wrap/WrapClient.java | 10 ++++---- .../serviceBus/ListQueuesOptions.java | 24 +++++++++++++++++++ .../services/serviceBus/ServiceBusClient.java | 5 ++++ .../contract/ServiceBusContractImpl.java | 11 +++++---- .../utils/{Clock.java => DateFactory.java} | 4 ++-- ...aultClock.java => DefaultDateFactory.java} | 4 ++-- .../com/microsoft/azure/utils/Exports.java | 2 +- .../azure/auth/wrap/WrapClientTest.java | 10 ++++---- .../QueueManagementIntegrationTest.java | 2 +- 9 files changed, 51 insertions(+), 21 deletions(-) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ListQueuesOptions.java rename microsoft-azure-api/src/main/java/com/microsoft/azure/utils/{Clock.java => DateFactory.java} (56%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/utils/{DefaultClock.java => DefaultDateFactory.java} (51%) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java index 76d7656a8bfc..33449b5d027d 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java @@ -8,12 +8,12 @@ import com.microsoft.azure.auth.wrap.contract.WrapContract; import com.microsoft.azure.auth.wrap.contract.WrapResponse; -import com.microsoft.azure.utils.Clock; +import com.microsoft.azure.utils.DateFactory; public class WrapClient { WrapContract contract; - private Clock clock; + private DateFactory dateFactory; private String uri; private String name; private String password; @@ -25,13 +25,13 @@ public class WrapClient { @Inject public WrapClient( WrapContract contract, - Clock clock, + DateFactory dateFactory, @Named("wrap.uri") String uri, @Named("wrap.scope") String scope, @Named("wrap.name") String name, @Named("wrap.password") String password) { this.contract = contract; - this.clock = clock; + this.dateFactory = dateFactory; this.uri = uri; this.scope = scope; this.name = name; @@ -54,7 +54,7 @@ public void setContract(WrapContract contract) { } public String getAccessToken() { - Date now = clock.getNow(); + Date now = dateFactory.getDate(); ActiveToken active = this.activeToken; if (active != null && now.before(active.getExpiresUtc()) ) { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ListQueuesOptions.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ListQueuesOptions.java new file mode 100644 index 000000000000..3a966f292796 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ListQueuesOptions.java @@ -0,0 +1,24 @@ +package com.microsoft.azure.services.serviceBus; + +public class ListQueuesOptions { + + public static final ListQueuesOptions DEFAULT = new ListQueuesOptions(); + + Integer skip; + public Integer getSkip() { + return skip; + } + public ListQueuesOptions setSkip(Integer skip) { + this.skip = skip; + return this; + } + public Integer getMaxCount() { + return maxCount; + } + public ListQueuesOptions setMaxCount(Integer maxCount) { + this.maxCount = maxCount; + return this; + } + Integer maxCount; + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java index b4fff0799963..85a015832e21 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java @@ -44,6 +44,11 @@ public void setContract(ServiceBusContract contract) { } public Iterable listQueues() { + return listQueues(ListQueuesOptions.DEFAULT); + } + + // REVIEW: what is the generalized strategy for paginated, client-roundtrippable iteration + public Iterable listQueues(ListQueuesOptions options) { Feed descriptions = contract.getQueues(); ArrayList queues = new ArrayList(); for (int i = 0; i != descriptions.getEntries().size(); ++i) { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java index f4f192213225..912432310598 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java @@ -41,6 +41,12 @@ public void setChannel(Client channel) { this.channel = channel; } + private WebResource getResource() { + return getChannel() + .resource(uri); + } + + // REVIEW: contentType will be needed public void sendMessage(String path, BrokerProperties properties, InputStream body) { getResource() .path(path) @@ -92,11 +98,6 @@ public void deleteQueue(String queuePath) { .delete(); } - private WebResource getResource() { - return getChannel() - .resource(uri); - } - public Entry getQueue(String queuePath) { return getResource() .path(queuePath) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/Clock.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/DateFactory.java similarity index 56% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/utils/Clock.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/utils/DateFactory.java index f36df655abaa..5ed6361a48be 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/Clock.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/DateFactory.java @@ -2,6 +2,6 @@ import java.util.Date; -public interface Clock { - Date getNow(); +public interface DateFactory { + Date getDate(); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/DefaultClock.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/DefaultDateFactory.java similarity index 51% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/utils/DefaultClock.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/utils/DefaultDateFactory.java index 56742882b8d5..25e28411cb3b 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/DefaultClock.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/DefaultDateFactory.java @@ -2,8 +2,8 @@ import java.util.Date; -public class DefaultClock implements Clock { - public Date getNow() { +public class DefaultDateFactory implements DateFactory { + public Date getDate() { return new Date(); } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/Exports.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/Exports.java index b8510ef3665c..c7c0a63df09c 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/Exports.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/Exports.java @@ -4,6 +4,6 @@ public class Exports implements Builder.Exports { public void register(Builder.Registry registry) { - registry.add(Clock.class, DefaultClock.class); + registry.add(DateFactory.class, DefaultDateFactory.class); } } diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientTest.java index 7d27b6289581..78124d937d66 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientTest.java @@ -14,29 +14,29 @@ import com.microsoft.azure.auth.wrap.contract.WrapContract; import com.microsoft.azure.auth.wrap.contract.WrapResponse; -import com.microsoft.azure.utils.Clock; +import com.microsoft.azure.utils.DateFactory; public class WrapClientTest { private WrapContract contract; private WrapClient client; - private Clock clock; + private DateFactory dateFactory; private Calendar calendar; @Before public void init() { calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - clock = mock(Clock.class); + dateFactory = mock(DateFactory.class); contract = mock(WrapContract.class); client = new WrapClient( contract, - clock, + dateFactory, "testurl", "testscope", "testname", "testpassword"); - when(clock.getNow()).thenAnswer(new Answer() { + when(dateFactory.getDate()).thenAnswer(new Answer() { public Date answer(InvocationOnMock invocation) throws Throwable { return calendar.getTime(); } diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java index ec19402ab961..51d3b0f921a8 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java @@ -13,7 +13,7 @@ public class QueueManagementIntegrationTest extends IntegrationTestBase { private ServiceBusClient createClient() throws Exception { - return createConfiguration().create(ServiceBusClient.class); + return new ServiceBusClient(createConfiguration()); } @Test From bebaee1484d1f093468b4a2cd6efd8af076a0382 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 26 Oct 2011 16:46:55 -0700 Subject: [PATCH 34/59] System robustness Adding a logger reference Adding serviceexceptionfactory throwing deterministic exceptions from SBContract and WrapContract --- microsoft-azure-api/pom.xml | 5 + .../com/microsoft/azure/ServiceException.java | 8 + .../microsoft/azure/auth/wrap/WrapClient.java | 3 +- .../microsoft/azure/auth/wrap/WrapFilter.java | 9 +- .../auth/wrap/contract/WrapContract.java | 4 +- .../auth/wrap/contract/WrapContractImpl.java | 25 ++- .../azure/configuration/jersey/Exports.java | 7 +- .../services/serviceBus/MessageReceiver.java | 14 +- .../services/serviceBus/MessageSender.java | 6 +- .../azure/services/serviceBus/Queue.java | 19 +- .../services/serviceBus/ServiceBusClient.java | 5 +- .../contract/ServiceBusContract.java | 52 +++--- .../contract/ServiceBusContractImpl.java | 167 ++++++++++++++---- .../azure/utils/ServiceExceptionFactory.java | 84 +++++++++ .../azure/auth/wrap/WrapClientTest.java | 7 +- .../serviceBus/IntegrationTestBase.java | 14 +- .../QueueManagementIntegrationTest.java | 4 +- .../serviceBus/QueueManagementTest.java | 5 +- .../utils/ServiceExceptionFactoryTest.java | 66 +++++++ 19 files changed, 406 insertions(+), 98 deletions(-) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/utils/ServiceExceptionFactory.java create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/utils/ServiceExceptionFactoryTest.java diff --git a/microsoft-azure-api/pom.xml b/microsoft-azure-api/pom.xml index df0af93f2d3e..b5ee7f0df356 100644 --- a/microsoft-azure-api/pom.xml +++ b/microsoft-azure-api/pom.xml @@ -40,6 +40,11 @@ jersey-json 1.10-b02 + + commons-logging + commons-logging + 1.1.1 + diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/ServiceException.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/ServiceException.java index 0f3caec7db89..a7c96a5df82e 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/ServiceException.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/ServiceException.java @@ -9,6 +9,7 @@ public class ServiceException extends Exception { int httpStatusCode; String httpReasonPhrase; + String serviceName; String errorCode; String errorMessage; @@ -74,4 +75,11 @@ public String getErrorValue(String name) { public void setErrorValue(String name, String value) { this.errorValues.put(name, value); } + public String getServiceName() { + return serviceName; + } + public void setServiceName(String serviceName) { + this.serviceName = serviceName; + } + } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java index 33449b5d027d..01b780cb90cf 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapClient.java @@ -6,6 +6,7 @@ import javax.inject.Named; import javax.management.timer.Timer; +import com.microsoft.azure.ServiceException; import com.microsoft.azure.auth.wrap.contract.WrapContract; import com.microsoft.azure.auth.wrap.contract.WrapResponse; import com.microsoft.azure.utils.DateFactory; @@ -53,7 +54,7 @@ public void setContract(WrapContract contract) { this.contract = contract; } - public String getAccessToken() { + public String getAccessToken() throws ServiceException { Date now = dateFactory.getDate(); ActiveToken active = this.activeToken; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapFilter.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapFilter.java index 8a4164680514..dd77896c9d62 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapFilter.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/WrapFilter.java @@ -1,5 +1,6 @@ package com.microsoft.azure.auth.wrap; +import com.microsoft.azure.ServiceException; import com.sun.jersey.api.client.ClientHandlerException; import com.sun.jersey.api.client.ClientRequest; import com.sun.jersey.api.client.ClientResponse; @@ -16,7 +17,13 @@ public WrapFilter(WrapClient client) { public ClientResponse handle(ClientRequest cr) throws ClientHandlerException { - String accessToken = client.getAccessToken(); + String accessToken; + try { + accessToken = client.getAccessToken(); + } catch (ServiceException e) { + // must wrap exception because of base class signature + throw new ClientHandlerException(e); + } cr.getHeaders().add("Authorization", "WRAP access_token=\"" + accessToken + "\""); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContract.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContract.java index 7f6d35e031b2..261c3c7f3cd4 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContract.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContract.java @@ -1,5 +1,7 @@ package com.microsoft.azure.auth.wrap.contract; +import com.microsoft.azure.ServiceException; + public interface WrapContract { - WrapResponse post(String uri, String name, String password, String scope); + WrapResponse post(String uri, String name, String password, String scope) throws ServiceException; } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContractImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContractImpl.java index 170cafae7e38..194d7656b712 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContractImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContractImpl.java @@ -3,27 +3,42 @@ import javax.inject.Inject; import javax.ws.rs.core.MediaType; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import com.microsoft.azure.ServiceException; +import com.microsoft.azure.utils.ServiceExceptionFactory; import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.UniformInterfaceException; import com.sun.jersey.api.representation.Form; public class WrapContractImpl implements WrapContract { Client channel; + static Log log = LogFactory.getLog(WrapContract.class); + @Inject public WrapContractImpl(Client channel) { this.channel = channel; } - public WrapResponse post(String uri, String name, String password, String scope) { + public WrapResponse post(String uri, String name, String password, String scope) throws ServiceException { Form requestForm = new Form(); requestForm.add("wrap_name", name); requestForm.add("wrap_password", password); requestForm.add("wrap_scope", scope); - Form responseForm = channel.resource(uri) - .accept(MediaType.APPLICATION_FORM_URLENCODED) - .type(MediaType.APPLICATION_FORM_URLENCODED) - .post(Form.class, requestForm); + Form responseForm; + try { + responseForm = channel.resource(uri) + .accept(MediaType.APPLICATION_FORM_URLENCODED) + .type(MediaType.APPLICATION_FORM_URLENCODED) + .post(Form.class, requestForm); + } + catch (UniformInterfaceException e) { + log.warn("Failed WrapContract.post operation", e); + throw ServiceExceptionFactory.create("WRAP", "Failed WrapContract.post operation", e); + } WrapResponse response = new WrapResponse(); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java index cb67dd940196..caa8ac407e17 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/jersey/Exports.java @@ -1,6 +1,7 @@ package com.microsoft.azure.configuration.jersey; import java.util.Map; +import java.util.Map.Entry; import com.microsoft.azure.configuration.builder.Builder; import com.microsoft.azure.configuration.builder.Builder.Registry; @@ -14,7 +15,11 @@ public class Exports implements Builder.Exports { public void register(Registry registry) { registry.add(new Builder.Factory() { public ClientConfig create(String profile, Builder builder, Map properties) { - return new DefaultClientConfig(); + ClientConfig clientConfig = new DefaultClientConfig(); + for(Entry entry : properties.entrySet()) { + clientConfig.getProperties().put(entry.getKey(), entry.getValue()); + } + return clientConfig; } }); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java index db0883ad9c82..2b8c23ae22ae 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java @@ -1,11 +1,13 @@ package com.microsoft.azure.services.serviceBus; +import com.microsoft.azure.ServiceException; + public interface MessageReceiver { - Message receiveMessage(); - Message receiveMessage(ReceiveMessageOptions options); - Message peekLockMessage(); - Message peekLockMessage(ReceiveMessageOptions options); - void abandonMessage(Message message); - void completeMessage(Message message); + Message receiveMessage() throws ServiceException; + Message receiveMessage(ReceiveMessageOptions options) throws ServiceException; + Message peekLockMessage() throws ServiceException; + Message peekLockMessage(ReceiveMessageOptions options) throws ServiceException; + void abandonMessage(Message message) throws ServiceException; + void completeMessage(Message message) throws ServiceException; } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java index 642419bd419c..a6a5dbe12991 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java @@ -1,7 +1,9 @@ package com.microsoft.azure.services.serviceBus; +import com.microsoft.azure.ServiceException; + public interface MessageSender { - void sendMessage(Message message); - void sendMessage(Message message, SendMessageOptions options); + void sendMessage(Message message) throws ServiceException; + void sendMessage(Message message, SendMessageOptions options) throws ServiceException; } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java index 1eeda10df574..0cf1547e3fa3 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java @@ -4,6 +4,7 @@ import org.w3._2005.atom.Content; import org.w3._2005.atom.Entry; +import com.microsoft.azure.ServiceException; import com.microsoft.azure.services.serviceBus.contract.MessageResult; import com.microsoft.azure.services.serviceBus.contract.QueueDescription; import com.microsoft.azure.services.serviceBus.contract.ReceiveMode; @@ -32,40 +33,40 @@ QueueDescription getQueueDescription(){ // API methods - public void save() { + public void save() throws ServiceException { setEntry(getContract().createQueue(getEntry())); } - public void delete() { + public void delete() throws ServiceException { getContract().deleteQueue(getName()); } - public void fetch() { + public void fetch() throws ServiceException { setEntry(getContract().getQueue(getName())); } - public void sendMessage(Message message) { + public void sendMessage(Message message) throws ServiceException { sendMessage(message, SendMessageOptions.DEFAULT); } - public void sendMessage(Message message, SendMessageOptions options) { + public void sendMessage(Message message, SendMessageOptions options) throws ServiceException { getContract().sendMessage(getName(), message.getProperties(), message.getBody()); } - public Message receiveMessage() { + public Message receiveMessage() throws ServiceException { return receiveMessage(ReceiveMessageOptions.DEFAULT); } - public Message receiveMessage(ReceiveMessageOptions options) { + public Message receiveMessage(ReceiveMessageOptions options) throws ServiceException { MessageResult result = getContract().receiveMessage(getName(), options.getTimeout(), ReceiveMode.RECEIVE_AND_DELETE); return new Message(result.getBrokerProperties(), result.getBody()); } - public Message peekLockMessage() { + public Message peekLockMessage() throws ServiceException { return peekLockMessage(ReceiveMessageOptions.DEFAULT); } - public Message peekLockMessage(ReceiveMessageOptions options) { + public Message peekLockMessage(ReceiveMessageOptions options) throws ServiceException { MessageResult result = getContract().receiveMessage(getName(), options.getTimeout(), ReceiveMode.PEEK_LOCK); return new Message(result.getBrokerProperties(), result.getBody()); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java index 85a015832e21..269601f14278 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java @@ -7,6 +7,7 @@ import org.w3._2005.atom.Feed; +import com.microsoft.azure.ServiceException; import com.microsoft.azure.configuration.Configuration; import com.microsoft.azure.services.serviceBus.contract.ServiceBusContract; @@ -43,12 +44,12 @@ public void setContract(ServiceBusContract contract) { this.contract = contract; } - public Iterable listQueues() { + public Iterable listQueues() throws ServiceException { return listQueues(ListQueuesOptions.DEFAULT); } // REVIEW: what is the generalized strategy for paginated, client-roundtrippable iteration - public Iterable listQueues(ListQueuesOptions options) { + public Iterable listQueues(ListQueuesOptions options) throws ServiceException { Feed descriptions = contract.getQueues(); ArrayList queues = new ArrayList(); for (int i = 0; i != descriptions.getEntries().size(); ++i) { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java index 745376e825d7..def3a61dde22 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java @@ -5,32 +5,34 @@ import org.w3._2005.atom.Entry; import org.w3._2005.atom.Feed; +import com.microsoft.azure.ServiceException; + public interface ServiceBusContract { - void sendMessage(String path, BrokerProperties properties, InputStream body); - MessageResult receiveMessage(String queuePath, Integer timeout, ReceiveMode receiveMode); - //BrokeredMessage receiveMessage(String topicPath, String subscriptionName, int timeout, ReceiveMode receiveMode); - //void abandonMessage(BrokeredMessage message); - //void completeMessage(BrokeredMessage message); - - Entry createQueue(Entry queue); - void deleteQueue(String queuePath); - Entry getQueue(String queuePath); - Feed getQueues(); - - Entry createTopic(Entry topic); - void deleteTopic(String topicPath); - Entry getTopic(String topicPath); - Feed getTopics(); - - void addSubscription(String topicPath, String subscriptionName, Entry subscription); - void removeSubscription(String topicPath, String subscriptionName); - Entry getSubscription(String topicPath, String subscriptionName); - Feed getSubscriptions(String topicPath); - - void addRule(String topicPath, String subscriptionName, String ruleName, Entry rule); - void removeRule(String topicPath, String subscriptionName, String ruleName); - Entry getRule(String topicPath, String subscriptionName, String ruleName); - Feed getRules(String topicPath, String subscriptionName); + void sendMessage(String path, BrokerProperties properties, InputStream body) throws ServiceException; + MessageResult receiveMessage(String queuePath, Integer timeout, ReceiveMode receiveMode) throws ServiceException; + //BrokeredMessage receiveMessage(String topicPath, String subscriptionName, int timeout, ReceiveMode receiveMode) throws ServiceException; + //void abandonMessage(BrokeredMessage message) throws ServiceException; + //void completeMessage(BrokeredMessage message) throws ServiceException; + + Entry createQueue(Entry queue) throws ServiceException; + void deleteQueue(String queuePath) throws ServiceException; + Entry getQueue(String queuePath) throws ServiceException; + Feed getQueues() throws ServiceException; + + Entry createTopic(Entry topic) throws ServiceException; + void deleteTopic(String topicPath) throws ServiceException; + Entry getTopic(String topicPath) throws ServiceException; + Feed getTopics() throws ServiceException; + + void addSubscription(String topicPath, String subscriptionName, Entry subscription) throws ServiceException; + void removeSubscription(String topicPath, String subscriptionName) throws ServiceException; + Entry getSubscription(String topicPath, String subscriptionName) throws ServiceException; + Feed getSubscriptions(String topicPath) throws ServiceException; + + void addRule(String topicPath, String subscriptionName, String ruleName, Entry rule) throws ServiceException; + void removeRule(String topicPath, String subscriptionName, String ruleName) throws ServiceException; + Entry getRule(String topicPath, String subscriptionName, String ruleName) throws ServiceException; + Feed getRules(String topicPath, String subscriptionName) throws ServiceException; } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java index 912432310598..bff5af8f7439 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java @@ -6,12 +6,18 @@ import javax.inject.Inject; import javax.inject.Named; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; import org.w3._2005.atom.Entry; import org.w3._2005.atom.Feed; +import com.microsoft.azure.ServiceException; import com.microsoft.azure.auth.wrap.WrapFilter; +import com.microsoft.azure.utils.ServiceExceptionFactory; import com.sun.jersey.api.client.Client; +import com.sun.jersey.api.client.ClientHandlerException; import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.UniformInterfaceException; import com.sun.jersey.api.client.WebResource; public class ServiceBusContractImpl implements ServiceBusContract { @@ -19,6 +25,7 @@ public class ServiceBusContractImpl implements ServiceBusContract { private Client channel; private String uri; private BrokerPropertiesMapper mapper; + static Log log = LogFactory.getLog(ServiceBusContract.class); @Inject public ServiceBusContractImpl( @@ -47,16 +54,26 @@ private WebResource getResource() { } // REVIEW: contentType will be needed - public void sendMessage(String path, BrokerProperties properties, InputStream body) { - getResource() - .path(path) - .path("messages") - .header("BrokerProperties", mapper.toString(properties)) - .post(body); + public void sendMessage(String path, BrokerProperties properties, InputStream body) throws ServiceException { + try { + getResource() + .path(path) + .path("messages") + .header("BrokerProperties", mapper.toString(properties)) + .post(body); + } + catch(UniformInterfaceException e) { + log.warn(e); + throw ServiceExceptionFactory.create("serviceBus", e); + } + catch(ClientHandlerException e) { + log.warn(e); + throw ServiceExceptionFactory.create("serviceBus", e); + } } public MessageResult receiveMessage(String queuePath, Integer timeout, - ReceiveMode receiveMode) { + ReceiveMode receiveMode) throws ServiceException { WebResource resource = getResource() .path(queuePath) @@ -69,10 +86,30 @@ public MessageResult receiveMessage(String queuePath, Integer timeout, ClientResponse clientResult; if (receiveMode == ReceiveMode.RECEIVE_AND_DELETE) { - clientResult = resource.delete(ClientResponse.class); + try { + clientResult = resource.delete(ClientResponse.class); + } + catch(UniformInterfaceException e) { + log.warn(e); + throw ServiceExceptionFactory.create("serviceBus", e); + } + catch(ClientHandlerException e) { + log.warn(e); + throw ServiceExceptionFactory.create("serviceBus", e); + } } else if (receiveMode == ReceiveMode.PEEK_LOCK) { - clientResult = resource.post(ClientResponse.class, ""); + try { + clientResult = resource.post(ClientResponse.class, ""); + } + catch(UniformInterfaceException e) { + log.warn(e); + throw ServiceExceptionFactory.create("serviceBus", e); + } + catch(ClientHandlerException e) { + log.warn(e); + throw ServiceExceptionFactory.create("serviceBus", e); + } } else { throw new RuntimeException("Unknown ReceiveMode"); @@ -85,42 +122,102 @@ else if (receiveMode == ReceiveMode.PEEK_LOCK) { } - public Entry createQueue(Entry entry) { - return getResource() - .path(entry.getTitle()) - .type("application/atom+xml")//;type=entry;charset=utf-8") - .put(Entry.class, entry); + public Entry createQueue(Entry entry) throws ServiceException { + try { + return getResource() + .path(entry.getTitle()) + .type("application/atom+xml")//;type=entry;charset=utf-8") + .put(Entry.class, entry); + } + catch(UniformInterfaceException e) { + log.warn(e); + throw ServiceExceptionFactory.create("serviceBus", e); + } + catch(ClientHandlerException e) { + log.warn(e); + throw ServiceExceptionFactory.create("serviceBus", e); + } } - public void deleteQueue(String queuePath) { - getResource() - .path(queuePath) - .delete(); + public void deleteQueue(String queuePath) throws ServiceException { + try { + getResource() + .path(queuePath) + .delete(); + } + catch(UniformInterfaceException e) { + log.warn(e); + throw ServiceExceptionFactory.create("serviceBus", e); + } + catch(ClientHandlerException e) { + log.warn(e); + throw ServiceExceptionFactory.create("serviceBus", e); + } } - public Entry getQueue(String queuePath) { - return getResource() - .path(queuePath) - .get(Entry.class); + public Entry getQueue(String queuePath) throws ServiceException { + try { + return getResource() + .path(queuePath) + .get(Entry.class); + } + catch(UniformInterfaceException e) { + log.warn(e); + throw ServiceExceptionFactory.create("serviceBus", e); + } + catch(ClientHandlerException e) { + log.warn(e); + throw ServiceExceptionFactory.create("serviceBus", e); + } } - public Feed getQueues() { - return getResource() - .path("$Resources/Queues") - .get(Feed.class); + public Feed getQueues() throws ServiceException { + try { + return getResource() + .path("$Resources/Queues") + .get(Feed.class); + } + catch(UniformInterfaceException e) { + log.warn(e); + throw ServiceExceptionFactory.create("serviceBus", e); + } + catch(ClientHandlerException e) { + log.warn(e); + throw ServiceExceptionFactory.create("serviceBus", e); + } } - public Entry createTopic(Entry entry) { - return getResource() - .path(entry.getTitle()) - .type("application/atom+xml")//;type=entry;charset=utf-8") - .put(Entry.class, entry); + public Entry createTopic(Entry entry) throws ServiceException { + try { + return getResource() + .path(entry.getTitle()) + .type("application/atom+xml")//;type=entry;charset=utf-8") + .put(Entry.class, entry); + } + catch(UniformInterfaceException e) { + log.warn(e); + throw ServiceExceptionFactory.create("serviceBus", e); + } + catch(ClientHandlerException e) { + log.warn(e); + throw ServiceExceptionFactory.create("serviceBus", e); + } } - public void deleteTopic(String topicPath) { - getResource() - .path(topicPath) - .delete(); + public void deleteTopic(String topicPath) throws ServiceException { + try { + getResource() + .path(topicPath) + .delete(); + } + catch(UniformInterfaceException e) { + log.warn(e); + throw ServiceExceptionFactory.create("serviceBus", e); + } + catch(ClientHandlerException e) { + log.warn(e); + throw ServiceExceptionFactory.create("serviceBus", e); + } } public Entry getTopic(String topicPath) { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/ServiceExceptionFactory.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/ServiceExceptionFactory.java new file mode 100644 index 000000000000..ae1178aa16d0 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/ServiceExceptionFactory.java @@ -0,0 +1,84 @@ +package com.microsoft.azure.utils; + +import com.microsoft.azure.ServiceException; +import com.sun.jersey.api.client.ClientHandlerException; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.ClientResponse.Status; +import com.sun.jersey.api.client.UniformInterfaceException; + +public class ServiceExceptionFactory { + public static ServiceException create(String serviceName, String message, UniformInterfaceException cause){ + ServiceException exception = new ServiceException(message, cause); + populate(exception, serviceName, cause); + return exception; + } + + public static ServiceException create(String serviceName, UniformInterfaceException cause) { + ServiceException exception = new ServiceException(cause); + populate(exception, serviceName, cause); + return exception; + } + + public static ServiceException create(String serviceName, String message, ClientHandlerException cause) { + ServiceException exception = new ServiceException(message, cause); + for (Throwable scan = cause; scan != null; scan = scan.getCause()) { + if (ServiceException.class.isAssignableFrom(scan.getClass())) { + populate(exception, serviceName, (ServiceException)scan); + break; + } + else if (UniformInterfaceException.class.isAssignableFrom(scan.getClass())) { + populate(exception, serviceName, (UniformInterfaceException)scan); + break; + } + } + return exception; + } + + public static ServiceException create(String serviceName, ClientHandlerException cause) { + ServiceException exception = new ServiceException(cause); + for (Throwable scan = cause; scan != null; scan = scan.getCause()) { + if (ServiceException.class.isAssignableFrom(scan.getClass())) { + populate(exception, serviceName, (ServiceException)scan); + break; + } + else if (UniformInterfaceException.class.isAssignableFrom(scan.getClass())) { + populate(exception, serviceName, (UniformInterfaceException)scan); + break; + } + } + return exception; + } + + static void populate(ServiceException exception, String serviceName, + UniformInterfaceException cause) { + exception.setServiceName(serviceName); + + if (cause != null) { + ClientResponse response = cause.getResponse(); + if (response != null) { + Status status = response.getClientResponseStatus(); + if (status == null) { + status = Status.fromStatusCode(response.getStatus()); + } + if (status == null) { + exception.setHttpStatusCode(response.getStatus()); + } + else { + exception.setHttpStatusCode(status.getStatusCode()); + exception.setHttpReasonPhrase(status.getReasonPhrase()); + } + } + } + } + + static void populate(ServiceException exception, String serviceName, + ServiceException cause) { + exception.setServiceName(cause.getServiceName()); + exception.setHttpStatusCode(cause.getHttpStatusCode()); + exception.setHttpReasonPhrase(cause.getHttpReasonPhrase()); + exception.setErrorCode(cause.getErrorCode()); + exception.setErrorMessage(cause.getErrorMessage()); + exception.setErrorValues(cause.getErrorValues()); + } + +} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientTest.java index 78124d937d66..c99b079aa849 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/auth/wrap/WrapClientTest.java @@ -12,6 +12,7 @@ import static org.junit.Assert.*; import static org.mockito.Mockito.*; +import com.microsoft.azure.ServiceException; import com.microsoft.azure.auth.wrap.contract.WrapContract; import com.microsoft.azure.auth.wrap.contract.WrapResponse; import com.microsoft.azure.utils.DateFactory; @@ -45,7 +46,7 @@ public Date answer(InvocationOnMock invocation) throws Throwable { } @Test - public void clientUsesContractToGetToken(){ + public void clientUsesContractToGetToken() throws ServiceException{ // Arrange WrapResponse wrapResponse = new WrapResponse(); wrapResponse.setAccessToken("testaccesstoken"); @@ -63,7 +64,7 @@ public void clientUsesContractToGetToken(){ @Test - public void clientWillNotCallMultipleTimesWhileAccessTokenIsValid(){ + public void clientWillNotCallMultipleTimesWhileAccessTokenIsValid() throws ServiceException{ // Arrange WrapResponse wrapResponse = new WrapResponse(); wrapResponse.setAccessToken("testaccesstoken"); @@ -86,7 +87,7 @@ public void clientWillNotCallMultipleTimesWhileAccessTokenIsValid(){ } @Test - public void clientWillBeCalledWhenTokenIsHalfwayToExpiring(){ + public void clientWillBeCalledWhenTokenIsHalfwayToExpiring() throws ServiceException{ // Arrange doAnswer(new Answer() { int count = 0; diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java index 4fa5b536fc85..56ebd7053e75 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java @@ -1,6 +1,9 @@ package com.microsoft.azure.services.serviceBus; +import java.io.Console; + import org.junit.Before; +import org.junit.BeforeClass; import com.microsoft.azure.configuration.Configuration; @@ -19,12 +22,17 @@ protected Configuration createConfiguration() { return config; } + + @BeforeClass + public static void initializeSystem() { + System.out.println("initialize"); + System.setProperty("http.proxyHost", "itgproxy"); + System.setProperty("http.proxyPort", "80"); + System.setProperty("http.keepAlive", "false"); + } @Before public void initialize() throws Exception { - System.setProperty("http.proxyHost", "157.54.119.101"); - System.setProperty("http.proxyPort", "80"); - System.setProperty("http.keepAlive", "false"); boolean testAlphaExists = false; ServiceBusClient client = createConfiguration().create(ServiceBusClient.class); diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java index 51d3b0f921a8..0293ab0fd8bc 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java @@ -64,12 +64,12 @@ public void existingQueuePathDoesNotReturnNull() throws Exception { ServiceBusClient client = createClient(); // Act - Queue queue = client.getQueue("Hello"); + Queue queue = client.getQueue("TestAlpha"); queue.fetch(); // Assert assertNotNull(queue); - assertEquals("Hello", queue.getName()); + assertEquals("TestAlpha", queue.getName()); } @Test diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java index 67a3f236cdfa..ed0ede5d2374 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java @@ -11,13 +11,14 @@ import org.w3._2005.atom.Content; import org.w3._2005.atom.Entry; +import com.microsoft.azure.ServiceException; import com.microsoft.azure.services.serviceBus.contract.QueueDescription; import com.microsoft.azure.services.serviceBus.contract.ServiceBusContract; public class QueueManagementTest { @Test - public void testGetQueueAcquiresDescriptionFromServer() { + public void testGetQueueAcquiresDescriptionFromServer() throws ServiceException { // Arrange ServiceBusContract contract = mock(ServiceBusContract.class); @@ -38,7 +39,7 @@ public void testGetQueueAcquiresDescriptionFromServer() { } @Test - public void queueCreateSendsCreateQueueDescriptionMessage() throws DatatypeConfigurationException { + public void queueCreateSendsCreateQueueDescriptionMessage() throws DatatypeConfigurationException, ServiceException { // Arrange ServiceBusContract contract = mock(ServiceBusContract.class); diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/utils/ServiceExceptionFactoryTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/utils/ServiceExceptionFactoryTest.java new file mode 100644 index 000000000000..1952ab64d475 --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/utils/ServiceExceptionFactoryTest.java @@ -0,0 +1,66 @@ +package com.microsoft.azure.utils; + +import static org.junit.Assert.*; + +import java.io.ByteArrayInputStream; + +import org.junit.Test; + +import com.microsoft.azure.ServiceException; +import com.sun.jersey.api.client.ClientHandlerException; +import com.sun.jersey.api.client.ClientResponse; +import com.sun.jersey.api.client.UniformInterfaceException; + +public class ServiceExceptionFactoryTest { + @Test + public void serviceNameAndMessageAndCauseAppearInException() { + // Arrange + ClientResponse response = new ClientResponse(404, null, new ByteArrayInputStream(new byte[0]), null); + UniformInterfaceException cause = new UniformInterfaceException( + response); + + // Act + ServiceException exception = ServiceExceptionFactory.create("testing", + "this is a test", cause); + + // Assert + assertNotNull(exception); + assertEquals("testing", exception.getServiceName()); + assertEquals("this is a test", exception.getMessage()); + assertEquals(cause, exception.getCause()); + } + + @Test + public void httpStatusCodeAndReasonPhraseAppearInException() { + // Arrange + ClientResponse response = new ClientResponse(404, null, new ByteArrayInputStream(new byte[0]), null); + UniformInterfaceException cause = new UniformInterfaceException( + response); + + // Act + ServiceException exception = ServiceExceptionFactory.create("testing", + "this is a test", cause); + + // Assert + assertNotNull(exception); + assertEquals(404, exception.getHttpStatusCode()); + assertEquals("Not Found", exception.getHttpReasonPhrase()); + } + + @Test + public void informationWillPassUpIfServiceExceptionIsRootCauseOfClientHandlerExceptions() { + // Arrange + ClientResponse response = new ClientResponse(503, null, new ByteArrayInputStream(new byte[0]), null); + UniformInterfaceException rootCause = new UniformInterfaceException(response); + ServiceException originalDescription = ServiceExceptionFactory.create("underlying", rootCause); + ClientHandlerException wrappingException = new ClientHandlerException(originalDescription); + + // Act + ServiceException exception = ServiceExceptionFactory.create("actual", wrappingException); + + // Assert + assertEquals(503, exception.getHttpStatusCode()); + assertEquals("underlying", exception.getServiceName()); + } + +} From e0e52aceb8ec05c104a6843eb193a9bbe294f72f Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 26 Oct 2011 18:20:29 -0700 Subject: [PATCH 35/59] Refactor how ServiceException is created the instance is created within the catch block, and the rest of the properties are assigned in the serviceexceptionfactory, in order to produce better exception call stacks --- .../auth/wrap/contract/WrapContractImpl.java | 4 +- .../contract/ServiceBusContractImpl.java | 60 ++++++++----------- .../azure/utils/ServiceExceptionFactory.java | 45 ++++---------- .../serviceBus/IntegrationTestBase.java | 6 +- .../QueueManagementIntegrationTest.java | 11 ---- .../utils/ServiceExceptionFactoryTest.java | 10 ++-- 6 files changed, 47 insertions(+), 89 deletions(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContractImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContractImpl.java index 194d7656b712..46fe925aa052 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContractImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/auth/wrap/contract/WrapContractImpl.java @@ -36,8 +36,8 @@ public WrapResponse post(String uri, String name, String password, String scope) .post(Form.class, requestForm); } catch (UniformInterfaceException e) { - log.warn("Failed WrapContract.post operation", e); - throw ServiceExceptionFactory.create("WRAP", "Failed WrapContract.post operation", e); + log.warn("WRAP server returned error acquiring access_token", e); + throw ServiceExceptionFactory.process("WRAP", new ServiceException("WRAP server returned error acquiring access_token", e)); } WrapResponse response = new WrapResponse(); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java index bff5af8f7439..f7f330edc851 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java @@ -53,6 +53,11 @@ private WebResource getResource() { .resource(uri); } + private ServiceException processCatch(ServiceException e) { + log.warn(e.getMessage(), e.getCause()); + return ServiceExceptionFactory.process("serviceBus", e); + } + // REVIEW: contentType will be needed public void sendMessage(String path, BrokerProperties properties, InputStream body) throws ServiceException { try { @@ -63,12 +68,10 @@ public void sendMessage(String path, BrokerProperties properties, InputStream bo .post(body); } catch(UniformInterfaceException e) { - log.warn(e); - throw ServiceExceptionFactory.create("serviceBus", e); + throw processCatch(new ServiceException(e)); } catch(ClientHandlerException e) { - log.warn(e); - throw ServiceExceptionFactory.create("serviceBus", e); + throw processCatch(new ServiceException(e)); } } @@ -90,12 +93,10 @@ public MessageResult receiveMessage(String queuePath, Integer timeout, clientResult = resource.delete(ClientResponse.class); } catch(UniformInterfaceException e) { - log.warn(e); - throw ServiceExceptionFactory.create("serviceBus", e); + throw processCatch(new ServiceException(e)); } catch(ClientHandlerException e) { - log.warn(e); - throw ServiceExceptionFactory.create("serviceBus", e); + throw processCatch(new ServiceException(e)); } } else if (receiveMode == ReceiveMode.PEEK_LOCK) { @@ -103,18 +104,17 @@ else if (receiveMode == ReceiveMode.PEEK_LOCK) { clientResult = resource.post(ClientResponse.class, ""); } catch(UniformInterfaceException e) { - log.warn(e); - throw ServiceExceptionFactory.create("serviceBus", e); + throw processCatch(new ServiceException(e)); } catch(ClientHandlerException e) { - log.warn(e); - throw ServiceExceptionFactory.create("serviceBus", e); + throw processCatch(new ServiceException(e)); } } else { throw new RuntimeException("Unknown ReceiveMode"); } + // REVIEW: harden this - it's much too brittle. throws null exceptions very easily MessageResult result = new MessageResult(); result.setBrokerProperties(mapper.fromString(clientResult.getHeaders().getFirst("BrokerProperties"))); result.setBody(clientResult.getEntityInputStream()); @@ -130,12 +130,10 @@ public Entry createQueue(Entry entry) throws ServiceException { .put(Entry.class, entry); } catch(UniformInterfaceException e) { - log.warn(e); - throw ServiceExceptionFactory.create("serviceBus", e); + throw processCatch(new ServiceException(e)); } catch(ClientHandlerException e) { - log.warn(e); - throw ServiceExceptionFactory.create("serviceBus", e); + throw processCatch(new ServiceException(e)); } } @@ -146,12 +144,10 @@ public void deleteQueue(String queuePath) throws ServiceException { .delete(); } catch(UniformInterfaceException e) { - log.warn(e); - throw ServiceExceptionFactory.create("serviceBus", e); + throw processCatch(new ServiceException(e)); } catch(ClientHandlerException e) { - log.warn(e); - throw ServiceExceptionFactory.create("serviceBus", e); + throw processCatch(new ServiceException(e)); } } @@ -162,12 +158,10 @@ public Entry getQueue(String queuePath) throws ServiceException { .get(Entry.class); } catch(UniformInterfaceException e) { - log.warn(e); - throw ServiceExceptionFactory.create("serviceBus", e); + throw processCatch(new ServiceException(e)); } catch(ClientHandlerException e) { - log.warn(e); - throw ServiceExceptionFactory.create("serviceBus", e); + throw processCatch(new ServiceException(e)); } } @@ -178,12 +172,10 @@ public Feed getQueues() throws ServiceException { .get(Feed.class); } catch(UniformInterfaceException e) { - log.warn(e); - throw ServiceExceptionFactory.create("serviceBus", e); + throw processCatch(new ServiceException(e)); } catch(ClientHandlerException e) { - log.warn(e); - throw ServiceExceptionFactory.create("serviceBus", e); + throw processCatch(new ServiceException(e)); } } @@ -195,12 +187,10 @@ public Entry createTopic(Entry entry) throws ServiceException { .put(Entry.class, entry); } catch(UniformInterfaceException e) { - log.warn(e); - throw ServiceExceptionFactory.create("serviceBus", e); + throw processCatch(new ServiceException(e)); } catch(ClientHandlerException e) { - log.warn(e); - throw ServiceExceptionFactory.create("serviceBus", e); + throw processCatch(new ServiceException(e)); } } @@ -211,12 +201,10 @@ public void deleteTopic(String topicPath) throws ServiceException { .delete(); } catch(UniformInterfaceException e) { - log.warn(e); - throw ServiceExceptionFactory.create("serviceBus", e); + throw processCatch(new ServiceException(e)); } catch(ClientHandlerException e) { - log.warn(e); - throw ServiceExceptionFactory.create("serviceBus", e); + throw processCatch(new ServiceException(e)); } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/ServiceExceptionFactory.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/ServiceExceptionFactory.java index ae1178aa16d0..e01fe3fd1206 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/ServiceExceptionFactory.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/utils/ServiceExceptionFactory.java @@ -7,49 +7,26 @@ import com.sun.jersey.api.client.UniformInterfaceException; public class ServiceExceptionFactory { - public static ServiceException create(String serviceName, String message, UniformInterfaceException cause){ - ServiceException exception = new ServiceException(message, cause); - populate(exception, serviceName, cause); - return exception; - } - - public static ServiceException create(String serviceName, UniformInterfaceException cause) { - ServiceException exception = new ServiceException(cause); - populate(exception, serviceName, cause); - return exception; - } - public static ServiceException create(String serviceName, String message, ClientHandlerException cause) { - ServiceException exception = new ServiceException(message, cause); + public static ServiceException process(String serviceName, ServiceException exception) { + Throwable cause = exception.getCause(); + for (Throwable scan = cause; scan != null; scan = scan.getCause()) { if (ServiceException.class.isAssignableFrom(scan.getClass())) { - populate(exception, serviceName, (ServiceException)scan); - break; + return populate(exception, serviceName, (ServiceException)scan); } else if (UniformInterfaceException.class.isAssignableFrom(scan.getClass())) { - populate(exception, serviceName, (UniformInterfaceException)scan); - break; + return populate(exception, serviceName, (UniformInterfaceException)scan); } } - return exception; - } + + exception.setServiceName(serviceName); - public static ServiceException create(String serviceName, ClientHandlerException cause) { - ServiceException exception = new ServiceException(cause); - for (Throwable scan = cause; scan != null; scan = scan.getCause()) { - if (ServiceException.class.isAssignableFrom(scan.getClass())) { - populate(exception, serviceName, (ServiceException)scan); - break; - } - else if (UniformInterfaceException.class.isAssignableFrom(scan.getClass())) { - populate(exception, serviceName, (UniformInterfaceException)scan); - break; - } - } return exception; } + - static void populate(ServiceException exception, String serviceName, + static ServiceException populate(ServiceException exception, String serviceName, UniformInterfaceException cause) { exception.setServiceName(serviceName); @@ -69,9 +46,10 @@ static void populate(ServiceException exception, String serviceName, } } } + return exception; } - static void populate(ServiceException exception, String serviceName, + static ServiceException populate(ServiceException exception, String serviceName, ServiceException cause) { exception.setServiceName(cause.getServiceName()); exception.setHttpStatusCode(cause.getHttpStatusCode()); @@ -79,6 +57,7 @@ static void populate(ServiceException exception, String serviceName, exception.setErrorCode(cause.getErrorCode()); exception.setErrorMessage(cause.getErrorMessage()); exception.setErrorValues(cause.getErrorValues()); + return exception; } } diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java index 56ebd7053e75..9a4ec649ad86 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java @@ -28,11 +28,15 @@ public static void initializeSystem() { System.out.println("initialize"); System.setProperty("http.proxyHost", "itgproxy"); System.setProperty("http.proxyPort", "80"); - System.setProperty("http.keepAlive", "false"); + //System.setProperty("http.keepAlive", "false"); } @Before public void initialize() throws Exception { + System.out.println("initialize"); + System.setProperty("http.proxyHost", "itgproxy"); + System.setProperty("http.proxyPort", "80"); + //System.setProperty("http.keepAlive", "false"); boolean testAlphaExists = false; ServiceBusClient client = createConfiguration().create(ServiceBusClient.class); diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java index 0293ab0fd8bc..9b5bb9830797 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java @@ -46,17 +46,6 @@ public void whenQueueIsCreatedEntityStateIsAlsoUpdated() throws Exception { assertNotNull(maxSizeAfter); } - @Test - public void notFoundQueuePathReturnsNull() throws Exception { - // Arrange - ServiceBusClient client = createClient(); - - // Act - Queue queue = client.getQueue("NoSuchQueueName"); - - // Assert - assertNull(queue); - } @Test public void existingQueuePathDoesNotReturnNull() throws Exception { diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/utils/ServiceExceptionFactoryTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/utils/ServiceExceptionFactoryTest.java index 1952ab64d475..672125cb5dc2 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/utils/ServiceExceptionFactoryTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/utils/ServiceExceptionFactoryTest.java @@ -20,8 +20,7 @@ public void serviceNameAndMessageAndCauseAppearInException() { response); // Act - ServiceException exception = ServiceExceptionFactory.create("testing", - "this is a test", cause); + ServiceException exception = ServiceExceptionFactory.process("testing", new ServiceException("this is a test", cause)); // Assert assertNotNull(exception); @@ -38,8 +37,7 @@ public void httpStatusCodeAndReasonPhraseAppearInException() { response); // Act - ServiceException exception = ServiceExceptionFactory.create("testing", - "this is a test", cause); + ServiceException exception = ServiceExceptionFactory.process("testing", new ServiceException("this is a test", cause)); // Assert assertNotNull(exception); @@ -52,11 +50,11 @@ public void informationWillPassUpIfServiceExceptionIsRootCauseOfClientHandlerExc // Arrange ClientResponse response = new ClientResponse(503, null, new ByteArrayInputStream(new byte[0]), null); UniformInterfaceException rootCause = new UniformInterfaceException(response); - ServiceException originalDescription = ServiceExceptionFactory.create("underlying", rootCause); + ServiceException originalDescription = ServiceExceptionFactory.process("underlying", new ServiceException(rootCause)); ClientHandlerException wrappingException = new ClientHandlerException(originalDescription); // Act - ServiceException exception = ServiceExceptionFactory.create("actual", wrappingException); + ServiceException exception = ServiceExceptionFactory.process("actual", new ServiceException(wrappingException)); // Assert assertEquals(503, exception.getHttpStatusCode()); From 68b385b65ee2e94cc7748836ed733dc3d70b3e33 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 2 Nov 2011 10:59:43 -0700 Subject: [PATCH 36/59] Shuffle package names Service-oriented api at services.serviceBus Messaging helper api at services.serviceBus.messaging services.xxx.XxxContract becomes services.xxx.XxxService --- .../configuration/builder/DefaultBuilder.java | 2 +- .../{contract => }/BrokerProperties.java | 2 +- .../BrokerPropertiesMapper.java | 2 +- .../azure/services/serviceBus/Exports.java | 28 +++++++++- .../{contract => }/MarshallerProvider.java | 2 +- .../{contract => }/MessageResult.java | 2 +- .../NamespacePrefixMapperImpl.java | 2 +- .../{contract => }/ReceiveMode.java | 2 +- .../azure/services/serviceBus/Rule.java | 5 -- ...usContract.java => ServiceBusService.java} | 4 +- ...ctImpl.java => ServiceBusServiceImpl.java} | 8 +-- .../services/serviceBus/contract/Exports.java | 35 ------------- .../{ => messaging}/AbstractEntity.java | 6 +-- .../serviceBus/messaging/Exports.java | 9 ++++ .../{ => messaging}/ListQueuesOptions.java | 2 +- .../serviceBus/{ => messaging}/Message.java | 4 +- .../{ => messaging}/MessageReceiver.java | 2 +- .../{ => messaging}/MessageSender.java | 2 +- .../{ => messaging}/MessageTransceiver.java | 2 +- .../serviceBus/{ => messaging}/Queue.java | 6 +-- .../ReceiveMessageOptions.java | 2 +- .../services/serviceBus/messaging/Rule.java | 5 ++ .../{ => messaging}/SendMessageOptions.java | 2 +- .../{ => messaging}/ServiceBusClient.java | 14 ++--- .../{ => messaging}/Subscription.java | 2 +- .../serviceBus/{ => messaging}/Topic.java | 2 +- ...zure.configuration.builder.Builder$Exports | 2 +- .../BrokerPropertiesMapperTest.java | 5 +- .../serviceBus/ContractBuilderTest.java | 19 +++++++ .../ContractIntegrationTest.java | 51 ++++++++++--------- .../contract/ContractBuilderTest.java | 17 ------- .../{ => messaging}/ClientBuilderTest.java | 9 ++-- .../{ => messaging}/IntegrationTestBase.java | 5 +- .../QueueManagementIntegrationTest.java | 7 +-- .../{ => messaging}/QueueManagementTest.java | 10 ++-- 35 files changed, 147 insertions(+), 132 deletions(-) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{contract => }/BrokerProperties.java (96%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{contract => }/BrokerPropertiesMapper.java (96%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{contract => }/MarshallerProvider.java (96%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{contract => }/MessageResult.java (91%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{contract => }/NamespacePrefixMapperImpl.java (88%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{contract => }/ReceiveMode.java (51%) delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Rule.java rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{contract/ServiceBusContract.java => ServiceBusService.java} (95%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{contract/ServiceBusContractImpl.java => ServiceBusServiceImpl.java} (93%) delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Exports.java rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ => messaging}/AbstractEntity.java (77%) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Exports.java rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ => messaging}/ListQueuesOptions.java (84%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ => messaging}/Message.java (92%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ => messaging}/MessageReceiver.java (86%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ => messaging}/MessageSender.java (77%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ => messaging}/MessageTransceiver.java (55%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ => messaging}/Queue.java (94%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ => messaging}/ReceiveMessageOptions.java (83%) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Rule.java rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ => messaging}/SendMessageOptions.java (66%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ => messaging}/ServiceBusClient.java (78%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ => messaging}/Subscription.java (55%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ => messaging}/Topic.java (57%) rename microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/{contract => }/BrokerPropertiesMapperTest.java (83%) create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractBuilderTest.java rename microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/{contract => }/ContractIntegrationTest.java (57%) delete mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractBuilderTest.java rename microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/{ => messaging}/ClientBuilderTest.java (71%) rename microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/{ => messaging}/IntegrationTestBase.java (87%) rename microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/{ => messaging}/QueueManagementIntegrationTest.java (85%) rename microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/{ => messaging}/QueueManagementTest.java (80%) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java index 753026bdc819..f0dc5b1b0ec1 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/configuration/builder/DefaultBuilder.java @@ -150,7 +150,7 @@ public Registry add(Factory factory) { public T build(String profile, Class service, Map properties) throws Exception { Factory factory = (Factory) factories.get(service); if (factory == null) { - throw new RuntimeException("Service not registered: " + profile + " " + service.getName()); + throw new RuntimeException("Service or property not registered: " + profile + " " + service.getName()); } T instance = factory.create(profile, this, properties); List> alterationList = alterations.get(service); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerProperties.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokerProperties.java similarity index 96% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerProperties.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokerProperties.java index ad2b3ee1a680..8b8806cc65b8 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerProperties.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokerProperties.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus.contract; +package com.microsoft.azure.services.serviceBus; import org.codehaus.jackson.annotate.JsonGetter; import org.codehaus.jackson.annotate.JsonIgnore; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerPropertiesMapper.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapper.java similarity index 96% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerPropertiesMapper.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapper.java index 8701f1db467f..1cba63fc7519 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/BrokerPropertiesMapper.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapper.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus.contract; +package com.microsoft.azure.services.serviceBus; import java.io.IOException; import java.io.StringWriter; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java index 5af49c37c86c..2119232293da 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java @@ -1,9 +1,35 @@ package com.microsoft.azure.services.serviceBus; +import java.util.Map; + import com.microsoft.azure.configuration.builder.Builder; +import com.sun.jersey.api.client.config.ClientConfig; +import com.sun.jersey.api.json.JSONConfiguration; public class Exports implements Builder.Exports { public void register(Builder.Registry registry) { - registry.add(ServiceBusClient.class); + + // provide contract implementation + registry.add(ServiceBusService.class, ServiceBusServiceImpl.class); + + // alter jersey client config for serviceBus + registry.alter(ClientConfig.class, new Builder.Alteration() { + + public ClientConfig alter(ClientConfig instance, Builder builder, + Map properties) throws Exception { + + // enable this feature for unattributed json object serialization + instance.getProperties().put(JSONConfiguration.FEATURE_POJO_MAPPING, true); + + // need to avoid certain element prefixes, which the service does not ignore + instance.getSingletons().add(new MarshallerProvider()); + + return instance; + } + }); + + // convenience provider to transform BrokerProperty headers to json + registry.add(BrokerPropertiesMapper.class); + } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/MarshallerProvider.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MarshallerProvider.java similarity index 96% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/MarshallerProvider.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MarshallerProvider.java index e529e48e7708..46160a0b98a5 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/MarshallerProvider.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MarshallerProvider.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus.contract; +package com.microsoft.azure.services.serviceBus; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/MessageResult.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageResult.java similarity index 91% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/MessageResult.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageResult.java index 6c98703c48a3..9de5f7ec3c3d 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/MessageResult.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageResult.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus.contract; +package com.microsoft.azure.services.serviceBus; import java.io.InputStream; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/NamespacePrefixMapperImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/NamespacePrefixMapperImpl.java similarity index 88% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/NamespacePrefixMapperImpl.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/NamespacePrefixMapperImpl.java index 3f41f21e91f4..59bf4de5ca34 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/NamespacePrefixMapperImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/NamespacePrefixMapperImpl.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus.contract; +package com.microsoft.azure.services.serviceBus; import com.sun.xml.bind.marshaller.NamespacePrefixMapper; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ReceiveMode.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ReceiveMode.java similarity index 51% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ReceiveMode.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ReceiveMode.java index 2bcf4f136ebc..b96aa03a3835 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ReceiveMode.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ReceiveMode.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus.contract; +package com.microsoft.azure.services.serviceBus; public enum ReceiveMode { PEEK_LOCK, diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Rule.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Rule.java deleted file mode 100644 index 2ca00d6ed13f..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Rule.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.microsoft.azure.services.serviceBus; - -public class Rule { - -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java similarity index 95% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java index def3a61dde22..a1c2cfb050f0 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContract.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus.contract; +package com.microsoft.azure.services.serviceBus; import java.io.InputStream; @@ -8,7 +8,7 @@ import com.microsoft.azure.ServiceException; -public interface ServiceBusContract { +public interface ServiceBusService { void sendMessage(String path, BrokerProperties properties, InputStream body) throws ServiceException; MessageResult receiveMessage(String queuePath, Integer timeout, ReceiveMode receiveMode) throws ServiceException; //BrokeredMessage receiveMessage(String topicPath, String subscriptionName, int timeout, ReceiveMode receiveMode) throws ServiceException; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java similarity index 93% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java index f7f330edc851..236ca715bdc5 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/ServiceBusContractImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus.contract; +package com.microsoft.azure.services.serviceBus; import java.io.InputStream; import java.rmi.UnexpectedException; @@ -20,15 +20,15 @@ import com.sun.jersey.api.client.UniformInterfaceException; import com.sun.jersey.api.client.WebResource; -public class ServiceBusContractImpl implements ServiceBusContract { +public class ServiceBusServiceImpl implements ServiceBusService { private Client channel; private String uri; private BrokerPropertiesMapper mapper; - static Log log = LogFactory.getLog(ServiceBusContract.class); + static Log log = LogFactory.getLog(ServiceBusService.class); @Inject - public ServiceBusContractImpl( + public ServiceBusServiceImpl( Client channel, @Named("serviceBus") WrapFilter authFilter, @Named("serviceBus.uri") String uri, diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Exports.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Exports.java deleted file mode 100644 index 845ca50fabe5..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/contract/Exports.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.microsoft.azure.services.serviceBus.contract; - -import java.util.Map; - -import com.microsoft.azure.configuration.builder.Builder; -import com.sun.jersey.api.client.config.ClientConfig; -import com.sun.jersey.api.json.JSONConfiguration; - -public class Exports implements Builder.Exports { - public void register(Builder.Registry registry) { - - // provide contract implementation - registry.add(ServiceBusContract.class, ServiceBusContractImpl.class); - - // alter jersey client config for serviceBus - registry.alter(ClientConfig.class, new Builder.Alteration() { - - public ClientConfig alter(ClientConfig instance, Builder builder, - Map properties) throws Exception { - - // enable this feature for unattributed json object serialization - instance.getProperties().put(JSONConfiguration.FEATURE_POJO_MAPPING, true); - - // need to avoid certain element prefixes, which the service does not ignore - instance.getSingletons().add(new MarshallerProvider()); - - return instance; - } - }); - - // convenience provider to transform BrokerProperty headers to json - registry.add(BrokerPropertiesMapper.class); - - } -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/AbstractEntity.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/AbstractEntity.java similarity index 77% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/AbstractEntity.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/AbstractEntity.java index 8c56bd724c0c..c977f455bf9e 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/AbstractEntity.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/AbstractEntity.java @@ -1,11 +1,11 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.messaging; import javax.ws.rs.core.MediaType; import org.w3._2005.atom.Content; import org.w3._2005.atom.Entry; -import com.microsoft.azure.services.serviceBus.contract.ServiceBusContract; +import com.microsoft.azure.services.serviceBus.ServiceBusService; abstract class AbstractEntity { @@ -28,7 +28,7 @@ protected ServiceBusClient getClient() { return client; } - protected ServiceBusContract getContract() { + protected ServiceBusService getContract() { return getClient().getContract(); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Exports.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Exports.java new file mode 100644 index 000000000000..49f16aceca57 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Exports.java @@ -0,0 +1,9 @@ +package com.microsoft.azure.services.serviceBus.messaging; + +import com.microsoft.azure.configuration.builder.Builder; + +public class Exports implements Builder.Exports { + public void register(Builder.Registry registry) { + registry.add(ServiceBusClient.class); + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ListQueuesOptions.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ListQueuesOptions.java similarity index 84% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ListQueuesOptions.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ListQueuesOptions.java index 3a966f292796..b8b6b73b4094 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ListQueuesOptions.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ListQueuesOptions.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.messaging; public class ListQueuesOptions { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Message.java similarity index 92% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Message.java index 59711059aae1..f440b77a41b4 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Message.java @@ -1,9 +1,9 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.messaging; import java.io.ByteArrayInputStream; import java.io.InputStream; -import com.microsoft.azure.services.serviceBus.contract.BrokerProperties; +import com.microsoft.azure.services.serviceBus.BrokerProperties; public class Message { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageReceiver.java similarity index 86% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageReceiver.java index 2b8c23ae22ae..0bed33badbe2 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageReceiver.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageReceiver.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.messaging; import com.microsoft.azure.ServiceException; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageSender.java similarity index 77% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageSender.java index a6a5dbe12991..c942cbf51550 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageSender.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageSender.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.messaging; import com.microsoft.azure.ServiceException; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageTransceiver.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageTransceiver.java similarity index 55% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageTransceiver.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageTransceiver.java index 8732e42fe474..2dbe7eb97899 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageTransceiver.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageTransceiver.java @@ -1,5 +1,5 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.messaging; public interface MessageTransceiver extends MessageSender, MessageReceiver { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Queue.java similarity index 94% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Queue.java index 0cf1547e3fa3..5035f9b8c08b 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Queue.java @@ -1,13 +1,13 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.messaging; import javax.xml.datatype.Duration; import org.w3._2005.atom.Content; import org.w3._2005.atom.Entry; import com.microsoft.azure.ServiceException; -import com.microsoft.azure.services.serviceBus.contract.MessageResult; +import com.microsoft.azure.services.serviceBus.MessageResult; +import com.microsoft.azure.services.serviceBus.ReceiveMode; import com.microsoft.azure.services.serviceBus.contract.QueueDescription; -import com.microsoft.azure.services.serviceBus.contract.ReceiveMode; public class Queue extends AbstractEntity implements MessageSender, MessageReceiver, MessageTransceiver { Queue(ServiceBusClient client, String name) { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ReceiveMessageOptions.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ReceiveMessageOptions.java similarity index 83% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ReceiveMessageOptions.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ReceiveMessageOptions.java index 426830679f3c..3e91c4991e96 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ReceiveMessageOptions.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ReceiveMessageOptions.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.messaging; public class ReceiveMessageOptions { Integer timeout; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Rule.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Rule.java new file mode 100644 index 000000000000..6024ffc99502 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Rule.java @@ -0,0 +1,5 @@ +package com.microsoft.azure.services.serviceBus.messaging; + +public class Rule { + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/SendMessageOptions.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/SendMessageOptions.java similarity index 66% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/SendMessageOptions.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/SendMessageOptions.java index 16ed9cbae34f..a1af78c64888 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/SendMessageOptions.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/SendMessageOptions.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.messaging; public class SendMessageOptions { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ServiceBusClient.java similarity index 78% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ServiceBusClient.java index 269601f14278..69c7382e6f99 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ServiceBusClient.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.messaging; import java.util.ArrayList; @@ -9,11 +9,11 @@ import com.microsoft.azure.ServiceException; import com.microsoft.azure.configuration.Configuration; -import com.microsoft.azure.services.serviceBus.contract.ServiceBusContract; +import com.microsoft.azure.services.serviceBus.ServiceBusService; public class ServiceBusClient { - ServiceBusContract contract; + ServiceBusService contract; public ServiceBusClient() throws Exception { this("", Configuration.load()); @@ -28,19 +28,19 @@ public ServiceBusClient(String profile) throws Exception { } public ServiceBusClient(String profile, Configuration config) throws Exception { - this(config.create(profile, ServiceBusContract.class)); + this(config.create(profile, ServiceBusService.class)); } @Inject - public ServiceBusClient(ServiceBusContract contract) { + public ServiceBusClient(ServiceBusService contract) { this.contract = contract; } - public ServiceBusContract getContract() { + public ServiceBusService getContract() { return contract; } - public void setContract(ServiceBusContract contract) { + public void setContract(ServiceBusService contract) { this.contract = contract; } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Subscription.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Subscription.java similarity index 55% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Subscription.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Subscription.java index e06239ff2db6..df3f45f2482b 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Subscription.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Subscription.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.messaging; public class Subscription { public Rule getRules() { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Topic.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Topic.java similarity index 57% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Topic.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Topic.java index e54297fdc961..a71cc3701b2b 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Topic.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Topic.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.messaging; public class Topic { Subscription[] getSubscriptions() { diff --git a/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports b/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports index 1da2036a8749..f7e819ac5b1e 100644 --- a/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports +++ b/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports @@ -1,5 +1,5 @@ com.microsoft.azure.auth.wrap.Exports com.microsoft.azure.configuration.jersey.Exports com.microsoft.azure.services.serviceBus.Exports -com.microsoft.azure.services.serviceBus.contract.Exports +com.microsoft.azure.services.serviceBus.messaging.Exports com.microsoft.azure.utils.Exports diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/BrokerPropertiesMapperTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapperTest.java similarity index 83% rename from microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/BrokerPropertiesMapperTest.java rename to microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapperTest.java index 30b8f77f6275..fbe2bd445117 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/BrokerPropertiesMapperTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapperTest.java @@ -1,9 +1,12 @@ -package com.microsoft.azure.services.serviceBus.contract; +package com.microsoft.azure.services.serviceBus; import static org.junit.Assert.*; import org.junit.Test; +import com.microsoft.azure.services.serviceBus.BrokerProperties; +import com.microsoft.azure.services.serviceBus.BrokerPropertiesMapper; + public class BrokerPropertiesMapperTest { @Test public void jsonStringMapsToBrokerPropertiesObject(){ diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractBuilderTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractBuilderTest.java new file mode 100644 index 000000000000..1935b059e5d0 --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractBuilderTest.java @@ -0,0 +1,19 @@ +package com.microsoft.azure.services.serviceBus; + + +import static org.junit.Assert.*; +import org.junit.Test; + +import com.microsoft.azure.configuration.Configuration; +import com.microsoft.azure.services.serviceBus.ServiceBusService; + +public class ContractBuilderTest { + @Test + public void testDefaultBuilderCreatesServiceImpl() throws Exception { + Configuration config = new Configuration(); + ServiceBusService service = config.create(ServiceBusService.class); + + assertNotNull(service); + assertEquals(ServiceBusServiceImpl.class, service.getClass()); + } +} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractIntegrationTest.java similarity index 57% rename from microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java rename to microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractIntegrationTest.java index bb43c1ac5d44..18ad2f69daa4 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractIntegrationTest.java @@ -1,40 +1,51 @@ -package com.microsoft.azure.services.serviceBus.contract; +package com.microsoft.azure.services.serviceBus; import java.io.ByteArrayInputStream; +import org.junit.Before; import org.junit.Test; import org.w3._2005.atom.Content; import org.w3._2005.atom.Entry; import org.w3._2005.atom.Feed; import com.microsoft.azure.configuration.Configuration; -import com.microsoft.azure.services.serviceBus.IntegrationTestBase; +import com.microsoft.azure.services.serviceBus.BrokerProperties; +import com.microsoft.azure.services.serviceBus.MessageResult; +import com.microsoft.azure.services.serviceBus.ReceiveMode; +import com.microsoft.azure.services.serviceBus.ServiceBusService; +import com.microsoft.azure.services.serviceBus.contract.QueueDescription; +import com.microsoft.azure.services.serviceBus.messaging.IntegrationTestBase; import static org.junit.Assert.*; public class ContractIntegrationTest extends IntegrationTestBase { + private Configuration config; + private ServiceBusService service; + + @Before + public void createService() throws Exception { + config = createConfiguration(); + service = config.create(ServiceBusService.class); + } @Test public void fetchQueueAndListQueuesWorks() throws Exception { // Arrange - Configuration config = createConfiguration(); - ServiceBusContract contract = config.create(ServiceBusContract.class); // Act - Entry entry = contract.getQueue("TestAlpha"); - Feed feed = contract.getQueues(); + Entry entry = service.getQueue("TestAlpha"); + Feed feed = service.getQueues(); // Assert assertNotNull(entry); assertNotNull(feed); } + @Test public void createQueueWorks() throws Exception { // Arrange - Configuration config = createConfiguration(); - ServiceBusContract contract = config.create(ServiceBusContract.class); // Act Entry entry = new Entry(); @@ -47,7 +58,7 @@ public void createQueueWorks() throws Exception { content.setQueueDescription(description); description.setMaxSizeInMegabytes(1024L); - Entry entry2 = contract.createQueue(entry); + Entry entry2 = service.createQueue(entry); // Assert } @@ -55,8 +66,6 @@ public void createQueueWorks() throws Exception { @Test public void deleteQueueWorks() throws Exception { // Arrange - Configuration config = createConfiguration(); - ServiceBusContract contract = config.create(ServiceBusContract.class); // Act Entry entry = new Entry(); @@ -67,9 +76,9 @@ public void deleteQueueWorks() throws Exception { entry.setContent(content); content.setType("application/xml"); content.setQueueDescription(description); - contract.createQueue(entry); + service.createQueue(entry); - contract.deleteQueue("TestDeleteQueueWorks"); + service.deleteQueue("TestDeleteQueueWorks"); // Assert } @@ -77,13 +86,11 @@ public void deleteQueueWorks() throws Exception { @Test public void sendMessageWorks() throws Exception { // Arrange - Configuration config = createConfiguration(); - ServiceBusContract contract = config.create(ServiceBusContract.class); BrokerProperties props = new BrokerProperties(); // Act - contract.sendMessage("TestAlpha", props, new ByteArrayInputStream("Hello World".getBytes())); + service.sendMessage("TestAlpha", props, new ByteArrayInputStream("Hello World".getBytes())); // Assert } @@ -91,14 +98,12 @@ public void sendMessageWorks() throws Exception { @Test public void receiveMessageWorks() throws Exception { // Arrange - Configuration config = createConfiguration(); - ServiceBusContract contract = config.create(ServiceBusContract.class); BrokerProperties props = new BrokerProperties(); - contract.sendMessage("TestAlpha", props, new ByteArrayInputStream("Hello World".getBytes())); + service.sendMessage("TestAlpha", props, new ByteArrayInputStream("Hello World".getBytes())); // Act - MessageResult message = contract.receiveMessage("TestAlpha", 500, ReceiveMode.RECEIVE_AND_DELETE); + MessageResult message = service.receiveMessage("TestAlpha", 500, ReceiveMode.RECEIVE_AND_DELETE); // Assert byte[] data = new byte[100]; @@ -110,14 +115,12 @@ public void receiveMessageWorks() throws Exception { @Test public void peekLockMessageWorks() throws Exception { // Arrange - Configuration config = createConfiguration(); - ServiceBusContract contract = config.create(ServiceBusContract.class); BrokerProperties props = new BrokerProperties(); // Act - contract.sendMessage("TestAlpha", props, new ByteArrayInputStream("Hello World".getBytes())); - MessageResult message = contract.receiveMessage("TestAlpha", 500, ReceiveMode.PEEK_LOCK); + service.sendMessage("TestAlpha", props, new ByteArrayInputStream("Hello World".getBytes())); + MessageResult message = service.receiveMessage("TestAlpha", 500, ReceiveMode.PEEK_LOCK); // Assert byte[] data = new byte[100]; diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractBuilderTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractBuilderTest.java deleted file mode 100644 index 22433eb557e4..000000000000 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/contract/ContractBuilderTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.microsoft.azure.services.serviceBus.contract; - - -import static org.junit.Assert.*; -import org.junit.Test; - -import com.microsoft.azure.configuration.Configuration; - -public class ContractBuilderTest { - @Test - public void testDefaultBuilderCreatesContractImpl() throws Exception { - Configuration config = new Configuration(); - ServiceBusContract contract = config.create(ServiceBusContract.class); - - assertNotNull(contract); - } -} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ClientBuilderTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/ClientBuilderTest.java similarity index 71% rename from microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ClientBuilderTest.java rename to microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/ClientBuilderTest.java index b9e66c0070f2..98180f1297c2 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ClientBuilderTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/ClientBuilderTest.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.messaging; import java.net.HttpURLConnection; import java.net.URL; @@ -7,7 +7,8 @@ import static org.junit.Assert.*; import com.microsoft.azure.configuration.Configuration; -import com.microsoft.azure.services.serviceBus.contract.ServiceBusContractImpl; +import com.microsoft.azure.services.serviceBus.ServiceBusServiceImpl; +import com.microsoft.azure.services.serviceBus.messaging.ServiceBusClient; public class ClientBuilderTest { @@ -23,11 +24,11 @@ public void testServiceBusClientCreatedWithContractImpl() throws Exception { // Assert assertNotNull(client); assertNotNull(client.getContract()); - assertEquals(ServiceBusContractImpl.class, client.getContract().getClass()); + assertEquals(ServiceBusServiceImpl.class, client.getContract().getClass()); assertNotNull(client2); assertNotNull(client2.getContract()); - assertEquals(ServiceBusContractImpl.class, client2.getContract().getClass()); + assertEquals(ServiceBusServiceImpl.class, client2.getContract().getClass()); } @Test diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/IntegrationTestBase.java similarity index 87% rename from microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java rename to microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/IntegrationTestBase.java index 9a4ec649ad86..67db9a15d6a9 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/IntegrationTestBase.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.messaging; import java.io.Console; @@ -6,6 +6,9 @@ import org.junit.BeforeClass; import com.microsoft.azure.configuration.Configuration; +import com.microsoft.azure.services.serviceBus.messaging.Queue; +import com.microsoft.azure.services.serviceBus.messaging.ReceiveMessageOptions; +import com.microsoft.azure.services.serviceBus.messaging.ServiceBusClient; public abstract class IntegrationTestBase { protected Configuration createConfiguration() { diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementIntegrationTest.java similarity index 85% rename from microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java rename to microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementIntegrationTest.java index 9b5bb9830797..40d8434834ab 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementIntegrationTest.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.messaging; import static org.junit.Assert.*; @@ -6,8 +6,9 @@ import org.junit.Test; -import com.microsoft.azure.services.serviceBus.Queue; -import com.microsoft.azure.services.serviceBus.ServiceBusClient; +import com.microsoft.azure.services.serviceBus.messaging.Message; +import com.microsoft.azure.services.serviceBus.messaging.Queue; +import com.microsoft.azure.services.serviceBus.messaging.ServiceBusClient; public class QueueManagementIntegrationTest extends IntegrationTestBase { diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementTest.java similarity index 80% rename from microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java rename to microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementTest.java index ed0ede5d2374..da828e5eb098 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/QueueManagementTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementTest.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.messaging; import static org.junit.Assert.*; import static org.mockito.Mockito.*; @@ -12,15 +12,17 @@ import org.w3._2005.atom.Entry; import com.microsoft.azure.ServiceException; +import com.microsoft.azure.services.serviceBus.ServiceBusService; import com.microsoft.azure.services.serviceBus.contract.QueueDescription; -import com.microsoft.azure.services.serviceBus.contract.ServiceBusContract; +import com.microsoft.azure.services.serviceBus.messaging.Queue; +import com.microsoft.azure.services.serviceBus.messaging.ServiceBusClient; public class QueueManagementTest { @Test public void testGetQueueAcquiresDescriptionFromServer() throws ServiceException { // Arrange - ServiceBusContract contract = mock(ServiceBusContract.class); + ServiceBusService contract = mock(ServiceBusService.class); Entry entry = new Entry(); when(contract.getQueue("Hello")).thenReturn(entry); @@ -41,7 +43,7 @@ public void testGetQueueAcquiresDescriptionFromServer() throws ServiceException @Test public void queueCreateSendsCreateQueueDescriptionMessage() throws DatatypeConfigurationException, ServiceException { // Arrange - ServiceBusContract contract = mock(ServiceBusContract.class); + ServiceBusService contract = mock(ServiceBusService.class); // Act ServiceBusClient client = new ServiceBusClient(contract); From 1c6b25f066e1a7b49cb795144ca2071ce75ec5a9 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 2 Nov 2011 11:18:38 -0700 Subject: [PATCH 37/59] Moving generated artifacts for serviceBus xsd generated classes for serviceBus and related atom are now in package com.microsoft.azure.services.serviceBus.schema --- .../azure/services/serviceBus/ServiceBusService.java | 4 ++-- .../azure/services/serviceBus/ServiceBusServiceImpl.java | 4 ++-- .../services/serviceBus/messaging/AbstractEntity.java | 6 +++--- .../azure/services/serviceBus/messaging/Queue.java | 6 +++--- .../services/serviceBus/messaging/ServiceBusClient.java | 2 +- microsoft-azure-api/src/main/resources/package-names.xjb | 7 ++++++- .../services/serviceBus/ContractIntegrationTest.java | 8 ++++---- .../serviceBus/messaging/QueueManagementTest.java | 6 +++--- 8 files changed, 24 insertions(+), 19 deletions(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java index a1c2cfb050f0..084575f72276 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java @@ -2,8 +2,8 @@ import java.io.InputStream; -import org.w3._2005.atom.Entry; -import org.w3._2005.atom.Feed; +import com.microsoft.azure.services.serviceBus.schema.Entry; +import com.microsoft.azure.services.serviceBus.schema.Feed; import com.microsoft.azure.ServiceException; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java index 236ca715bdc5..6738b2de4b0f 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java @@ -8,8 +8,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.w3._2005.atom.Entry; -import org.w3._2005.atom.Feed; +import com.microsoft.azure.services.serviceBus.schema.Entry; +import com.microsoft.azure.services.serviceBus.schema.Feed; import com.microsoft.azure.ServiceException; import com.microsoft.azure.auth.wrap.WrapFilter; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/AbstractEntity.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/AbstractEntity.java index c977f455bf9e..b7f3957767be 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/AbstractEntity.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/AbstractEntity.java @@ -2,8 +2,8 @@ import javax.ws.rs.core.MediaType; -import org.w3._2005.atom.Content; -import org.w3._2005.atom.Entry; +import com.microsoft.azure.services.serviceBus.schema.Content; +import com.microsoft.azure.services.serviceBus.schema.Entry; import com.microsoft.azure.services.serviceBus.ServiceBusService; @@ -14,7 +14,7 @@ abstract class AbstractEntity { AbstractEntity(ServiceBusClient client) { this.client = client; - setEntry(new org.w3._2005.atom.Entry()); + setEntry(new Entry()); getEntry().setContent(new Content()); getEntry().getContent().setType(MediaType.APPLICATION_XML); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Queue.java index 5035f9b8c08b..3a30b9806b4a 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Queue.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Queue.java @@ -1,13 +1,13 @@ package com.microsoft.azure.services.serviceBus.messaging; import javax.xml.datatype.Duration; -import org.w3._2005.atom.Content; -import org.w3._2005.atom.Entry; +import com.microsoft.azure.services.serviceBus.schema.Content; +import com.microsoft.azure.services.serviceBus.schema.Entry; import com.microsoft.azure.ServiceException; import com.microsoft.azure.services.serviceBus.MessageResult; import com.microsoft.azure.services.serviceBus.ReceiveMode; -import com.microsoft.azure.services.serviceBus.contract.QueueDescription; +import com.microsoft.azure.services.serviceBus.schema.QueueDescription; public class Queue extends AbstractEntity implements MessageSender, MessageReceiver, MessageTransceiver { Queue(ServiceBusClient client, String name) { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ServiceBusClient.java index 69c7382e6f99..2a15716b75fd 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ServiceBusClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ServiceBusClient.java @@ -5,7 +5,7 @@ import javax.inject.Inject; -import org.w3._2005.atom.Feed; +import com.microsoft.azure.services.serviceBus.schema.Feed; import com.microsoft.azure.ServiceException; import com.microsoft.azure.configuration.Configuration; diff --git a/microsoft-azure-api/src/main/resources/package-names.xjb b/microsoft-azure-api/src/main/resources/package-names.xjb index 15083b0bf49a..06c4a48b9db2 100644 --- a/microsoft-azure-api/src/main/resources/package-names.xjb +++ b/microsoft-azure-api/src/main/resources/package-names.xjb @@ -6,7 +6,12 @@ jaxb:extensionBindingPrefixes="xjc"> - + + + + + + diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractIntegrationTest.java index 18ad2f69daa4..4b5c4044699f 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractIntegrationTest.java @@ -4,16 +4,16 @@ import org.junit.Before; import org.junit.Test; -import org.w3._2005.atom.Content; -import org.w3._2005.atom.Entry; -import org.w3._2005.atom.Feed; +import com.microsoft.azure.services.serviceBus.schema.Content; +import com.microsoft.azure.services.serviceBus.schema.Entry; +import com.microsoft.azure.services.serviceBus.schema.Feed; import com.microsoft.azure.configuration.Configuration; import com.microsoft.azure.services.serviceBus.BrokerProperties; import com.microsoft.azure.services.serviceBus.MessageResult; import com.microsoft.azure.services.serviceBus.ReceiveMode; import com.microsoft.azure.services.serviceBus.ServiceBusService; -import com.microsoft.azure.services.serviceBus.contract.QueueDescription; +import com.microsoft.azure.services.serviceBus.schema.QueueDescription; import com.microsoft.azure.services.serviceBus.messaging.IntegrationTestBase; import static org.junit.Assert.*; diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementTest.java index da828e5eb098..79d30815fa4c 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementTest.java @@ -8,12 +8,12 @@ import org.junit.Test; import org.mockito.ArgumentCaptor; -import org.w3._2005.atom.Content; -import org.w3._2005.atom.Entry; +import com.microsoft.azure.services.serviceBus.schema.Content; +import com.microsoft.azure.services.serviceBus.schema.Entry; import com.microsoft.azure.ServiceException; import com.microsoft.azure.services.serviceBus.ServiceBusService; -import com.microsoft.azure.services.serviceBus.contract.QueueDescription; +import com.microsoft.azure.services.serviceBus.schema.QueueDescription; import com.microsoft.azure.services.serviceBus.messaging.Queue; import com.microsoft.azure.services.serviceBus.messaging.ServiceBusClient; From 7dbde1d6ee58e5434d7700ea87e31ac3ec87cfdb Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 2 Nov 2011 12:15:29 -0700 Subject: [PATCH 38/59] Reshaping service interface to use strongly-typed data model --- .../azure/services/serviceBus/EntryModel.java | 29 +++ .../azure/services/serviceBus/Queue.java | 108 ++++++++++ .../azure/services/serviceBus/QueueList.java | 8 + .../serviceBus/ServiceBusService.java | 7 +- .../serviceBus/ServiceBusServiceImpl.java | 48 +++-- .../services/serviceBus/messaging/Queue.java | 109 ++++++---- .../messaging/ServiceBusClient.java | 24 +-- .../serviceBus/ContractIntegrationTest.java | 22 +- .../messaging/IntegrationTestBase.java | 21 +- .../QueueManagementIntegrationTest.java | 200 +++++++++--------- .../messaging/QueueManagementTest.java | 130 ++++++------ 11 files changed, 449 insertions(+), 257 deletions(-) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/EntryModel.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/QueueList.java diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/EntryModel.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/EntryModel.java new file mode 100644 index 000000000000..f6592682dc20 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/EntryModel.java @@ -0,0 +1,29 @@ +package com.microsoft.azure.services.serviceBus; + +import com.microsoft.azure.services.serviceBus.schema.Entry; + +public class EntryModel { + Entry entry; + T model; + + public EntryModel(Entry entry, T model) { + this.entry = entry; + this.model = model; + } + + public Entry getEntry() { + return entry; + } + + public void setEntry(Entry entry) { + this.entry = entry; + } + + public T getModel() { + return model; + } + + public void setModel(T model) { + this.model = model; + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java new file mode 100644 index 000000000000..7ae9549758d3 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java @@ -0,0 +1,108 @@ +package com.microsoft.azure.services.serviceBus; + + +import javax.ws.rs.core.MediaType; +import javax.xml.datatype.Duration; + +import com.microsoft.azure.services.serviceBus.schema.Content; +import com.microsoft.azure.services.serviceBus.schema.Entry; + +import com.microsoft.azure.services.serviceBus.schema.QueueDescription; + +public class Queue extends EntryModel { + + public Queue() { + super(new Entry(), new QueueDescription()); + entry.setContent(new Content()); + entry.getContent().setType(MediaType.APPLICATION_XML); + } + + public Queue(Entry entry) { + super(entry, entry.getContent().getQueueDescription()); + } + + public Queue(Entry entry, QueueDescription model) { + super(entry, model); + } + + public String getTitle() { + return entry.getTitle(); + } + + public Queue setTitle(String value) { + entry.setTitle(value); + return this; + } + + public Duration getLockDuration() { + return model.getLockDuration(); + } + + public void setLockDuration(Duration value) { + model.setLockDuration(value); + } + + public Long getMaxSizeInMegabytes() { + return model.getMaxSizeInMegabytes(); + } + + public void setMaxSizeInMegabytes(Long value) { + model.setMaxSizeInMegabytes(value); + } + + public void setRequiresDuplicateDetection(Boolean value) { + model.setRequiresDuplicateDetection(value); + } + + public void setRequiresSession(Boolean value) { + model.setRequiresSession(value); + } + + public Duration getDefaultMessageTimeToLive() { + return model.getDefaultMessageTimeToLive(); + } + + public void setDefaultMessageTimeToLive(Duration value) { + model.setDefaultMessageTimeToLive(value); + } + + public void setDeadLetteringOnMessageExpiration(Boolean value) { + model.setDeadLetteringOnMessageExpiration(value); + } + + public Duration getDuplicateDetectionHistoryTimeWindow() { + return model.getDuplicateDetectionHistoryTimeWindow(); + } + + public void setDuplicateDetectionHistoryTimeWindow(Duration value) { + model.setDuplicateDetectionHistoryTimeWindow(value); + } + + public Integer getMaxDeliveryCount() { + return model.getMaxDeliveryCount(); + } + + public void setMaxDeliveryCount(Integer value) { + model.setMaxDeliveryCount(value); + } + + public void setEnableBatchedOperations(Boolean value) { + model.setEnableBatchedOperations(value); + } + + public Long getSizeInBytes() { + return model.getSizeInBytes(); + } + + public void setSizeInBytes(Long value) { + model.setSizeInBytes(value); + } + + public Long getMessageCount() { + return model.getMessageCount(); + } + + public void setMessageCount(Long value) { + model.setMessageCount(value); + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/QueueList.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/QueueList.java new file mode 100644 index 000000000000..5afd4d14ceae --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/QueueList.java @@ -0,0 +1,8 @@ +package com.microsoft.azure.services.serviceBus; + +import java.util.Iterator; + +public class QueueList { + + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java index 084575f72276..2840cef9bdce 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java @@ -15,10 +15,11 @@ public interface ServiceBusService { //void abandonMessage(BrokeredMessage message) throws ServiceException; //void completeMessage(BrokeredMessage message) throws ServiceException; - Entry createQueue(Entry queue) throws ServiceException; + Queue createQueue(Queue queue) throws ServiceException; void deleteQueue(String queuePath) throws ServiceException; - Entry getQueue(String queuePath) throws ServiceException; - Feed getQueues() throws ServiceException; + Queue getQueue(String queuePath) throws ServiceException; + QueueList getQueueList() throws ServiceException; + Iterable iterateQueues() throws ServiceException; Entry createTopic(Entry topic) throws ServiceException; void deleteTopic(String topicPath) throws ServiceException; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java index 6738b2de4b0f..33f8dd41de5f 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java @@ -122,12 +122,12 @@ else if (receiveMode == ReceiveMode.PEEK_LOCK) { } - public Entry createQueue(Entry entry) throws ServiceException { + public Queue createQueue(Queue entry) throws ServiceException { try { return getResource() .path(entry.getTitle()) .type("application/atom+xml")//;type=entry;charset=utf-8") - .put(Entry.class, entry); + .put(Queue.class, entry); } catch(UniformInterfaceException e) { throw processCatch(new ServiceException(e)); @@ -151,11 +151,11 @@ public void deleteQueue(String queuePath) throws ServiceException { } } - public Entry getQueue(String queuePath) throws ServiceException { + public Queue getQueue(String queuePath) throws ServiceException { try { return getResource() .path(queuePath) - .get(Entry.class); + .get(Queue.class); } catch(UniformInterfaceException e) { throw processCatch(new ServiceException(e)); @@ -165,20 +165,34 @@ public Entry getQueue(String queuePath) throws ServiceException { } } - public Feed getQueues() throws ServiceException { - try { - return getResource() - .path("$Resources/Queues") - .get(Feed.class); - } - catch(UniformInterfaceException e) { - throw processCatch(new ServiceException(e)); - } - catch(ClientHandlerException e) { - throw processCatch(new ServiceException(e)); - } + public Iterable iterateQueues() throws ServiceException { + return null; +// try { +// return getResource() +// .path("$Resources/Queues") +// .get(Feed.class); +// } +// catch(UniformInterfaceException e) { +// throw processCatch(new ServiceException(e)); +// } +// catch(ClientHandlerException e) { +// throw processCatch(new ServiceException(e)); +// } + } + public QueueList getQueueList() throws ServiceException { + return null; +// try { +// return getResource() +// .path("$Resources/Queues") +// .get(Feed.class); +// } +// catch(UniformInterfaceException e) { +// throw processCatch(new ServiceException(e)); +// } +// catch(ClientHandlerException e) { +// throw processCatch(new ServiceException(e)); +// } } - public Entry createTopic(Entry entry) throws ServiceException { try { return getResource() diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Queue.java index 3a30b9806b4a..6140d60f622f 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Queue.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Queue.java @@ -32,44 +32,44 @@ QueueDescription getQueueDescription(){ // API methods - - public void save() throws ServiceException { - setEntry(getContract().createQueue(getEntry())); - } - - public void delete() throws ServiceException { - getContract().deleteQueue(getName()); - } - - public void fetch() throws ServiceException { - setEntry(getContract().getQueue(getName())); - } - - public void sendMessage(Message message) throws ServiceException { - sendMessage(message, SendMessageOptions.DEFAULT); - } - - public void sendMessage(Message message, SendMessageOptions options) throws ServiceException { - getContract().sendMessage(getName(), message.getProperties(), message.getBody()); - } - - public Message receiveMessage() throws ServiceException { - return receiveMessage(ReceiveMessageOptions.DEFAULT); - } - - public Message receiveMessage(ReceiveMessageOptions options) throws ServiceException { - MessageResult result = getContract().receiveMessage(getName(), options.getTimeout(), ReceiveMode.RECEIVE_AND_DELETE); - return new Message(result.getBrokerProperties(), result.getBody()); - } - - public Message peekLockMessage() throws ServiceException { - return peekLockMessage(ReceiveMessageOptions.DEFAULT); - } - - public Message peekLockMessage(ReceiveMessageOptions options) throws ServiceException { - MessageResult result = getContract().receiveMessage(getName(), options.getTimeout(), ReceiveMode.PEEK_LOCK); - return new Message(result.getBrokerProperties(), result.getBody()); - } +// +// public void save() throws ServiceException { +// setEntry(getContract().createQueue(getEntry())); +// } +// +// public void delete() throws ServiceException { +// getContract().deleteQueue(getName()); +// } +// +// public void fetch() throws ServiceException { +// setEntry(getContract().getQueue(getName())); +// } +// +// public void sendMessage(Message message) throws ServiceException { +// sendMessage(message, SendMessageOptions.DEFAULT); +// } +// +// public void sendMessage(Message message, SendMessageOptions options) throws ServiceException { +// getContract().sendMessage(getName(), message.getProperties(), message.getBody()); +// } +// +// public Message receiveMessage() throws ServiceException { +// return receiveMessage(ReceiveMessageOptions.DEFAULT); +// } +// +// public Message receiveMessage(ReceiveMessageOptions options) throws ServiceException { +// MessageResult result = getContract().receiveMessage(getName(), options.getTimeout(), ReceiveMode.RECEIVE_AND_DELETE); +// return new Message(result.getBrokerProperties(), result.getBody()); +// } +// +// public Message peekLockMessage() throws ServiceException { +// return peekLockMessage(ReceiveMessageOptions.DEFAULT); +// } +// +// public Message peekLockMessage(ReceiveMessageOptions options) throws ServiceException { +// MessageResult result = getContract().receiveMessage(getName(), options.getTimeout(), ReceiveMode.PEEK_LOCK); +// return new Message(result.getBrokerProperties(), result.getBody()); +// } public void abandonMessage(Message message) { // TODO Auto-generated method stub @@ -112,4 +112,37 @@ public Long getMessageCount() { return getQueueDescription().getMessageCount(); } + public Message receiveMessage() throws ServiceException { + // TODO Auto-generated method stub + return null; + } + + public Message receiveMessage(ReceiveMessageOptions options) + throws ServiceException { + // TODO Auto-generated method stub + return null; + } + + public Message peekLockMessage() throws ServiceException { + // TODO Auto-generated method stub + return null; + } + + public Message peekLockMessage(ReceiveMessageOptions options) + throws ServiceException { + // TODO Auto-generated method stub + return null; + } + + public void sendMessage(Message message) throws ServiceException { + // TODO Auto-generated method stub + + } + + public void sendMessage(Message message, SendMessageOptions options) + throws ServiceException { + // TODO Auto-generated method stub + + } + } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ServiceBusClient.java index 2a15716b75fd..bc8d7f1e7b66 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ServiceBusClient.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ServiceBusClient.java @@ -44,19 +44,19 @@ public void setContract(ServiceBusService contract) { this.contract = contract; } - public Iterable listQueues() throws ServiceException { - return listQueues(ListQueuesOptions.DEFAULT); - } +// public Iterable listQueues() throws ServiceException { +// return listQueues(ListQueuesOptions.DEFAULT); +// } - // REVIEW: what is the generalized strategy for paginated, client-roundtrippable iteration - public Iterable listQueues(ListQueuesOptions options) throws ServiceException { - Feed descriptions = contract.getQueues(); - ArrayList queues = new ArrayList(); - for (int i = 0; i != descriptions.getEntries().size(); ++i) { - queues.add(new Queue(this, descriptions.getEntries().get(i))); - } - return queues; - } +// // REVIEW: what is the generalized strategy for paginated, client-roundtrippable iteration +// public Iterable listQueues(ListQueuesOptions options) throws ServiceException { +// Feed descriptions = contract.getQueueList()(); +// ArrayList queues = new ArrayList(); +// for (int i = 0; i != descriptions.getEntries().size(); ++i) { +// queues.add(new Queue(this, descriptions.getEntries().get(i))); +// } +// return queues; +// } public Queue getQueue(String path) { return new Queue(this, path); diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractIntegrationTest.java index 4b5c4044699f..c7bc6b649e9a 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractIntegrationTest.java @@ -34,8 +34,8 @@ public void fetchQueueAndListQueuesWorks() throws Exception { // Arrange // Act - Entry entry = service.getQueue("TestAlpha"); - Feed feed = service.getQueues(); + Queue entry = service.getQueue("TestAlpha"); + QueueList feed = service.getQueueList(); // Assert assertNotNull(entry); @@ -48,19 +48,17 @@ public void createQueueWorks() throws Exception { // Arrange // Act - Entry entry = new Entry(); - Content content = new Content(); - QueueDescription description = new QueueDescription(); + Queue queue = new Queue(); - entry.setTitle("TestCreateQueueWorks"); - entry.setContent(content); - content.setType("application/xml"); - content.setQueueDescription(description); - description.setMaxSizeInMegabytes(1024L); + queue.setTitle("TestCreateQueueWorks"); + queue.setMaxSizeInMegabytes(1024L); - Entry entry2 = service.createQueue(entry); + Queue saved = service.createQueue(queue); // Assert + assertNotNull(saved); + assertNotSame(queue, saved); + assertEquals("TestCreateQueueWorks", saved.getTitle()); } @Test @@ -76,7 +74,7 @@ public void deleteQueueWorks() throws Exception { entry.setContent(content); content.setType("application/xml"); content.setQueueDescription(description); - service.createQueue(entry); +// service.createQueue(entry); service.deleteQueue("TestDeleteQueueWorks"); diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/IntegrationTestBase.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/IntegrationTestBase.java index 67db9a15d6a9..b9e089afda7c 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/IntegrationTestBase.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/IntegrationTestBase.java @@ -6,7 +6,8 @@ import org.junit.BeforeClass; import com.microsoft.azure.configuration.Configuration; -import com.microsoft.azure.services.serviceBus.messaging.Queue; +import com.microsoft.azure.services.serviceBus.ServiceBusService; +import com.microsoft.azure.services.serviceBus.Queue; import com.microsoft.azure.services.serviceBus.messaging.ReceiveMessageOptions; import com.microsoft.azure.services.serviceBus.messaging.ServiceBusClient; @@ -42,22 +43,22 @@ public void initialize() throws Exception { //System.setProperty("http.keepAlive", "false"); boolean testAlphaExists = false; - ServiceBusClient client = createConfiguration().create(ServiceBusClient.class); - for(Queue queue : client.listQueues()){ - if (queue.getName().startsWith("Test") || queue.getName().startsWith("test")) { - if (queue.getName().equalsIgnoreCase("TestAlpha")) { + ServiceBusService service = createConfiguration().create(ServiceBusService.class); + for(Queue queue : service.iterateQueues()) { + if (queue.getTitle().startsWith("Test") || queue.getTitle().startsWith("test")) { + if (queue.getTitle().equalsIgnoreCase("TestAlpha")) { testAlphaExists = true; long count = queue.getMessageCount(); - for(long i = 0; i != count; ++i) { - queue.receiveMessage(new ReceiveMessageOptions().setTimeout(2000)); - } +// for(long i = 0; i != count; ++i) { +// queue.receiveMessage(new ReceiveMessageOptions().setTimeout(2000)); +// } } else { - queue.delete(); +// queue.delete(); } } } if (!testAlphaExists) { - client.getQueue("TestAlpha").save(); + service.createQueue(new Queue().setTitle("TestAlpha")); } } } diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementIntegrationTest.java index 40d8434834ab..bf3c4f8ca122 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementIntegrationTest.java @@ -1,100 +1,100 @@ -package com.microsoft.azure.services.serviceBus.messaging; - -import static org.junit.Assert.*; - -import java.io.ByteArrayInputStream; - -import org.junit.Test; - -import com.microsoft.azure.services.serviceBus.messaging.Message; -import com.microsoft.azure.services.serviceBus.messaging.Queue; -import com.microsoft.azure.services.serviceBus.messaging.ServiceBusClient; - - -public class QueueManagementIntegrationTest extends IntegrationTestBase { - - private ServiceBusClient createClient() throws Exception { - return new ServiceBusClient(createConfiguration()); - } - - @Test - public void queueCanBeCreatedAndDeleted() throws Exception { - // Arrange - ServiceBusClient client = createClient(); - - // Act - Queue queue = client.getQueue("TestQueueCanBeCreatedAndDeleted"); - queue.save(); - queue.delete(); - - // Assert - } - - @Test - public void whenQueueIsCreatedEntityStateIsAlsoUpdated() throws Exception { - // Arrange - ServiceBusClient client = createClient(); - - // Act - Queue queue = client.getQueue("TestWhenQueueIsCreatedEntityStateIsAlsoUpdated"); - Long maxSizeBefore = queue.getMaxSizeInMegabytes(); - queue.save(); - Long maxSizeAfter = queue.getMaxSizeInMegabytes(); - queue.delete(); - - // Assert - assertNull(maxSizeBefore); - assertNotNull(maxSizeAfter); - } - - - @Test - public void existingQueuePathDoesNotReturnNull() throws Exception { - // Arrange - ServiceBusClient client = createClient(); - - // Act - Queue queue = client.getQueue("TestAlpha"); - queue.fetch(); - - // Assert - assertNotNull(queue); - assertEquals("TestAlpha", queue.getName()); - } - - @Test - public void createQueueAndSendAndReceiveMessage() throws Exception { - // Arrange - ServiceBusClient client = createClient(); - - // Act - Queue queue = client.getQueue("TestCreateQueueAndSendAndReceiveMessage"); - queue.save(); - - queue.sendMessage(new Message("Hello World")); - Message received = queue.receiveMessage(); - - // Assert - assertNotNull(received); - assertEquals(1, (int)received.getDeliveryCount()); - } - - - @Test - public void peekLockedMessageHasLockTokenAndLockedUntilUtc() throws Exception { - // Arrange - ServiceBusClient client = createClient(); - - // Act - Queue queue = client.getQueue("TestCreateQueueAndSendAndReceiveMessage"); - queue.save(); - - queue.sendMessage(new Message("Hello World")); - Message received = queue.peekLockMessage(); - - // Assert - assertNotNull(received); - assertNotNull(received.getLockToken()); - assertNotNull(received.getLockedUntilUtc()); - } -} +//package com.microsoft.azure.services.serviceBus.messaging; +// +//import static org.junit.Assert.*; +// +//import java.io.ByteArrayInputStream; +// +//import org.junit.Test; +// +//import com.microsoft.azure.services.serviceBus.messaging.Message; +//import com.microsoft.azure.services.serviceBus.messaging.Queue; +//import com.microsoft.azure.services.serviceBus.messaging.ServiceBusClient; +// +// +//public class QueueManagementIntegrationTest extends IntegrationTestBase { +// +// private ServiceBusClient createClient() throws Exception { +// return new ServiceBusClient(createConfiguration()); +// } +// +// @Test +// public void queueCanBeCreatedAndDeleted() throws Exception { +// // Arrange +// ServiceBusClient client = createClient(); +// +// // Act +// Queue queue = client.getQueue("TestQueueCanBeCreatedAndDeleted"); +// queue.save(); +// queue.delete(); +// +// // Assert +// } +// +// @Test +// public void whenQueueIsCreatedEntityStateIsAlsoUpdated() throws Exception { +// // Arrange +// ServiceBusClient client = createClient(); +// +// // Act +// Queue queue = client.getQueue("TestWhenQueueIsCreatedEntityStateIsAlsoUpdated"); +// Long maxSizeBefore = queue.getMaxSizeInMegabytes(); +// queue.save(); +// Long maxSizeAfter = queue.getMaxSizeInMegabytes(); +// queue.delete(); +// +// // Assert +// assertNull(maxSizeBefore); +// assertNotNull(maxSizeAfter); +// } +// +// +// @Test +// public void existingQueuePathDoesNotReturnNull() throws Exception { +// // Arrange +// ServiceBusClient client = createClient(); +// +// // Act +// Queue queue = client.getQueue("TestAlpha"); +// queue.fetch(); +// +// // Assert +// assertNotNull(queue); +// assertEquals("TestAlpha", queue.getName()); +// } +// +// @Test +// public void createQueueAndSendAndReceiveMessage() throws Exception { +// // Arrange +// ServiceBusClient client = createClient(); +// +// // Act +// Queue queue = client.getQueue("TestCreateQueueAndSendAndReceiveMessage"); +// queue.save(); +// +// queue.sendMessage(new Message("Hello World")); +// Message received = queue.receiveMessage(); +// +// // Assert +// assertNotNull(received); +// assertEquals(1, (int)received.getDeliveryCount()); +// } +// +// +// @Test +// public void peekLockedMessageHasLockTokenAndLockedUntilUtc() throws Exception { +// // Arrange +// ServiceBusClient client = createClient(); +// +// // Act +// Queue queue = client.getQueue("TestCreateQueueAndSendAndReceiveMessage"); +// queue.save(); +// +// queue.sendMessage(new Message("Hello World")); +// Message received = queue.peekLockMessage(); +// +// // Assert +// assertNotNull(received); +// assertNotNull(received.getLockToken()); +// assertNotNull(received.getLockedUntilUtc()); +// } +//} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementTest.java index 79d30815fa4c..cdae4631daae 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementTest.java @@ -1,65 +1,65 @@ -package com.microsoft.azure.services.serviceBus.messaging; - -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; - -import javax.xml.datatype.DatatypeConfigurationException; -import javax.xml.datatype.DatatypeFactory; - -import org.junit.Test; -import org.mockito.ArgumentCaptor; -import com.microsoft.azure.services.serviceBus.schema.Content; -import com.microsoft.azure.services.serviceBus.schema.Entry; - -import com.microsoft.azure.ServiceException; -import com.microsoft.azure.services.serviceBus.ServiceBusService; -import com.microsoft.azure.services.serviceBus.schema.QueueDescription; -import com.microsoft.azure.services.serviceBus.messaging.Queue; -import com.microsoft.azure.services.serviceBus.messaging.ServiceBusClient; - - -public class QueueManagementTest { - @Test - public void testGetQueueAcquiresDescriptionFromServer() throws ServiceException { - // Arrange - ServiceBusService contract = mock(ServiceBusService.class); - - Entry entry = new Entry(); - when(contract.getQueue("Hello")).thenReturn(entry); - - entry.setContent(new Content()); - //entry.getContent().setQueueDescription(new QueueDescription()); - //entry.getContent().getQueueDescription().setMessageCount(73L); - - // Act - ServiceBusClient client = new ServiceBusClient(contract); - Queue helloQueue = client.getQueue("Hello"); - helloQueue.fetch(); - - // Assert - assertEquals(73, helloQueue.getMessageCount().longValue()); - } - - @Test - public void queueCreateSendsCreateQueueDescriptionMessage() throws DatatypeConfigurationException, ServiceException { - // Arrange - ServiceBusService contract = mock(ServiceBusService.class); - - // Act - ServiceBusClient client = new ServiceBusClient(contract); - Queue helloQueue = client.getQueue("MyNewQueue"); - helloQueue.setLockDuration(DatatypeFactory.newInstance().newDuration(60 * 1000L)); - helloQueue.setMaxSizeInMegabytes(42L); - helloQueue.save(); - - // Assert - ArgumentCaptor argument = ArgumentCaptor.forClass(Entry.class); - verify(contract).createQueue(argument.capture()); - Entry entry = argument.getValue(); - //QueueDescription model = entry.getContent().getQueueDescription(); - - assertEquals("MyNewQueue", entry.getTitle()); - //assertEquals(DatatypeFactory.newInstance().newDuration(60 * 1000L), model.getLockDuration()); - //assertEquals(42, model.getMaxSizeInMegabytes().longValue()); - } -} +//package com.microsoft.azure.services.serviceBus.messaging; +// +//import static org.junit.Assert.*; +//import static org.mockito.Mockito.*; +// +//import javax.xml.datatype.DatatypeConfigurationException; +//import javax.xml.datatype.DatatypeFactory; +// +//import org.junit.Test; +//import org.mockito.ArgumentCaptor; +//import com.microsoft.azure.services.serviceBus.schema.Content; +//import com.microsoft.azure.services.serviceBus.schema.Entry; +// +//import com.microsoft.azure.ServiceException; +//import com.microsoft.azure.services.serviceBus.ServiceBusService; +//import com.microsoft.azure.services.serviceBus.schema.QueueDescription; +//import com.microsoft.azure.services.serviceBus.messaging.Queue; +//import com.microsoft.azure.services.serviceBus.messaging.ServiceBusClient; +// +// +//public class QueueManagementTest { +// @Test +// public void testGetQueueAcquiresDescriptionFromServer() throws ServiceException { +// // Arrange +// ServiceBusService contract = mock(ServiceBusService.class); +// +// Entry entry = new Entry(); +// when(contract.getQueue("Hello")).thenReturn(entry); +// +// entry.setContent(new Content()); +// //entry.getContent().setQueueDescription(new QueueDescription()); +// //entry.getContent().getQueueDescription().setMessageCount(73L); +// +// // Act +// ServiceBusClient client = new ServiceBusClient(contract); +// Queue helloQueue = client.getQueue("Hello"); +// helloQueue.fetch(); +// +// // Assert +// assertEquals(73, helloQueue.getMessageCount().longValue()); +// } +// +// @Test +// public void queueCreateSendsCreateQueueDescriptionMessage() throws DatatypeConfigurationException, ServiceException { +// // Arrange +// ServiceBusService contract = mock(ServiceBusService.class); +// +// // Act +// ServiceBusClient client = new ServiceBusClient(contract); +// Queue helloQueue = client.getQueue("MyNewQueue"); +// helloQueue.setLockDuration(DatatypeFactory.newInstance().newDuration(60 * 1000L)); +// helloQueue.setMaxSizeInMegabytes(42L); +// helloQueue.save(); +// +// // Assert +// ArgumentCaptor argument = ArgumentCaptor.forClass(Entry.class); +// verify(contract).createQueue(argument.capture()); +// Entry entry = argument.getValue(); +// //QueueDescription model = entry.getContent().getQueueDescription(); +// +// assertEquals("MyNewQueue", entry.getTitle()); +// //assertEquals(DatatypeFactory.newInstance().newDuration(60 * 1000L), model.getLockDuration()); +// //assertEquals(42, model.getMaxSizeInMegabytes().longValue()); +// } +//} From cb1f7460eb8f4f8676c0a2e3361e4513b1b369c1 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 2 Nov 2011 12:23:04 -0700 Subject: [PATCH 39/59] Updates to Queue data model Chainable setters Updating IntegrationTestBase to use service interface instead of client Changing Title property to Name - title is an Atom implementation detail --- .../azure/services/serviceBus/Queue.java | 37 ++++++++++++------- .../serviceBus/ServiceBusServiceImpl.java | 2 +- .../serviceBus/ContractIntegrationTest.java | 5 +-- .../{messaging => }/IntegrationTestBase.java | 17 +++++---- 4 files changed, 36 insertions(+), 25 deletions(-) rename microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/{messaging => }/IntegrationTestBase.java (81%) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java index 7ae9549758d3..c85dd31f575f 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java @@ -25,11 +25,11 @@ public Queue(Entry entry, QueueDescription model) { super(entry, model); } - public String getTitle() { + public String getName() { return entry.getTitle(); } - public Queue setTitle(String value) { + public Queue setName(String value) { entry.setTitle(value); return this; } @@ -38,71 +38,82 @@ public Duration getLockDuration() { return model.getLockDuration(); } - public void setLockDuration(Duration value) { + public Queue setLockDuration(Duration value) { model.setLockDuration(value); + return this; } public Long getMaxSizeInMegabytes() { return model.getMaxSizeInMegabytes(); } - public void setMaxSizeInMegabytes(Long value) { + public Queue setMaxSizeInMegabytes(Long value) { model.setMaxSizeInMegabytes(value); + return this; } - public void setRequiresDuplicateDetection(Boolean value) { + public Queue setRequiresDuplicateDetection(Boolean value) { model.setRequiresDuplicateDetection(value); + return this; } - public void setRequiresSession(Boolean value) { + public Queue setRequiresSession(Boolean value) { model.setRequiresSession(value); + return this; } public Duration getDefaultMessageTimeToLive() { return model.getDefaultMessageTimeToLive(); } - public void setDefaultMessageTimeToLive(Duration value) { + public Queue setDefaultMessageTimeToLive(Duration value) { model.setDefaultMessageTimeToLive(value); + return this; } - public void setDeadLetteringOnMessageExpiration(Boolean value) { + public Queue setDeadLetteringOnMessageExpiration(Boolean value) { model.setDeadLetteringOnMessageExpiration(value); + return this; } public Duration getDuplicateDetectionHistoryTimeWindow() { return model.getDuplicateDetectionHistoryTimeWindow(); } - public void setDuplicateDetectionHistoryTimeWindow(Duration value) { + public Queue setDuplicateDetectionHistoryTimeWindow(Duration value) { model.setDuplicateDetectionHistoryTimeWindow(value); + return this; } public Integer getMaxDeliveryCount() { return model.getMaxDeliveryCount(); } - public void setMaxDeliveryCount(Integer value) { + public Queue setMaxDeliveryCount(Integer value) { model.setMaxDeliveryCount(value); + return this; } - public void setEnableBatchedOperations(Boolean value) { + public Queue setEnableBatchedOperations(Boolean value) { model.setEnableBatchedOperations(value); + return this; } public Long getSizeInBytes() { return model.getSizeInBytes(); } - public void setSizeInBytes(Long value) { + public Queue setSizeInBytes(Long value) { model.setSizeInBytes(value); + return this; } public Long getMessageCount() { return model.getMessageCount(); } - public void setMessageCount(Long value) { + public Queue setMessageCount(Long value) { model.setMessageCount(value); + return this; } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java index 33f8dd41de5f..22395aa78a7f 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java @@ -125,7 +125,7 @@ else if (receiveMode == ReceiveMode.PEEK_LOCK) { public Queue createQueue(Queue entry) throws ServiceException { try { return getResource() - .path(entry.getTitle()) + .path(entry.getName()) .type("application/atom+xml")//;type=entry;charset=utf-8") .put(Queue.class, entry); } diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractIntegrationTest.java index c7bc6b649e9a..7164c59e8ded 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractIntegrationTest.java @@ -14,7 +14,6 @@ import com.microsoft.azure.services.serviceBus.ReceiveMode; import com.microsoft.azure.services.serviceBus.ServiceBusService; import com.microsoft.azure.services.serviceBus.schema.QueueDescription; -import com.microsoft.azure.services.serviceBus.messaging.IntegrationTestBase; import static org.junit.Assert.*; @@ -50,7 +49,7 @@ public void createQueueWorks() throws Exception { // Act Queue queue = new Queue(); - queue.setTitle("TestCreateQueueWorks"); + queue.setName("TestCreateQueueWorks"); queue.setMaxSizeInMegabytes(1024L); Queue saved = service.createQueue(queue); @@ -58,7 +57,7 @@ public void createQueueWorks() throws Exception { // Assert assertNotNull(saved); assertNotSame(queue, saved); - assertEquals("TestCreateQueueWorks", saved.getTitle()); + assertEquals("TestCreateQueueWorks", saved.getName()); } @Test diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/IntegrationTestBase.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java similarity index 81% rename from microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/IntegrationTestBase.java rename to microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java index b9e089afda7c..9b69cce8dc6c 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/IntegrationTestBase.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus.messaging; +package com.microsoft.azure.services.serviceBus; import java.io.Console; @@ -45,20 +45,21 @@ public void initialize() throws Exception { boolean testAlphaExists = false; ServiceBusService service = createConfiguration().create(ServiceBusService.class); for(Queue queue : service.iterateQueues()) { - if (queue.getTitle().startsWith("Test") || queue.getTitle().startsWith("test")) { - if (queue.getTitle().equalsIgnoreCase("TestAlpha")) { + String queueName = queue.getName(); + if (queueName.startsWith("Test") || queueName.startsWith("test")) { + if (queueName.equalsIgnoreCase("TestAlpha")) { testAlphaExists = true; long count = queue.getMessageCount(); -// for(long i = 0; i != count; ++i) { -// queue.receiveMessage(new ReceiveMessageOptions().setTimeout(2000)); -// } + for(long i = 0; i != count; ++i) { + service.receiveMessage(queueName, 2000, ReceiveMode.RECEIVE_AND_DELETE); + } } else { -// queue.delete(); + service.deleteQueue(queueName); } } } if (!testAlphaExists) { - service.createQueue(new Queue().setTitle("TestAlpha")); + service.createQueue(new Queue().setName("TestAlpha")); } } } From 0d0deab70dfd639ac4fe195427e9322db1e600b3 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 2 Nov 2011 13:13:58 -0700 Subject: [PATCH 40/59] Implementing body reader for Queue EntryModelProvider understands EntryModel types Actual serialization performed by body reader of underlying Entry schema type --- .../serviceBus/EntryModelProvider.java | 61 +++++++++++++++++++ .../azure/services/serviceBus/Exports.java | 3 + .../azure/services/serviceBus/Queue.java | 3 - .../azure/services/serviceBus/QueueList.java | 13 +++- .../serviceBus/ServiceBusServiceImpl.java | 46 +++++++------- ...st.java => ServiceBusIntegrationTest.java} | 2 +- 6 files changed, 99 insertions(+), 29 deletions(-) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/EntryModelProvider.java rename microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/{ContractIntegrationTest.java => ServiceBusIntegrationTest.java} (97%) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/EntryModelProvider.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/EntryModelProvider.java new file mode 100644 index 000000000000..0d8ab10ac354 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/EntryModelProvider.java @@ -0,0 +1,61 @@ +package com.microsoft.azure.services.serviceBus; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; + +import javax.ws.rs.WebApplicationException; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.ext.MessageBodyReader; +import com.microsoft.azure.services.serviceBus.schema.Entry; +import com.sun.jersey.core.provider.AbstractMessageReaderWriterProvider; +import com.sun.jersey.spi.MessageBodyWorkers; + +public class EntryModelProvider extends + AbstractMessageReaderWriterProvider> { + + MessageBodyWorkers workers; + + public EntryModelProvider(@Context MessageBodyWorkers workers) { + this.workers = workers; + } + + public boolean isReadable(Class type, Type genericType, + Annotation[] annotations, MediaType mediaType) { + return EntryModel.class.isAssignableFrom(type); + } + + public EntryModel readFrom(Class> type, Type genericType, + Annotation[] annotations, MediaType mediaType, + MultivaluedMap httpHeaders, InputStream entityStream) + throws IOException, WebApplicationException { + + MessageBodyReader reader = workers.getMessageBodyReader( + Entry.class, Entry.class, annotations, mediaType); + + Entry entry = reader.readFrom(Entry.class, Entry.class, annotations, + mediaType, httpHeaders, entityStream); + + return new Queue(entry); + } + + public boolean isWriteable(Class type, Type genericType, + Annotation[] annotations, MediaType mediaType) { + // TODO Auto-generated method stub + return false; + } + + public void writeTo(EntryModel t, Class type, Type genericType, + Annotation[] annotations, MediaType mediaType, + MultivaluedMap httpHeaders, + OutputStream entityStream) throws IOException, + WebApplicationException { + // TODO Auto-generated method stub + + } + +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java index 2119232293da..3adc0fcec2d9 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java @@ -24,6 +24,9 @@ public ClientConfig alter(ClientConfig instance, Builder builder, // need to avoid certain element prefixes, which the service does not ignore instance.getSingletons().add(new MarshallerProvider()); + // add body reader/writer for EntryModel descendant classes + instance.getClasses().add(EntryModelProvider.class); + return instance; } }); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java index c85dd31f575f..88e314edd05b 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java @@ -21,9 +21,6 @@ public Queue(Entry entry) { super(entry, entry.getContent().getQueueDescription()); } - public Queue(Entry entry, QueueDescription model) { - super(entry, model); - } public String getName() { return entry.getTitle(); diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/QueueList.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/QueueList.java index 5afd4d14ceae..746b98848e40 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/QueueList.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/QueueList.java @@ -1,8 +1,19 @@ package com.microsoft.azure.services.serviceBus; -import java.util.Iterator; +import java.util.List; public class QueueList { + + private List queues; + + List getQueues() { + return queues; + } + + void setQueues(List queues) { + this.queues = queues; + } + } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java index 22395aa78a7f..be8592929a50 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java @@ -2,6 +2,7 @@ import java.io.InputStream; import java.rmi.UnexpectedException; +import java.util.ArrayList; import javax.inject.Inject; import javax.inject.Named; @@ -166,32 +167,29 @@ public Queue getQueue(String queuePath) throws ServiceException { } public Iterable iterateQueues() throws ServiceException { - return null; -// try { -// return getResource() -// .path("$Resources/Queues") -// .get(Feed.class); -// } -// catch(UniformInterfaceException e) { -// throw processCatch(new ServiceException(e)); -// } -// catch(ClientHandlerException e) { -// throw processCatch(new ServiceException(e)); -// } + //TODO: iterate over link rel=next pagination + return getQueueList().getQueues(); } + public QueueList getQueueList() throws ServiceException { - return null; -// try { -// return getResource() -// .path("$Resources/Queues") -// .get(Feed.class); -// } -// catch(UniformInterfaceException e) { -// throw processCatch(new ServiceException(e)); -// } -// catch(ClientHandlerException e) { -// throw processCatch(new ServiceException(e)); -// } + try { + Feed feed = getResource() + .path("$Resources/Queues") + .get(Feed.class); + ArrayList queues = new ArrayList(); + for(Entry entry : feed.getEntries()){ + queues.add(new Queue(entry)); + } + QueueList result = new QueueList(); + result.setQueues(queues); + return result; + } + catch(UniformInterfaceException e) { + throw processCatch(new ServiceException(e)); + } + catch(ClientHandlerException e) { + throw processCatch(new ServiceException(e)); + } } public Entry createTopic(Entry entry) throws ServiceException { try { diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java similarity index 97% rename from microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractIntegrationTest.java rename to microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java index 7164c59e8ded..c8ed9709c9a6 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java @@ -17,7 +17,7 @@ import static org.junit.Assert.*; -public class ContractIntegrationTest extends IntegrationTestBase { +public class ServiceBusIntegrationTest extends IntegrationTestBase { private Configuration config; private ServiceBusService service; From b2bce284f8274b7103dba9790179024bc6c7b3ac Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 2 Nov 2011 13:25:39 -0700 Subject: [PATCH 41/59] Adding body writing to EntryModelProvider Also need to place queue descriptor in content element when Queue created by code --- .../services/serviceBus/EntryModelProvider.java | 12 +++++++++--- .../microsoft/azure/services/serviceBus/Queue.java | 1 + 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/EntryModelProvider.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/EntryModelProvider.java index 0d8ab10ac354..cfeee55a1dde 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/EntryModelProvider.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/EntryModelProvider.java @@ -11,6 +11,8 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.MessageBodyReader; +import javax.ws.rs.ext.MessageBodyWriter; + import com.microsoft.azure.services.serviceBus.schema.Entry; import com.sun.jersey.core.provider.AbstractMessageReaderWriterProvider; import com.sun.jersey.spi.MessageBodyWorkers; @@ -45,8 +47,7 @@ public EntryModel readFrom(Class> type, Type genericType, public boolean isWriteable(Class type, Type genericType, Annotation[] annotations, MediaType mediaType) { - // TODO Auto-generated method stub - return false; + return EntryModel.class.isAssignableFrom(type); } public void writeTo(EntryModel t, Class type, Type genericType, @@ -54,8 +55,13 @@ public void writeTo(EntryModel t, Class type, Type genericType, MultivaluedMap httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { - // TODO Auto-generated method stub + + Entry entry = t.getEntry(); + + MessageBodyWriter writer = workers.getMessageBodyWriter( + Entry.class, Entry.class, annotations, mediaType); + writer.writeTo(entry, Entry.class, genericType, annotations, mediaType, httpHeaders, entityStream); } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java index 88e314edd05b..9acea472b99b 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java @@ -15,6 +15,7 @@ public Queue() { super(new Entry(), new QueueDescription()); entry.setContent(new Content()); entry.getContent().setType(MediaType.APPLICATION_XML); + entry.getContent().setQueueDescription(getModel()); } public Queue(Entry entry) { From 6cf8b7d68dbf96d4f11f8dd8093a5251f339c58d Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 2 Nov 2011 13:27:55 -0700 Subject: [PATCH 42/59] Fixing delete queue unit test --- .../serviceBus/ServiceBusIntegrationTest.java | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java index c8ed9709c9a6..686fd02bfea7 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java @@ -63,18 +63,9 @@ public void createQueueWorks() throws Exception { @Test public void deleteQueueWorks() throws Exception { // Arrange + service.createQueue(new Queue().setName("TestDeleteQueueWorks")); // Act - Entry entry = new Entry(); - Content content = new Content(); - QueueDescription description = new QueueDescription(); - - entry.setTitle("TestDeleteQueueWorks"); - entry.setContent(content); - content.setType("application/xml"); - content.setQueueDescription(description); -// service.createQueue(entry); - service.deleteQueue("TestDeleteQueueWorks"); // Assert From f30b3187e23d8f2efae1e8cc7b31dbabaa2de7ec Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 2 Nov 2011 13:32:13 -0700 Subject: [PATCH 43/59] Remaining ServiceBusIntegrationTest operations work --- .../azure/services/serviceBus/IntegrationTestBase.java | 4 ++-- .../services/serviceBus/ServiceBusIntegrationTest.java | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java index 9b69cce8dc6c..2cb8e261b9ce 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java @@ -32,7 +32,7 @@ public static void initializeSystem() { System.out.println("initialize"); System.setProperty("http.proxyHost", "itgproxy"); System.setProperty("http.proxyPort", "80"); - //System.setProperty("http.keepAlive", "false"); + System.setProperty("http.keepAlive", "false"); } @Before @@ -40,7 +40,7 @@ public void initialize() throws Exception { System.out.println("initialize"); System.setProperty("http.proxyHost", "itgproxy"); System.setProperty("http.proxyPort", "80"); - //System.setProperty("http.keepAlive", "false"); + System.setProperty("http.keepAlive", "false"); boolean testAlphaExists = false; ServiceBusService service = createConfiguration().create(ServiceBusService.class); diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java index 686fd02bfea7..8531b96b2cd7 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java @@ -1,6 +1,7 @@ package com.microsoft.azure.services.serviceBus; import java.io.ByteArrayInputStream; +import java.util.Arrays; import org.junit.Before; import org.junit.Test; @@ -92,12 +93,12 @@ public void receiveMessageWorks() throws Exception { // Act MessageResult message = service.receiveMessage("TestAlpha", 500, ReceiveMode.RECEIVE_AND_DELETE); - - // Assert byte[] data = new byte[100]; int size = message.getBody().read(data); + + // Assert assertEquals(11, size); - assertArrayEquals("Hello World".getBytes(), data); + assertArrayEquals("Hello World".getBytes(), Arrays.copyOf(data, size)); } @Test From c04009a17b44a835275e2dea57eb86efc4bc98f5 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 2 Nov 2011 13:38:49 -0700 Subject: [PATCH 44/59] Cleaning up some unused classes --- .../serviceBus/messaging/AbstractEntity.java | 42 ----- .../serviceBus/messaging/Exports.java | 9 -- .../serviceBus/messaging/Message.java | 35 +++-- .../services/serviceBus/messaging/Queue.java | 148 ------------------ .../messaging/ServiceBusClient.java | 68 -------- .../serviceBus/IntegrationTestBase.java | 1 - .../messaging/ClientBuilderTest.java | 40 ----- 7 files changed, 18 insertions(+), 325 deletions(-) delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/AbstractEntity.java delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Exports.java delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Queue.java delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ServiceBusClient.java delete mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/ClientBuilderTest.java diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/AbstractEntity.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/AbstractEntity.java deleted file mode 100644 index b7f3957767be..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/AbstractEntity.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.microsoft.azure.services.serviceBus.messaging; - -import javax.ws.rs.core.MediaType; - -import com.microsoft.azure.services.serviceBus.schema.Content; -import com.microsoft.azure.services.serviceBus.schema.Entry; - -import com.microsoft.azure.services.serviceBus.ServiceBusService; - -abstract class AbstractEntity { - - ServiceBusClient client; - Entry entry; - - AbstractEntity(ServiceBusClient client) { - this.client = client; - setEntry(new Entry()); - getEntry().setContent(new Content()); - getEntry().getContent().setType(MediaType.APPLICATION_XML); - } - - AbstractEntity(ServiceBusClient client, Entry entry) { - this.client = client; - this.entry = entry; - } - - protected ServiceBusClient getClient() { - return client; - } - - protected ServiceBusService getContract() { - return getClient().getContract(); - } - - protected Entry getEntry() { - return entry; - } - - protected void setEntry(Entry entry) { - this.entry = entry; - } -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Exports.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Exports.java deleted file mode 100644 index 49f16aceca57..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Exports.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.microsoft.azure.services.serviceBus.messaging; - -import com.microsoft.azure.configuration.builder.Builder; - -public class Exports implements Builder.Exports { - public void register(Builder.Registry registry) { - registry.add(ServiceBusClient.class); - } -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Message.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Message.java index f440b77a41b4..ab26141569f4 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Message.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Message.java @@ -3,29 +3,13 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; -import com.microsoft.azure.services.serviceBus.BrokerProperties; +import com.microsoft.azure.services.serviceBus.schema.BrokerProperties; public class Message { BrokerProperties properties; InputStream body; - public String getLockToken() { - return properties.getLockToken(); - } - - public void setLockToken(String lockToken) { - properties.setLockToken(lockToken); - } - - public String getLockedUntilUtc() { - return properties.getLockedUntilUtc(); - } - - public void setLockedUntilUtc(String lockedUntilUtc) { - properties.setLockedUntilUtc(lockedUntilUtc); - } - public Message() { this(new BrokerProperties(), null); } @@ -56,6 +40,23 @@ public Message setBody(InputStream body) { return this; } + public String getLockToken() { + return properties.getLockToken(); + } + + public void setLockToken(String lockToken) { + properties.setLockToken(lockToken); + } + + public String getLockedUntilUtc() { + return properties.getLockedUntilUtc(); + } + + public void setLockedUntilUtc(String lockedUntilUtc) { + properties.setLockedUntilUtc(lockedUntilUtc); + } + + public Integer getDeliveryCount() { return properties.getDeliveryCount(); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Queue.java deleted file mode 100644 index 6140d60f622f..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Queue.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.microsoft.azure.services.serviceBus.messaging; - -import javax.xml.datatype.Duration; -import com.microsoft.azure.services.serviceBus.schema.Content; -import com.microsoft.azure.services.serviceBus.schema.Entry; - -import com.microsoft.azure.ServiceException; -import com.microsoft.azure.services.serviceBus.MessageResult; -import com.microsoft.azure.services.serviceBus.ReceiveMode; -import com.microsoft.azure.services.serviceBus.schema.QueueDescription; - -public class Queue extends AbstractEntity implements MessageSender, MessageReceiver, MessageTransceiver { - Queue(ServiceBusClient client, String name) { - super(client); - - Content content = new Content(); - - getEntry().setContent(content); - content.setType("application/xml"); - content.setQueueDescription(new QueueDescription()); - - setName(name); - } - - Queue(ServiceBusClient client, Entry entry) { - super(client, entry); - } - - QueueDescription getQueueDescription(){ - return getEntry().getContent().getQueueDescription(); - } - - - // API methods -// -// public void save() throws ServiceException { -// setEntry(getContract().createQueue(getEntry())); -// } -// -// public void delete() throws ServiceException { -// getContract().deleteQueue(getName()); -// } -// -// public void fetch() throws ServiceException { -// setEntry(getContract().getQueue(getName())); -// } -// -// public void sendMessage(Message message) throws ServiceException { -// sendMessage(message, SendMessageOptions.DEFAULT); -// } -// -// public void sendMessage(Message message, SendMessageOptions options) throws ServiceException { -// getContract().sendMessage(getName(), message.getProperties(), message.getBody()); -// } -// -// public Message receiveMessage() throws ServiceException { -// return receiveMessage(ReceiveMessageOptions.DEFAULT); -// } -// -// public Message receiveMessage(ReceiveMessageOptions options) throws ServiceException { -// MessageResult result = getContract().receiveMessage(getName(), options.getTimeout(), ReceiveMode.RECEIVE_AND_DELETE); -// return new Message(result.getBrokerProperties(), result.getBody()); -// } -// -// public Message peekLockMessage() throws ServiceException { -// return peekLockMessage(ReceiveMessageOptions.DEFAULT); -// } -// -// public Message peekLockMessage(ReceiveMessageOptions options) throws ServiceException { -// MessageResult result = getContract().receiveMessage(getName(), options.getTimeout(), ReceiveMode.PEEK_LOCK); -// return new Message(result.getBrokerProperties(), result.getBody()); -// } - - public void abandonMessage(Message message) { - // TODO Auto-generated method stub - } - - public void completeMessage(Message message) { - // TODO Auto-generated method stub - } - - - - - // API properties - - public String getName() { - return getEntry().getTitle(); - } - - public void setName(String value) { - getEntry().setTitle(value); - } - - public Duration getLockDuration() { - return getQueueDescription().getLockDuration(); - } - - public void setLockDuration(Duration value) { - getQueueDescription().setLockDuration(value); - } - - public Long getMaxSizeInMegabytes() { - return getQueueDescription().getMaxSizeInMegabytes(); - } - - public void setMaxSizeInMegabytes(Long value) { - getQueueDescription().setMaxSizeInMegabytes(value); - } - - public Long getMessageCount() { - return getQueueDescription().getMessageCount(); - } - - public Message receiveMessage() throws ServiceException { - // TODO Auto-generated method stub - return null; - } - - public Message receiveMessage(ReceiveMessageOptions options) - throws ServiceException { - // TODO Auto-generated method stub - return null; - } - - public Message peekLockMessage() throws ServiceException { - // TODO Auto-generated method stub - return null; - } - - public Message peekLockMessage(ReceiveMessageOptions options) - throws ServiceException { - // TODO Auto-generated method stub - return null; - } - - public void sendMessage(Message message) throws ServiceException { - // TODO Auto-generated method stub - - } - - public void sendMessage(Message message, SendMessageOptions options) - throws ServiceException { - // TODO Auto-generated method stub - - } - -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ServiceBusClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ServiceBusClient.java deleted file mode 100644 index bc8d7f1e7b66..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ServiceBusClient.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.microsoft.azure.services.serviceBus.messaging; - - -import java.util.ArrayList; - -import javax.inject.Inject; - -import com.microsoft.azure.services.serviceBus.schema.Feed; - -import com.microsoft.azure.ServiceException; -import com.microsoft.azure.configuration.Configuration; -import com.microsoft.azure.services.serviceBus.ServiceBusService; - -public class ServiceBusClient { - - ServiceBusService contract; - - public ServiceBusClient() throws Exception { - this("", Configuration.load()); - } - - public ServiceBusClient(Configuration config) throws Exception { - this("", config); - } - - public ServiceBusClient(String profile) throws Exception { - this(profile, Configuration.load()); - } - - public ServiceBusClient(String profile, Configuration config) throws Exception { - this(config.create(profile, ServiceBusService.class)); - } - - @Inject - public ServiceBusClient(ServiceBusService contract) { - this.contract = contract; - } - - public ServiceBusService getContract() { - return contract; - } - - public void setContract(ServiceBusService contract) { - this.contract = contract; - } - -// public Iterable listQueues() throws ServiceException { -// return listQueues(ListQueuesOptions.DEFAULT); -// } - -// // REVIEW: what is the generalized strategy for paginated, client-roundtrippable iteration -// public Iterable listQueues(ListQueuesOptions options) throws ServiceException { -// Feed descriptions = contract.getQueueList()(); -// ArrayList queues = new ArrayList(); -// for (int i = 0; i != descriptions.getEntries().size(); ++i) { -// queues.add(new Queue(this, descriptions.getEntries().get(i))); -// } -// return queues; -// } - - public Queue getQueue(String path) { - return new Queue(this, path); - } - - public Iterable listTopics() { - return null; - } -} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java index 2cb8e261b9ce..0860ac8576ba 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java @@ -9,7 +9,6 @@ import com.microsoft.azure.services.serviceBus.ServiceBusService; import com.microsoft.azure.services.serviceBus.Queue; import com.microsoft.azure.services.serviceBus.messaging.ReceiveMessageOptions; -import com.microsoft.azure.services.serviceBus.messaging.ServiceBusClient; public abstract class IntegrationTestBase { protected Configuration createConfiguration() { diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/ClientBuilderTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/ClientBuilderTest.java deleted file mode 100644 index 98180f1297c2..000000000000 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/ClientBuilderTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.microsoft.azure.services.serviceBus.messaging; - -import java.net.HttpURLConnection; -import java.net.URL; -import org.junit.Test; - -import static org.junit.Assert.*; - -import com.microsoft.azure.configuration.Configuration; -import com.microsoft.azure.services.serviceBus.ServiceBusServiceImpl; -import com.microsoft.azure.services.serviceBus.messaging.ServiceBusClient; - - -public class ClientBuilderTest { - @Test - public void testServiceBusClientCreatedWithContractImpl() throws Exception { - // Arrange - Configuration config = new Configuration(); - - // Act - ServiceBusClient client = config.create(ServiceBusClient.class); - ServiceBusClient client2 = new ServiceBusClient(config); - - // Assert - assertNotNull(client); - assertNotNull(client.getContract()); - assertEquals(ServiceBusServiceImpl.class, client.getContract().getClass()); - - assertNotNull(client2); - assertNotNull(client2.getContract()); - assertEquals(ServiceBusServiceImpl.class, client2.getContract().getClass()); - } - - @Test - public void testHttp404() throws Exception { - HttpURLConnection x = (HttpURLConnection)new URL("http://github.com/no-such-file").openConnection(); - int code = x.getResponseCode(); - assertEquals(404, code); - } -} From 47344ff04a45d77dea617950f35c67bf3cb2d2ea Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 2 Nov 2011 13:52:06 -0700 Subject: [PATCH 45/59] Streamlining Message data model class --- .../serviceBus/BrokerPropertiesMapper.java | 2 + .../azure/services/serviceBus/Message.java | 61 +++++++++++++++++++ .../services/serviceBus/MessageResult.java | 34 ----------- .../serviceBus/ServiceBusService.java | 6 +- .../serviceBus/ServiceBusServiceImpl.java | 14 +++-- .../serviceBus/messaging/Message.java | 1 - .../{ => schema}/BrokerProperties.java | 2 +- ...zure.configuration.builder.Builder$Exports | 1 - .../BrokerPropertiesMapperTest.java | 2 +- .../serviceBus/ServiceBusIntegrationTest.java | 24 +++----- 10 files changed, 85 insertions(+), 62 deletions(-) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageResult.java rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ => schema}/BrokerProperties.java (96%) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapper.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapper.java index 1cba63fc7519..16621d700351 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapper.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapper.java @@ -9,6 +9,8 @@ import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; +import com.microsoft.azure.services.serviceBus.schema.BrokerProperties; + public class BrokerPropertiesMapper { public BrokerProperties fromString(String value) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java new file mode 100644 index 000000000000..e9ed9d54a0b8 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java @@ -0,0 +1,61 @@ +package com.microsoft.azure.services.serviceBus; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; + +import com.microsoft.azure.services.serviceBus.schema.BrokerProperties; + +public class Message { + BrokerProperties properties; + InputStream body; + + public Message() { + this.properties = new BrokerProperties(); + } + + public Message(InputStream body) { + this.properties = new BrokerProperties(); + this.body = body; + } + + public Message(byte[] body) { + this.properties = new BrokerProperties(); + this.body = (body == null) ? null : new ByteArrayInputStream(body); + } + + public Message(String body) { + this.properties = new BrokerProperties(); + this.body = (body == null) ? null : new ByteArrayInputStream(body.getBytes()); + } + + Message(BrokerProperties properties, InputStream body) { + this.properties = properties; + this.body = body; + } + + /** + * @return the brokerProperties + */ + BrokerProperties getProperties() { + return properties; + } + + /** + * @param properties the brokerProperties to set + */ + void setProperties(BrokerProperties properties) { + this.properties = properties; + } + /** + * @return the body + */ + public InputStream getBody() { + return body; + } + /** + * @param body the body to set + */ + public void setBody(InputStream body) { + this.body = body; + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageResult.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageResult.java deleted file mode 100644 index 9de5f7ec3c3d..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MessageResult.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.microsoft.azure.services.serviceBus; - -import java.io.InputStream; - -public class MessageResult { - BrokerProperties brokerProperties; - - InputStream body; - - /** - * @return the brokerProperties - */ - public BrokerProperties getBrokerProperties() { - return brokerProperties; - } - /** - * @param brokerProperties the brokerProperties to set - */ - public void setBrokerProperties(BrokerProperties brokerProperties) { - this.brokerProperties = brokerProperties; - } - /** - * @return the body - */ - public InputStream getBody() { - return body; - } - /** - * @param body the body to set - */ - public void setBody(InputStream body) { - this.body = body; - } -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java index 2840cef9bdce..b0fe748780cb 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java @@ -1,7 +1,5 @@ package com.microsoft.azure.services.serviceBus; -import java.io.InputStream; - import com.microsoft.azure.services.serviceBus.schema.Entry; import com.microsoft.azure.services.serviceBus.schema.Feed; @@ -9,8 +7,8 @@ public interface ServiceBusService { - void sendMessage(String path, BrokerProperties properties, InputStream body) throws ServiceException; - MessageResult receiveMessage(String queuePath, Integer timeout, ReceiveMode receiveMode) throws ServiceException; + void sendMessage(String path, Message message) throws ServiceException; + Message receiveMessage(String queuePath, Integer timeout, ReceiveMode receiveMode) throws ServiceException; //BrokeredMessage receiveMessage(String topicPath, String subscriptionName, int timeout, ReceiveMode receiveMode) throws ServiceException; //void abandonMessage(BrokeredMessage message) throws ServiceException; //void completeMessage(BrokeredMessage message) throws ServiceException; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java index be8592929a50..35dba9d76a72 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java @@ -9,6 +9,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + +import com.microsoft.azure.services.serviceBus.schema.BrokerProperties; import com.microsoft.azure.services.serviceBus.schema.Entry; import com.microsoft.azure.services.serviceBus.schema.Feed; @@ -60,13 +62,13 @@ private ServiceException processCatch(ServiceException e) { } // REVIEW: contentType will be needed - public void sendMessage(String path, BrokerProperties properties, InputStream body) throws ServiceException { + public void sendMessage(String path, Message message) throws ServiceException { try { getResource() .path(path) .path("messages") - .header("BrokerProperties", mapper.toString(properties)) - .post(body); + .header("BrokerProperties", mapper.toString(message.getProperties())) + .post(message.getBody()); } catch(UniformInterfaceException e) { throw processCatch(new ServiceException(e)); @@ -76,7 +78,7 @@ public void sendMessage(String path, BrokerProperties properties, InputStream bo } } - public MessageResult receiveMessage(String queuePath, Integer timeout, + public Message receiveMessage(String queuePath, Integer timeout, ReceiveMode receiveMode) throws ServiceException { WebResource resource = getResource() @@ -116,8 +118,8 @@ else if (receiveMode == ReceiveMode.PEEK_LOCK) { } // REVIEW: harden this - it's much too brittle. throws null exceptions very easily - MessageResult result = new MessageResult(); - result.setBrokerProperties(mapper.fromString(clientResult.getHeaders().getFirst("BrokerProperties"))); + Message result = new Message(); + result.setProperties(mapper.fromString(clientResult.getHeaders().getFirst("BrokerProperties"))); result.setBody(clientResult.getEntityInputStream()); return result; } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Message.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Message.java index ab26141569f4..1df111229e8e 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Message.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Message.java @@ -56,7 +56,6 @@ public void setLockedUntilUtc(String lockedUntilUtc) { properties.setLockedUntilUtc(lockedUntilUtc); } - public Integer getDeliveryCount() { return properties.getDeliveryCount(); } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokerProperties.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/schema/BrokerProperties.java similarity index 96% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokerProperties.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/schema/BrokerProperties.java index 8b8806cc65b8..b819b080b091 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokerProperties.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/schema/BrokerProperties.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.schema; import org.codehaus.jackson.annotate.JsonGetter; import org.codehaus.jackson.annotate.JsonIgnore; diff --git a/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports b/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports index f7e819ac5b1e..fd0961993d35 100644 --- a/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports +++ b/microsoft-azure-api/src/main/resources/META-INF/services/com.microsoft.azure.configuration.builder.Builder$Exports @@ -1,5 +1,4 @@ com.microsoft.azure.auth.wrap.Exports com.microsoft.azure.configuration.jersey.Exports com.microsoft.azure.services.serviceBus.Exports -com.microsoft.azure.services.serviceBus.messaging.Exports com.microsoft.azure.utils.Exports diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapperTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapperTest.java index fbe2bd445117..3cb3681acb4e 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapperTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapperTest.java @@ -4,8 +4,8 @@ import org.junit.Test; -import com.microsoft.azure.services.serviceBus.BrokerProperties; import com.microsoft.azure.services.serviceBus.BrokerPropertiesMapper; +import com.microsoft.azure.services.serviceBus.schema.BrokerProperties; public class BrokerPropertiesMapperTest { @Test diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java index 8531b96b2cd7..ba30e72e42f2 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java @@ -5,13 +5,14 @@ import org.junit.Before; import org.junit.Test; + +import com.microsoft.azure.services.serviceBus.schema.BrokerProperties; import com.microsoft.azure.services.serviceBus.schema.Content; import com.microsoft.azure.services.serviceBus.schema.Entry; import com.microsoft.azure.services.serviceBus.schema.Feed; import com.microsoft.azure.configuration.Configuration; -import com.microsoft.azure.services.serviceBus.BrokerProperties; -import com.microsoft.azure.services.serviceBus.MessageResult; +import com.microsoft.azure.services.serviceBus.Message; import com.microsoft.azure.services.serviceBus.ReceiveMode; import com.microsoft.azure.services.serviceBus.ServiceBusService; import com.microsoft.azure.services.serviceBus.schema.QueueDescription; @@ -75,11 +76,10 @@ public void deleteQueueWorks() throws Exception { @Test public void sendMessageWorks() throws Exception { // Arrange - - BrokerProperties props = new BrokerProperties(); + Message message = new Message("sendMessageWorks"); // Act - service.sendMessage("TestAlpha", props, new ByteArrayInputStream("Hello World".getBytes())); + service.sendMessage("TestAlpha", message); // Assert } @@ -87,12 +87,10 @@ public void sendMessageWorks() throws Exception { @Test public void receiveMessageWorks() throws Exception { // Arrange - - BrokerProperties props = new BrokerProperties(); - service.sendMessage("TestAlpha", props, new ByteArrayInputStream("Hello World".getBytes())); + service.sendMessage("TestAlpha", new Message("Hello World")); // Act - MessageResult message = service.receiveMessage("TestAlpha", 500, ReceiveMode.RECEIVE_AND_DELETE); + Message message = service.receiveMessage("TestAlpha", 500, ReceiveMode.RECEIVE_AND_DELETE); byte[] data = new byte[100]; int size = message.getBody().read(data); @@ -104,17 +102,15 @@ public void receiveMessageWorks() throws Exception { @Test public void peekLockMessageWorks() throws Exception { // Arrange - - BrokerProperties props = new BrokerProperties(); + service.sendMessage("TestAlpha", new Message("Hello Again")); // Act - service.sendMessage("TestAlpha", props, new ByteArrayInputStream("Hello World".getBytes())); - MessageResult message = service.receiveMessage("TestAlpha", 500, ReceiveMode.PEEK_LOCK); + Message message = service.receiveMessage("TestAlpha", 500, ReceiveMode.PEEK_LOCK); // Assert byte[] data = new byte[100]; int size = message.getBody().read(data); assertEquals(11, size); - assertEquals("Hello World", new String(data, 0, size)); + assertEquals("Hello Again", new String(data, 0, size)); } } From 4aa2b74845c675a96a6a4f92efe804bbaad6c4ae Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 2 Nov 2011 13:54:38 -0700 Subject: [PATCH 46/59] Cleaning up more unused classes --- .../messaging/ListQueuesOptions.java | 24 ------ .../serviceBus/messaging/Message.java | 79 ------------------- .../serviceBus/messaging/MessageReceiver.java | 1 + .../serviceBus/messaging/MessageSender.java | 1 + .../services/serviceBus/messaging/Rule.java | 5 -- .../serviceBus/messaging/Subscription.java | 7 -- .../services/serviceBus/messaging/Topic.java | 7 -- 7 files changed, 2 insertions(+), 122 deletions(-) delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ListQueuesOptions.java delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Message.java delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Rule.java delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Subscription.java delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Topic.java diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ListQueuesOptions.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ListQueuesOptions.java deleted file mode 100644 index b8b6b73b4094..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ListQueuesOptions.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.microsoft.azure.services.serviceBus.messaging; - -public class ListQueuesOptions { - - public static final ListQueuesOptions DEFAULT = new ListQueuesOptions(); - - Integer skip; - public Integer getSkip() { - return skip; - } - public ListQueuesOptions setSkip(Integer skip) { - this.skip = skip; - return this; - } - public Integer getMaxCount() { - return maxCount; - } - public ListQueuesOptions setMaxCount(Integer maxCount) { - this.maxCount = maxCount; - return this; - } - Integer maxCount; - -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Message.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Message.java deleted file mode 100644 index 1df111229e8e..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Message.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.microsoft.azure.services.serviceBus.messaging; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; - -import com.microsoft.azure.services.serviceBus.schema.BrokerProperties; - - -public class Message { - BrokerProperties properties; - InputStream body; - - public Message() { - this(new BrokerProperties(), null); - } - - public Message(InputStream body) { - this(new BrokerProperties(), body); - } - - public Message(String body) { - this(new BrokerProperties(), (body == null) ? null : new ByteArrayInputStream(body.getBytes())); - } - - Message(BrokerProperties properties, InputStream body) { - this.properties = properties; - this.body = body; - } - - BrokerProperties getProperties() { - return properties; - } - - public InputStream getBody() { - return body; - } - - public Message setBody(InputStream body) { - this.body = body; - return this; - } - - public String getLockToken() { - return properties.getLockToken(); - } - - public void setLockToken(String lockToken) { - properties.setLockToken(lockToken); - } - - public String getLockedUntilUtc() { - return properties.getLockedUntilUtc(); - } - - public void setLockedUntilUtc(String lockedUntilUtc) { - properties.setLockedUntilUtc(lockedUntilUtc); - } - - public Integer getDeliveryCount() { - return properties.getDeliveryCount(); - } - - public String getMessageId() { - return properties.getMessageId(); - } - - public Long getSequenceNumber() { - return properties.getSequenceNumber(); - } - - public Long getTimeToLive() { - return properties.getTimeToLive(); - } - - public Message setTimeToLive(Long timeToLive) { - properties.setTimeToLive(timeToLive); - return this; - } -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageReceiver.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageReceiver.java index 0bed33badbe2..763574d16ac0 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageReceiver.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageReceiver.java @@ -1,6 +1,7 @@ package com.microsoft.azure.services.serviceBus.messaging; import com.microsoft.azure.ServiceException; +import com.microsoft.azure.services.serviceBus.Message; public interface MessageReceiver { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageSender.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageSender.java index c942cbf51550..36720140f0d6 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageSender.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageSender.java @@ -1,6 +1,7 @@ package com.microsoft.azure.services.serviceBus.messaging; import com.microsoft.azure.ServiceException; +import com.microsoft.azure.services.serviceBus.Message; public interface MessageSender { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Rule.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Rule.java deleted file mode 100644 index 6024ffc99502..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Rule.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.microsoft.azure.services.serviceBus.messaging; - -public class Rule { - -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Subscription.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Subscription.java deleted file mode 100644 index df3f45f2482b..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Subscription.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.microsoft.azure.services.serviceBus.messaging; - -public class Subscription { - public Rule getRules() { - return null; - } -} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Topic.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Topic.java deleted file mode 100644 index a71cc3701b2b..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/Topic.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.microsoft.azure.services.serviceBus.messaging; - -public class Topic { - Subscription[] getSubscriptions() { - return null; - } -} From 61a255c48e115045dec62195ddd94ae832f601ac Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 2 Nov 2011 13:57:08 -0700 Subject: [PATCH 47/59] Moving services.serviceBus.messaging to services.serviceBus.client --- .../serviceBus/{messaging => client}/MessageReceiver.java | 2 +- .../serviceBus/{messaging => client}/MessageSender.java | 2 +- .../serviceBus/{messaging => client}/MessageTransceiver.java | 2 +- .../serviceBus/{messaging => client}/ReceiveMessageOptions.java | 2 +- .../serviceBus/{messaging => client}/SendMessageOptions.java | 2 +- .../azure/services/serviceBus/IntegrationTestBase.java | 2 +- .../{messaging => client}/QueueManagementIntegrationTest.java | 1 + .../serviceBus/{messaging => client}/QueueManagementTest.java | 1 + 8 files changed, 8 insertions(+), 6 deletions(-) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{messaging => client}/MessageReceiver.java (87%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{messaging => client}/MessageSender.java (80%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{messaging => client}/MessageTransceiver.java (55%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{messaging => client}/ReceiveMessageOptions.java (83%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{messaging => client}/SendMessageOptions.java (66%) rename microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/{messaging => client}/QueueManagementIntegrationTest.java (94%) rename microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/{messaging => client}/QueueManagementTest.java (95%) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageReceiver.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/MessageReceiver.java similarity index 87% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageReceiver.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/MessageReceiver.java index 763574d16ac0..cb18c72c3315 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageReceiver.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/MessageReceiver.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus.messaging; +package com.microsoft.azure.services.serviceBus.client; import com.microsoft.azure.ServiceException; import com.microsoft.azure.services.serviceBus.Message; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageSender.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/MessageSender.java similarity index 80% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageSender.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/MessageSender.java index 36720140f0d6..f9b1568e5a5b 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageSender.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/MessageSender.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus.messaging; +package com.microsoft.azure.services.serviceBus.client; import com.microsoft.azure.ServiceException; import com.microsoft.azure.services.serviceBus.Message; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageTransceiver.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/MessageTransceiver.java similarity index 55% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageTransceiver.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/MessageTransceiver.java index 2dbe7eb97899..253fc046a894 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/MessageTransceiver.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/MessageTransceiver.java @@ -1,5 +1,5 @@ -package com.microsoft.azure.services.serviceBus.messaging; +package com.microsoft.azure.services.serviceBus.client; public interface MessageTransceiver extends MessageSender, MessageReceiver { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ReceiveMessageOptions.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/ReceiveMessageOptions.java similarity index 83% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ReceiveMessageOptions.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/ReceiveMessageOptions.java index 3e91c4991e96..380bcf2c3c02 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/ReceiveMessageOptions.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/ReceiveMessageOptions.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus.messaging; +package com.microsoft.azure.services.serviceBus.client; public class ReceiveMessageOptions { Integer timeout; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/SendMessageOptions.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/SendMessageOptions.java similarity index 66% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/SendMessageOptions.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/SendMessageOptions.java index a1af78c64888..dbc353621a41 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/messaging/SendMessageOptions.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/SendMessageOptions.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus.messaging; +package com.microsoft.azure.services.serviceBus.client; public class SendMessageOptions { diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java index 0860ac8576ba..039658054674 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java @@ -8,7 +8,7 @@ import com.microsoft.azure.configuration.Configuration; import com.microsoft.azure.services.serviceBus.ServiceBusService; import com.microsoft.azure.services.serviceBus.Queue; -import com.microsoft.azure.services.serviceBus.messaging.ReceiveMessageOptions; +import com.microsoft.azure.services.serviceBus.client.ReceiveMessageOptions; public abstract class IntegrationTestBase { protected Configuration createConfiguration() { diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/client/QueueManagementIntegrationTest.java similarity index 94% rename from microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementIntegrationTest.java rename to microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/client/QueueManagementIntegrationTest.java index bf3c4f8ca122..0ca8e2c38c7a 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/client/QueueManagementIntegrationTest.java @@ -1,3 +1,4 @@ +package com.microsoft.azure.services.serviceBus.client; //package com.microsoft.azure.services.serviceBus.messaging; // //import static org.junit.Assert.*; diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/client/QueueManagementTest.java similarity index 95% rename from microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementTest.java rename to microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/client/QueueManagementTest.java index cdae4631daae..4183ba2ae42e 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/messaging/QueueManagementTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/client/QueueManagementTest.java @@ -1,3 +1,4 @@ +package com.microsoft.azure.services.serviceBus.client; //package com.microsoft.azure.services.serviceBus.messaging; // //import static org.junit.Assert.*; From e5aa95be6772497986f8e33dac1a897f4acbecb8 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 2 Nov 2011 14:37:29 -0700 Subject: [PATCH 48/59] Refining small MessagingClient high-level helper --- .../azure/services/serviceBus/Exports.java | 2 + .../serviceBus/ServiceBusService.java | 8 +- .../serviceBus/ServiceBusServiceImpl.java | 16 +++ .../serviceBus/client/MessageSender.java | 1 - .../serviceBus/client/MessagingClient.java | 127 ++++++++++++++++++ .../serviceBus/client/SendMessageOptions.java | 7 - .../serviceBus/ServiceBusIntegrationTest.java | 8 -- .../MessagingClientIntegrationTest.java | 79 +++++++++++ 8 files changed, 228 insertions(+), 20 deletions(-) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/MessagingClient.java delete mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/SendMessageOptions.java create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/client/MessagingClientIntegrationTest.java diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java index 3adc0fcec2d9..0d4df2134639 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java @@ -3,6 +3,7 @@ import java.util.Map; import com.microsoft.azure.configuration.builder.Builder; +import com.microsoft.azure.services.serviceBus.client.MessagingClient; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.json.JSONConfiguration; @@ -11,6 +12,7 @@ public void register(Builder.Registry registry) { // provide contract implementation registry.add(ServiceBusService.class, ServiceBusServiceImpl.class); + registry.add(MessagingClient.class); // alter jersey client config for serviceBus registry.alter(ClientConfig.class, new Builder.Alteration() { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java index b0fe748780cb..ecc1a75495db 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java @@ -8,10 +8,10 @@ public interface ServiceBusService { void sendMessage(String path, Message message) throws ServiceException; - Message receiveMessage(String queuePath, Integer timeout, ReceiveMode receiveMode) throws ServiceException; - //BrokeredMessage receiveMessage(String topicPath, String subscriptionName, int timeout, ReceiveMode receiveMode) throws ServiceException; - //void abandonMessage(BrokeredMessage message) throws ServiceException; - //void completeMessage(BrokeredMessage message) throws ServiceException; + Message receiveMessage(String queueName, Integer timeout, ReceiveMode receiveMode) throws ServiceException; + Message receiveMessage(String topicName, String subscriptionName, int timeout, ReceiveMode receiveMode) throws ServiceException; + void abandonMessage(Message message) throws ServiceException; + void completeMessage(Message message) throws ServiceException; Queue createQueue(Queue queue) throws ServiceException; void deleteQueue(String queuePath) throws ServiceException; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java index 35dba9d76a72..3d8453d3a5e1 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java @@ -124,6 +124,21 @@ else if (receiveMode == ReceiveMode.PEEK_LOCK) { return result; } + public Message receiveMessage(String topicPath, String subscriptionName, + int timeout, ReceiveMode receiveMode) throws ServiceException { + // TODO Auto-generated method stub + return null; + } + + public void abandonMessage(Message message) throws ServiceException { + // TODO Auto-generated method stub + + } + + public void completeMessage(Message message) throws ServiceException { + // TODO Auto-generated method stub + + } public Queue createQueue(Queue entry) throws ServiceException { try { @@ -277,4 +292,5 @@ public Feed getRules(String topicPath, String subscriptionName) { } + } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/MessageSender.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/MessageSender.java index f9b1568e5a5b..f71050226121 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/MessageSender.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/MessageSender.java @@ -6,5 +6,4 @@ public interface MessageSender { void sendMessage(Message message) throws ServiceException; - void sendMessage(Message message, SendMessageOptions options) throws ServiceException; } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/MessagingClient.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/MessagingClient.java new file mode 100644 index 000000000000..e3290259ba23 --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/MessagingClient.java @@ -0,0 +1,127 @@ +package com.microsoft.azure.services.serviceBus.client; + +import javax.inject.Inject; + +import com.microsoft.azure.ServiceException; +import com.microsoft.azure.configuration.Configuration; +import com.microsoft.azure.services.serviceBus.Message; +import com.microsoft.azure.services.serviceBus.ReceiveMode; +import com.microsoft.azure.services.serviceBus.ServiceBusService; + +public class MessagingClient { + private ServiceBusService service; + + + public MessagingClient() throws Exception { + this.setService(Configuration.load().create(ServiceBusService.class)); + } + + public MessagingClient(String profile) throws Exception { + this.setService(Configuration.load().create(profile, ServiceBusService.class)); + } + + public MessagingClient(Configuration configuration) throws Exception { + this.setService(configuration.create(ServiceBusService.class)); + } + + public MessagingClient(String profile, Configuration configuration) throws Exception { + this.setService(configuration.create(profile, ServiceBusService.class)); + } + + @Inject + public MessagingClient(ServiceBusService service) { + this.setService(service); + } + + public void setService(ServiceBusService service) { + this.service = service; + } + + public ServiceBusService getService() { + return service; + } + + public MessageTransceiver openQueue(String queueName) { + final String queue = queueName; + return new MessageTransceiver() { + + public void sendMessage(Message message) throws ServiceException { + service.sendMessage(queue, message); + } + + public Message receiveMessage() throws ServiceException { + return receiveMessage(ReceiveMessageOptions.DEFAULT); + } + + public Message receiveMessage(ReceiveMessageOptions options) + throws ServiceException { + return service.receiveMessage(queue, options.getTimeout(), + ReceiveMode.RECEIVE_AND_DELETE); + } + + public Message peekLockMessage() throws ServiceException { + return peekLockMessage(ReceiveMessageOptions.DEFAULT); + } + + public Message peekLockMessage(ReceiveMessageOptions options) + throws ServiceException { + return service.receiveMessage(queue, options.getTimeout(), + ReceiveMode.PEEK_LOCK); + } + + public void abandonMessage(Message message) throws ServiceException { + service.abandonMessage(message); + } + + public void completeMessage(Message message) + throws ServiceException { + service.completeMessage(message); + } + }; + } + + public MessageSender openTopic(String topicName) { + final String topic = topicName; + return new MessageSender() { + public void sendMessage(Message message) throws ServiceException { + service.sendMessage(topic, message); + } + }; + } + + public MessageReceiver openSubscription(String topicName, String subscriptionName) { + final String topic = topicName; + final String subscription = subscriptionName; + return new MessageReceiver() { + + public Message receiveMessage() throws ServiceException { + return receiveMessage(ReceiveMessageOptions.DEFAULT); + } + + public Message receiveMessage(ReceiveMessageOptions options) + throws ServiceException { + return service.receiveMessage(topic, subscription, options.getTimeout(), + ReceiveMode.RECEIVE_AND_DELETE); + } + + public Message peekLockMessage() throws ServiceException { + return peekLockMessage(ReceiveMessageOptions.DEFAULT); + } + + public Message peekLockMessage(ReceiveMessageOptions options) + throws ServiceException { + return service.receiveMessage(topic, subscription, options.getTimeout(), + ReceiveMode.PEEK_LOCK); + } + + public void abandonMessage(Message message) throws ServiceException { + service.abandonMessage(message); + } + + public void completeMessage(Message message) + throws ServiceException { + service.completeMessage(message); + } + }; + } +} diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/SendMessageOptions.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/SendMessageOptions.java deleted file mode 100644 index dbc353621a41..000000000000 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/client/SendMessageOptions.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.microsoft.azure.services.serviceBus.client; - -public class SendMessageOptions { - - public static final SendMessageOptions DEFAULT = new SendMessageOptions(); - -} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java index ba30e72e42f2..1b23e338b39c 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java @@ -1,22 +1,14 @@ package com.microsoft.azure.services.serviceBus; -import java.io.ByteArrayInputStream; import java.util.Arrays; import org.junit.Before; import org.junit.Test; -import com.microsoft.azure.services.serviceBus.schema.BrokerProperties; -import com.microsoft.azure.services.serviceBus.schema.Content; -import com.microsoft.azure.services.serviceBus.schema.Entry; -import com.microsoft.azure.services.serviceBus.schema.Feed; - import com.microsoft.azure.configuration.Configuration; import com.microsoft.azure.services.serviceBus.Message; import com.microsoft.azure.services.serviceBus.ReceiveMode; import com.microsoft.azure.services.serviceBus.ServiceBusService; -import com.microsoft.azure.services.serviceBus.schema.QueueDescription; - import static org.junit.Assert.*; public class ServiceBusIntegrationTest extends IntegrationTestBase { diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/client/MessagingClientIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/client/MessagingClientIntegrationTest.java new file mode 100644 index 000000000000..0c63405f21ee --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/client/MessagingClientIntegrationTest.java @@ -0,0 +1,79 @@ +package com.microsoft.azure.services.serviceBus.client; + +import static org.junit.Assert.*; + +import java.io.IOException; + +import org.junit.Before; +import org.junit.Test; + +import com.microsoft.azure.ServiceException; +import com.microsoft.azure.services.serviceBus.IntegrationTestBase; +import com.microsoft.azure.services.serviceBus.Message; + +public class MessagingClientIntegrationTest extends IntegrationTestBase { + + private MessagingClient messaging; + + @Before + public void createClient() throws Exception + { + messaging = createConfiguration().create(MessagingClient.class); + } + + @Test + public void queueWillSendAndReceiveMessages() throws Exception + { + // Arrange + MessageTransceiver port = messaging.openQueue("TestAlpha"); + Message messageOut = new Message("queueWillSendAndReceiveMessages"); + + // Act + port.sendMessage(messageOut); + Message messageIn = port.receiveMessage(); + + // Assert + assertNotSame(messageOut, messageIn); + + byte[] data = new byte[100]; + int size = messageIn.getBody().read(data); + assertEquals(31, size); + assertEquals("queueWillSendAndReceiveMessages", new String(data, 0, size)); + } + + + @Test + public void queueIsSenderAndReceiver() throws Exception + { + // Arrange + MessageSender sender = messaging.openQueue("TestAlpha"); + MessageReceiver receiver = messaging.openQueue("TestAlpha"); + Message messageOut = new Message("queueIsSenderAndReceiver"); + + // Act + sender.sendMessage(messageOut); + Message messageIn = receiver.receiveMessage(); + + // Assert + assertNotSame(messageOut, messageIn); + + byte[] data = new byte[100]; + int size = messageIn.getBody().read(data); + assertEquals(24, size); + assertEquals("queueIsSenderAndReceiver", new String(data, 0, size)); + } + + + @Test + public void clientMayBeCreatedDirectly() throws Exception + { + // Arrange + + // Act + MessagingClient mc = new MessagingClient(createConfiguration()); + mc.openQueue("TestAlpha").sendMessage(new Message("clientMayBeCreatedDirectly")); + + // Assert + } + +} From 991e08bd3479370b2a3ca7f44a8e6e6a1f844052 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 2 Nov 2011 15:05:16 -0700 Subject: [PATCH 49/59] Removing unused classes --- .../QueueManagementIntegrationTest.java | 101 ------------------ .../client/QueueManagementTest.java | 66 ------------ 2 files changed, 167 deletions(-) delete mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/client/QueueManagementIntegrationTest.java delete mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/client/QueueManagementTest.java diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/client/QueueManagementIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/client/QueueManagementIntegrationTest.java deleted file mode 100644 index 0ca8e2c38c7a..000000000000 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/client/QueueManagementIntegrationTest.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.microsoft.azure.services.serviceBus.client; -//package com.microsoft.azure.services.serviceBus.messaging; -// -//import static org.junit.Assert.*; -// -//import java.io.ByteArrayInputStream; -// -//import org.junit.Test; -// -//import com.microsoft.azure.services.serviceBus.messaging.Message; -//import com.microsoft.azure.services.serviceBus.messaging.Queue; -//import com.microsoft.azure.services.serviceBus.messaging.ServiceBusClient; -// -// -//public class QueueManagementIntegrationTest extends IntegrationTestBase { -// -// private ServiceBusClient createClient() throws Exception { -// return new ServiceBusClient(createConfiguration()); -// } -// -// @Test -// public void queueCanBeCreatedAndDeleted() throws Exception { -// // Arrange -// ServiceBusClient client = createClient(); -// -// // Act -// Queue queue = client.getQueue("TestQueueCanBeCreatedAndDeleted"); -// queue.save(); -// queue.delete(); -// -// // Assert -// } -// -// @Test -// public void whenQueueIsCreatedEntityStateIsAlsoUpdated() throws Exception { -// // Arrange -// ServiceBusClient client = createClient(); -// -// // Act -// Queue queue = client.getQueue("TestWhenQueueIsCreatedEntityStateIsAlsoUpdated"); -// Long maxSizeBefore = queue.getMaxSizeInMegabytes(); -// queue.save(); -// Long maxSizeAfter = queue.getMaxSizeInMegabytes(); -// queue.delete(); -// -// // Assert -// assertNull(maxSizeBefore); -// assertNotNull(maxSizeAfter); -// } -// -// -// @Test -// public void existingQueuePathDoesNotReturnNull() throws Exception { -// // Arrange -// ServiceBusClient client = createClient(); -// -// // Act -// Queue queue = client.getQueue("TestAlpha"); -// queue.fetch(); -// -// // Assert -// assertNotNull(queue); -// assertEquals("TestAlpha", queue.getName()); -// } -// -// @Test -// public void createQueueAndSendAndReceiveMessage() throws Exception { -// // Arrange -// ServiceBusClient client = createClient(); -// -// // Act -// Queue queue = client.getQueue("TestCreateQueueAndSendAndReceiveMessage"); -// queue.save(); -// -// queue.sendMessage(new Message("Hello World")); -// Message received = queue.receiveMessage(); -// -// // Assert -// assertNotNull(received); -// assertEquals(1, (int)received.getDeliveryCount()); -// } -// -// -// @Test -// public void peekLockedMessageHasLockTokenAndLockedUntilUtc() throws Exception { -// // Arrange -// ServiceBusClient client = createClient(); -// -// // Act -// Queue queue = client.getQueue("TestCreateQueueAndSendAndReceiveMessage"); -// queue.save(); -// -// queue.sendMessage(new Message("Hello World")); -// Message received = queue.peekLockMessage(); -// -// // Assert -// assertNotNull(received); -// assertNotNull(received.getLockToken()); -// assertNotNull(received.getLockedUntilUtc()); -// } -//} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/client/QueueManagementTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/client/QueueManagementTest.java deleted file mode 100644 index 4183ba2ae42e..000000000000 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/client/QueueManagementTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.microsoft.azure.services.serviceBus.client; -//package com.microsoft.azure.services.serviceBus.messaging; -// -//import static org.junit.Assert.*; -//import static org.mockito.Mockito.*; -// -//import javax.xml.datatype.DatatypeConfigurationException; -//import javax.xml.datatype.DatatypeFactory; -// -//import org.junit.Test; -//import org.mockito.ArgumentCaptor; -//import com.microsoft.azure.services.serviceBus.schema.Content; -//import com.microsoft.azure.services.serviceBus.schema.Entry; -// -//import com.microsoft.azure.ServiceException; -//import com.microsoft.azure.services.serviceBus.ServiceBusService; -//import com.microsoft.azure.services.serviceBus.schema.QueueDescription; -//import com.microsoft.azure.services.serviceBus.messaging.Queue; -//import com.microsoft.azure.services.serviceBus.messaging.ServiceBusClient; -// -// -//public class QueueManagementTest { -// @Test -// public void testGetQueueAcquiresDescriptionFromServer() throws ServiceException { -// // Arrange -// ServiceBusService contract = mock(ServiceBusService.class); -// -// Entry entry = new Entry(); -// when(contract.getQueue("Hello")).thenReturn(entry); -// -// entry.setContent(new Content()); -// //entry.getContent().setQueueDescription(new QueueDescription()); -// //entry.getContent().getQueueDescription().setMessageCount(73L); -// -// // Act -// ServiceBusClient client = new ServiceBusClient(contract); -// Queue helloQueue = client.getQueue("Hello"); -// helloQueue.fetch(); -// -// // Assert -// assertEquals(73, helloQueue.getMessageCount().longValue()); -// } -// -// @Test -// public void queueCreateSendsCreateQueueDescriptionMessage() throws DatatypeConfigurationException, ServiceException { -// // Arrange -// ServiceBusService contract = mock(ServiceBusService.class); -// -// // Act -// ServiceBusClient client = new ServiceBusClient(contract); -// Queue helloQueue = client.getQueue("MyNewQueue"); -// helloQueue.setLockDuration(DatatypeFactory.newInstance().newDuration(60 * 1000L)); -// helloQueue.setMaxSizeInMegabytes(42L); -// helloQueue.save(); -// -// // Assert -// ArgumentCaptor argument = ArgumentCaptor.forClass(Entry.class); -// verify(contract).createQueue(argument.capture()); -// Entry entry = argument.getValue(); -// //QueueDescription model = entry.getContent().getQueueDescription(); -// -// assertEquals("MyNewQueue", entry.getTitle()); -// //assertEquals(DatatypeFactory.newInstance().newDuration(60 * 1000L), model.getLockDuration()); -// //assertEquals(42, model.getMaxSizeInMegabytes().longValue()); -// } -//} From 5a82510e314d3180a76c0ef5f6ccbebb348e7f7d Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 2 Nov 2011 17:35:06 -0700 Subject: [PATCH 50/59] Moving Iterable to Util method Keeps the XxxService interface a pure service representation --- .../azure/services/serviceBus/ServiceBusService.java | 1 - .../services/serviceBus/ServiceBusServiceImpl.java | 4 ---- .../com/microsoft/azure/services/serviceBus/Util.java | 11 +++++++++++ .../services/serviceBus/IntegrationTestBase.java | 4 ++-- 4 files changed, 13 insertions(+), 7 deletions(-) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Util.java diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java index ecc1a75495db..b8f6632bff0b 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java @@ -17,7 +17,6 @@ public interface ServiceBusService { void deleteQueue(String queuePath) throws ServiceException; Queue getQueue(String queuePath) throws ServiceException; QueueList getQueueList() throws ServiceException; - Iterable iterateQueues() throws ServiceException; Entry createTopic(Entry topic) throws ServiceException; void deleteTopic(String topicPath) throws ServiceException; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java index 3d8453d3a5e1..685012e6c3b9 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java @@ -183,10 +183,6 @@ public Queue getQueue(String queuePath) throws ServiceException { } } - public Iterable iterateQueues() throws ServiceException { - //TODO: iterate over link rel=next pagination - return getQueueList().getQueues(); - } public QueueList getQueueList() throws ServiceException { try { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Util.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Util.java new file mode 100644 index 000000000000..d2ed0fb88d2d --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Util.java @@ -0,0 +1,11 @@ +package com.microsoft.azure.services.serviceBus; + +import com.microsoft.azure.ServiceException; + +public class Util { + public static Iterable iterateQueues(ServiceBusService service) + throws ServiceException { + //TODO: iterate over link rel=next pagination + return service.getQueueList().getQueues(); + } +} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java index 039658054674..542609bc0828 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java @@ -8,7 +8,7 @@ import com.microsoft.azure.configuration.Configuration; import com.microsoft.azure.services.serviceBus.ServiceBusService; import com.microsoft.azure.services.serviceBus.Queue; -import com.microsoft.azure.services.serviceBus.client.ReceiveMessageOptions; +import static com.microsoft.azure.services.serviceBus.Util.*; public abstract class IntegrationTestBase { protected Configuration createConfiguration() { @@ -43,7 +43,7 @@ public void initialize() throws Exception { boolean testAlphaExists = false; ServiceBusService service = createConfiguration().create(ServiceBusService.class); - for(Queue queue : service.iterateQueues()) { + for(Queue queue : iterateQueues(service)) { String queueName = queue.getName(); if (queueName.startsWith("Test") || queueName.startsWith("test")) { if (queueName.equalsIgnoreCase("TestAlpha")) { From 758883c1ef35c369a3d270fbbef5ccdc4ebd4544 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 3 Nov 2011 11:34:21 -0700 Subject: [PATCH 51/59] Moving classes that don't need to be used directly --- .../azure/services/serviceBus/Exports.java | 4 ++ .../azure/services/serviceBus/Message.java | 6 +-- .../azure/services/serviceBus/Queue.java | 47 ++++++++++--------- .../azure/services/serviceBus/QueueList.java | 2 +- .../BrokerProperties.java | 2 +- .../BrokerPropertiesMapper.java | 3 +- .../{ => implementation}/EntryModel.java | 2 +- .../EntryModelProvider.java | 3 +- .../MarshallerProvider.java | 3 +- .../NamespacePrefixMapperImpl.java | 2 +- .../ServiceBusServiceImpl.java | 8 +++- .../BrokerPropertiesMapperTest.java | 4 +- .../serviceBus/ContractBuilderTest.java | 1 + 13 files changed, 49 insertions(+), 38 deletions(-) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{schema => implementation}/BrokerProperties.java (96%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ => implementation}/BrokerPropertiesMapper.java (92%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ => implementation}/EntryModel.java (86%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ => implementation}/EntryModelProvider.java (94%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ => implementation}/MarshallerProvider.java (95%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ => implementation}/NamespacePrefixMapperImpl.java (87%) rename microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/{ => implementation}/ServiceBusServiceImpl.java (91%) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java index 0d4df2134639..834788787782 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Exports.java @@ -4,6 +4,10 @@ import com.microsoft.azure.configuration.builder.Builder; import com.microsoft.azure.services.serviceBus.client.MessagingClient; +import com.microsoft.azure.services.serviceBus.implementation.BrokerPropertiesMapper; +import com.microsoft.azure.services.serviceBus.implementation.EntryModelProvider; +import com.microsoft.azure.services.serviceBus.implementation.MarshallerProvider; +import com.microsoft.azure.services.serviceBus.implementation.ServiceBusServiceImpl; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.json.JSONConfiguration; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java index e9ed9d54a0b8..2e4a0ef6f450 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java @@ -3,7 +3,7 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; -import com.microsoft.azure.services.serviceBus.schema.BrokerProperties; +import com.microsoft.azure.services.serviceBus.implementation.BrokerProperties; public class Message { BrokerProperties properties; @@ -36,14 +36,14 @@ public Message(String body) { /** * @return the brokerProperties */ - BrokerProperties getProperties() { + public BrokerProperties getProperties() { return properties; } /** * @param properties the brokerProperties to set */ - void setProperties(BrokerProperties properties) { + public void setProperties(BrokerProperties properties) { this.properties = properties; } /** diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java index 9acea472b99b..4a0d4c9c2874 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java @@ -4,6 +4,7 @@ import javax.ws.rs.core.MediaType; import javax.xml.datatype.Duration; +import com.microsoft.azure.services.serviceBus.implementation.EntryModel; import com.microsoft.azure.services.serviceBus.schema.Content; import com.microsoft.azure.services.serviceBus.schema.Entry; @@ -13,9 +14,9 @@ public class Queue extends EntryModel { public Queue() { super(new Entry(), new QueueDescription()); - entry.setContent(new Content()); - entry.getContent().setType(MediaType.APPLICATION_XML); - entry.getContent().setQueueDescription(getModel()); + getEntry().setContent(new Content()); + getEntry().getContent().setType(MediaType.APPLICATION_XML); + getEntry().getContent().setQueueDescription(getModel()); } public Queue(Entry entry) { @@ -24,94 +25,94 @@ public Queue(Entry entry) { public String getName() { - return entry.getTitle(); + return getEntry().getTitle(); } public Queue setName(String value) { - entry.setTitle(value); + getEntry().setTitle(value); return this; } public Duration getLockDuration() { - return model.getLockDuration(); + return getModel().getLockDuration(); } public Queue setLockDuration(Duration value) { - model.setLockDuration(value); + getModel().setLockDuration(value); return this; } public Long getMaxSizeInMegabytes() { - return model.getMaxSizeInMegabytes(); + return getModel().getMaxSizeInMegabytes(); } public Queue setMaxSizeInMegabytes(Long value) { - model.setMaxSizeInMegabytes(value); + getModel().setMaxSizeInMegabytes(value); return this; } public Queue setRequiresDuplicateDetection(Boolean value) { - model.setRequiresDuplicateDetection(value); + getModel().setRequiresDuplicateDetection(value); return this; } public Queue setRequiresSession(Boolean value) { - model.setRequiresSession(value); + getModel().setRequiresSession(value); return this; } public Duration getDefaultMessageTimeToLive() { - return model.getDefaultMessageTimeToLive(); + return getModel().getDefaultMessageTimeToLive(); } public Queue setDefaultMessageTimeToLive(Duration value) { - model.setDefaultMessageTimeToLive(value); + getModel().setDefaultMessageTimeToLive(value); return this; } public Queue setDeadLetteringOnMessageExpiration(Boolean value) { - model.setDeadLetteringOnMessageExpiration(value); + getModel().setDeadLetteringOnMessageExpiration(value); return this; } public Duration getDuplicateDetectionHistoryTimeWindow() { - return model.getDuplicateDetectionHistoryTimeWindow(); + return getModel().getDuplicateDetectionHistoryTimeWindow(); } public Queue setDuplicateDetectionHistoryTimeWindow(Duration value) { - model.setDuplicateDetectionHistoryTimeWindow(value); + getModel().setDuplicateDetectionHistoryTimeWindow(value); return this; } public Integer getMaxDeliveryCount() { - return model.getMaxDeliveryCount(); + return getModel().getMaxDeliveryCount(); } public Queue setMaxDeliveryCount(Integer value) { - model.setMaxDeliveryCount(value); + getModel().setMaxDeliveryCount(value); return this; } public Queue setEnableBatchedOperations(Boolean value) { - model.setEnableBatchedOperations(value); + getModel().setEnableBatchedOperations(value); return this; } public Long getSizeInBytes() { - return model.getSizeInBytes(); + return getModel().getSizeInBytes(); } public Queue setSizeInBytes(Long value) { - model.setSizeInBytes(value); + getModel().setSizeInBytes(value); return this; } public Long getMessageCount() { - return model.getMessageCount(); + return getModel().getMessageCount(); } public Queue setMessageCount(Long value) { - model.setMessageCount(value); + getModel().setMessageCount(value); return this; } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/QueueList.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/QueueList.java index 746b98848e40..cb29a3a8aa63 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/QueueList.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/QueueList.java @@ -10,7 +10,7 @@ List getQueues() { return queues; } - void setQueues(List queues) { + public void setQueues(List queues) { this.queues = queues; } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/schema/BrokerProperties.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/BrokerProperties.java similarity index 96% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/schema/BrokerProperties.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/BrokerProperties.java index b819b080b091..b38a84f900f5 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/schema/BrokerProperties.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/BrokerProperties.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus.schema; +package com.microsoft.azure.services.serviceBus.implementation; import org.codehaus.jackson.annotate.JsonGetter; import org.codehaus.jackson.annotate.JsonIgnore; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapper.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/BrokerPropertiesMapper.java similarity index 92% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapper.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/BrokerPropertiesMapper.java index 16621d700351..69e6a13a0948 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapper.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/BrokerPropertiesMapper.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.implementation; import java.io.IOException; import java.io.StringWriter; @@ -9,7 +9,6 @@ import org.codehaus.jackson.map.JsonMappingException; import org.codehaus.jackson.map.ObjectMapper; -import com.microsoft.azure.services.serviceBus.schema.BrokerProperties; public class BrokerPropertiesMapper { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/EntryModel.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/EntryModel.java similarity index 86% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/EntryModel.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/EntryModel.java index f6592682dc20..5032acc33b22 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/EntryModel.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/EntryModel.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.implementation; import com.microsoft.azure.services.serviceBus.schema.Entry; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/EntryModelProvider.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/EntryModelProvider.java similarity index 94% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/EntryModelProvider.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/EntryModelProvider.java index cfeee55a1dde..03f9c1df0931 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/EntryModelProvider.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/EntryModelProvider.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.implementation; import java.io.IOException; import java.io.InputStream; @@ -13,6 +13,7 @@ import javax.ws.rs.ext.MessageBodyReader; import javax.ws.rs.ext.MessageBodyWriter; +import com.microsoft.azure.services.serviceBus.Queue; import com.microsoft.azure.services.serviceBus.schema.Entry; import com.sun.jersey.core.provider.AbstractMessageReaderWriterProvider; import com.sun.jersey.spi.MessageBodyWorkers; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MarshallerProvider.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/MarshallerProvider.java similarity index 95% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MarshallerProvider.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/MarshallerProvider.java index 46160a0b98a5..783ba5ab9dcd 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/MarshallerProvider.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/MarshallerProvider.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.implementation; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; @@ -9,6 +9,7 @@ import javax.xml.bind.Marshaller; import javax.xml.bind.PropertyException; + @Provider @Produces("application/atom+xml") public class MarshallerProvider implements ContextResolver { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/NamespacePrefixMapperImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/NamespacePrefixMapperImpl.java similarity index 87% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/NamespacePrefixMapperImpl.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/NamespacePrefixMapperImpl.java index 59bf4de5ca34..c2f976264210 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/NamespacePrefixMapperImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/NamespacePrefixMapperImpl.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.implementation; import com.sun.xml.bind.marshaller.NamespacePrefixMapper; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java similarity index 91% rename from microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java rename to microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java index 685012e6c3b9..9bc474980b97 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusServiceImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java @@ -1,4 +1,4 @@ -package com.microsoft.azure.services.serviceBus; +package com.microsoft.azure.services.serviceBus.implementation; import java.io.InputStream; import java.rmi.UnexpectedException; @@ -10,7 +10,11 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import com.microsoft.azure.services.serviceBus.schema.BrokerProperties; +import com.microsoft.azure.services.serviceBus.Message; +import com.microsoft.azure.services.serviceBus.Queue; +import com.microsoft.azure.services.serviceBus.QueueList; +import com.microsoft.azure.services.serviceBus.ReceiveMode; +import com.microsoft.azure.services.serviceBus.ServiceBusService; import com.microsoft.azure.services.serviceBus.schema.Entry; import com.microsoft.azure.services.serviceBus.schema.Feed; diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapperTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapperTest.java index 3cb3681acb4e..dfcab1863ad2 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapperTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapperTest.java @@ -4,8 +4,8 @@ import org.junit.Test; -import com.microsoft.azure.services.serviceBus.BrokerPropertiesMapper; -import com.microsoft.azure.services.serviceBus.schema.BrokerProperties; +import com.microsoft.azure.services.serviceBus.implementation.BrokerProperties; +import com.microsoft.azure.services.serviceBus.implementation.BrokerPropertiesMapper; public class BrokerPropertiesMapperTest { @Test diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractBuilderTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractBuilderTest.java index 1935b059e5d0..a2c97a920cb6 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractBuilderTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ContractBuilderTest.java @@ -6,6 +6,7 @@ import com.microsoft.azure.configuration.Configuration; import com.microsoft.azure.services.serviceBus.ServiceBusService; +import com.microsoft.azure.services.serviceBus.implementation.ServiceBusServiceImpl; public class ContractBuilderTest { @Test From 918b961f466a6706b0f0d0b008f14aa2d22aef12 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 3 Nov 2011 11:50:03 -0700 Subject: [PATCH 52/59] Adding ServiceBusConfiguration static class Contains string constants for property settings Provides static configure utility method for wiring user data into fully qualified uri and scope correctly --- .../serviceBus/ServiceBusConfiguration.java | 42 +++++++++++++++ .../serviceBus/IntegrationTestBase.java | 6 +-- .../ServiceBusConfigurationTest.java | 51 +++++++++++++++++++ 3 files changed, 94 insertions(+), 5 deletions(-) create mode 100644 microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusConfiguration.java create mode 100644 microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusConfigurationTest.java diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusConfiguration.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusConfiguration.java new file mode 100644 index 000000000000..25a58ad1c6fe --- /dev/null +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusConfiguration.java @@ -0,0 +1,42 @@ +package com.microsoft.azure.services.serviceBus; + +import com.microsoft.azure.configuration.Configuration; + +public class ServiceBusConfiguration { + public final static String URI = "serviceBus.uri"; + public final static String WRAP_URI = "serviceBus.wrap.uri"; + public final static String WRAP_NAME = "serviceBus.wrap.name"; + public final static String WRAP_PASSWORD = "serviceBus.wrap.password"; + public final static String WRAP_SCOPE = "serviceBus.wrap.scope"; + + public static Configuration configure(Configuration configuration, + String namespace, String authenticationName, + String authenticationPassword) { + return configure(null, configuration, namespace, authenticationName, + authenticationPassword); + } + + public static Configuration configure(String profile, Configuration configuration, + String namespace, String authenticationName, + String authenticationPassword) { + + if (profile == null) { + profile = ""; + } else if (profile.length() != 0 && !profile.endsWith(".")) { + profile = profile + "."; + } + + configuration.setProperty(profile + URI, "https://" + namespace + + ".servicebus.windows.net/"); + + configuration.setProperty(profile + WRAP_URI, "https://" + namespace + + "-sb.accesscontrol.windows.net/WRAPv0.9"); + + configuration.setProperty(profile + WRAP_NAME, authenticationName); + configuration.setProperty(profile + WRAP_PASSWORD, authenticationPassword); + configuration.setProperty(profile + WRAP_SCOPE, "http://" + namespace + + ".servicebus.windows.net/"); + + return configuration; + } +} diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java index 542609bc0828..54f01d546e47 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/IntegrationTestBase.java @@ -13,11 +13,7 @@ public abstract class IntegrationTestBase { protected Configuration createConfiguration() { Configuration config = new Configuration(); - config.setProperty("serviceBus.uri", "https://lodejard.servicebus.windows.net"); - config.setProperty("serviceBus.wrap.uri", "https://lodejard-sb.accesscontrol.windows.net/WRAPv0.9"); - config.setProperty("serviceBus.wrap.name", "owner"); - config.setProperty("serviceBus.wrap.password", "Zo3QCZ5jLlJofibEiifZyz7B3x6a5Suv2YoS1JAWopA="); - config.setProperty("serviceBus.wrap.scope", "http://lodejard.servicebus.windows.net/"); + ServiceBusConfiguration.configure(config, "lodejard", "owner", "Zo3QCZ5jLlJofibEiifZyz7B3x6a5Suv2YoS1JAWopA="); // when mock running //config.setProperty("serviceBus.uri", "http://localhost:8086"); diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusConfigurationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusConfigurationTest.java new file mode 100644 index 000000000000..f1340164e699 --- /dev/null +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusConfigurationTest.java @@ -0,0 +1,51 @@ +package com.microsoft.azure.services.serviceBus; + +import static org.junit.Assert.*; + +import org.junit.Test; + +import com.microsoft.azure.configuration.Configuration; + +public class ServiceBusConfigurationTest { + @Test + public void ConfigureSetsExpectedProperties() { + // Arrange + Configuration config = new Configuration(); + + // Act + ServiceBusConfiguration.configure(config, "alpha", "beta", "gamma"); + + // Assert + assertEquals("https://alpha.servicebus.windows.net/", + config.getProperty("serviceBus.uri")); + assertEquals("https://alpha-sb.accesscontrol.windows.net/WRAPv0.9", + config.getProperty("serviceBus.wrap.uri")); + assertEquals("beta", + config.getProperty("serviceBus.wrap.name")); + assertEquals("gamma", + config.getProperty("serviceBus.wrap.password")); + assertEquals("http://alpha.servicebus.windows.net/", + config.getProperty("serviceBus.wrap.scope")); + } + + @Test + public void UsingProfileAddsPrefix() { + // Arrange + Configuration config = new Configuration(); + + // Act + ServiceBusConfiguration.configure("backup", config, "alpha", "beta", "gamma"); + + // Assert + assertEquals("https://alpha.servicebus.windows.net/", + config.getProperty("backup.serviceBus.uri")); + assertEquals("https://alpha-sb.accesscontrol.windows.net/WRAPv0.9", + config.getProperty("backup.serviceBus.wrap.uri")); + assertEquals("beta", + config.getProperty("backup.serviceBus.wrap.name")); + assertEquals("gamma", + config.getProperty("backup.serviceBus.wrap.password")); + assertEquals("http://alpha.servicebus.windows.net/", + config.getProperty("backup.serviceBus.wrap.scope")); + } +} From 9a41bac1926f61f6312cf52732bae0e454dbe676 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 3 Nov 2011 12:30:38 -0700 Subject: [PATCH 53/59] Relocating generated datacontract classes Moving from serviceBus.schema to serviceBus.implementation --- .../java/com/microsoft/azure/services/serviceBus/Queue.java | 6 +++--- .../azure/services/serviceBus/ServiceBusService.java | 4 ++-- .../services/serviceBus/implementation/EntryModel.java | 2 +- .../serviceBus/implementation/EntryModelProvider.java | 2 +- .../serviceBus/implementation/ServiceBusServiceImpl.java | 4 ++-- microsoft-azure-api/src/main/resources/package-names.xjb | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java index 4a0d4c9c2874..70d226c8677b 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java @@ -4,11 +4,11 @@ import javax.ws.rs.core.MediaType; import javax.xml.datatype.Duration; +import com.microsoft.azure.services.serviceBus.implementation.Content; +import com.microsoft.azure.services.serviceBus.implementation.Entry; import com.microsoft.azure.services.serviceBus.implementation.EntryModel; -import com.microsoft.azure.services.serviceBus.schema.Content; -import com.microsoft.azure.services.serviceBus.schema.Entry; +import com.microsoft.azure.services.serviceBus.implementation.QueueDescription; -import com.microsoft.azure.services.serviceBus.schema.QueueDescription; public class Queue extends EntryModel { diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java index b8f6632bff0b..d51361ca4bf6 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/ServiceBusService.java @@ -1,7 +1,7 @@ package com.microsoft.azure.services.serviceBus; -import com.microsoft.azure.services.serviceBus.schema.Entry; -import com.microsoft.azure.services.serviceBus.schema.Feed; +import com.microsoft.azure.services.serviceBus.implementation.Entry; +import com.microsoft.azure.services.serviceBus.implementation.Feed; import com.microsoft.azure.ServiceException; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/EntryModel.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/EntryModel.java index 5032acc33b22..57abc5cc9cb4 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/EntryModel.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/EntryModel.java @@ -1,6 +1,6 @@ package com.microsoft.azure.services.serviceBus.implementation; -import com.microsoft.azure.services.serviceBus.schema.Entry; +import com.microsoft.azure.services.serviceBus.implementation.Entry; public class EntryModel { Entry entry; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/EntryModelProvider.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/EntryModelProvider.java index 03f9c1df0931..5b271faeebfb 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/EntryModelProvider.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/EntryModelProvider.java @@ -14,7 +14,7 @@ import javax.ws.rs.ext.MessageBodyWriter; import com.microsoft.azure.services.serviceBus.Queue; -import com.microsoft.azure.services.serviceBus.schema.Entry; +import com.microsoft.azure.services.serviceBus.implementation.Entry; import com.sun.jersey.core.provider.AbstractMessageReaderWriterProvider; import com.sun.jersey.spi.MessageBodyWorkers; diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java index 9bc474980b97..90ad46d4623e 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java @@ -15,8 +15,8 @@ import com.microsoft.azure.services.serviceBus.QueueList; import com.microsoft.azure.services.serviceBus.ReceiveMode; import com.microsoft.azure.services.serviceBus.ServiceBusService; -import com.microsoft.azure.services.serviceBus.schema.Entry; -import com.microsoft.azure.services.serviceBus.schema.Feed; +import com.microsoft.azure.services.serviceBus.implementation.Entry; +import com.microsoft.azure.services.serviceBus.implementation.Feed; import com.microsoft.azure.ServiceException; import com.microsoft.azure.auth.wrap.WrapFilter; diff --git a/microsoft-azure-api/src/main/resources/package-names.xjb b/microsoft-azure-api/src/main/resources/package-names.xjb index 06c4a48b9db2..94ff16dbb261 100644 --- a/microsoft-azure-api/src/main/resources/package-names.xjb +++ b/microsoft-azure-api/src/main/resources/package-names.xjb @@ -6,12 +6,12 @@ jaxb:extensionBindingPrefixes="xjc"> - + - + From 5aea356e730697c0c7e852839a5d222c71c8e9e5 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 3 Nov 2011 14:46:28 -0700 Subject: [PATCH 54/59] Add all BrokerProperties. closes #2 Provides serialization/deserialization for all brokered message properties get/set properties projected onto Message class Values that are only returned by server will only have get property --- .../azure/services/serviceBus/Message.java | 146 ++++++++++++++++-- .../implementation/BrokerProperties.java | 134 +++++++++++++++- .../BrokerPropertiesMapperTest.java | 78 ++++++++++ 3 files changed, 336 insertions(+), 22 deletions(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java index 2e4a0ef6f450..4e1a3c472d0a 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java @@ -2,12 +2,15 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; +import java.util.Date; import com.microsoft.azure.services.serviceBus.implementation.BrokerProperties; public class Message { BrokerProperties properties; InputStream body; + String contentType; + Date date; public Message() { this.properties = new BrokerProperties(); @@ -33,29 +36,144 @@ public Message(String body) { this.body = body; } - /** - * @return the brokerProperties - */ public BrokerProperties getProperties() { return properties; } - /** - * @param properties the brokerProperties to set - */ - public void setProperties(BrokerProperties properties) { + public Message setProperties(BrokerProperties properties) { this.properties = properties; + return this; } - /** - * @return the body - */ + public InputStream getBody() { return body; } - /** - * @param body the body to set - */ - public void setBody(InputStream body) { + + public Message setBody(InputStream body) { this.body = body; + return this; + } + + public String getContentType() { + return contentType; + } + + public Message setContentType(String contentType) { + this.contentType = contentType; + return this; + } + + public Date getDate() { + return date; + } + + public Message setDate(Date date) { + this.date = date; + return this; + } + + public Integer getDeliveryCount() { + return properties.getDeliveryCount(); + } + + public String getMessageId() { + return properties.getMessageId(); + } + + public Message setMessageId(String messageId) { + properties.setMessageId(messageId); + return this; + } + + public Long getSequenceNumber() { + return properties.getSequenceNumber(); + } + + public Long getTimeToLive() { + return properties.getTimeToLive(); + } + + public Message setTimeToLive(Long timeToLive) { + properties.setTimeToLive(timeToLive); + return this; + } + + public String getLockToken() { + return properties.getLockToken(); + } + + public Date getLockedUntilUtc() { + return properties.getLockedUntilUtc(); + } + + public String getCorrelationId() { + return properties.getCorrelationId(); + } + + public Message setCorrelationId(String correlationId) { + properties.setCorrelationId(correlationId); + return this; + } + + public String getSessionId() { + return properties.getSessionId(); + } + + public Message setSessionId(String sessionId) { + properties.setSessionId(sessionId); + return this; + } + + public String getLabel() { + return properties.getLabel(); + } + + public Message setLabel(String label) { + properties.setLabel(label); + return this; + } + + public String getReplyTo() { + return properties.getReplyTo(); + } + + public Message setReplyTo(String replyTo) { + properties.setReplyTo(replyTo); + return this; + } + + public String getTo() { + return properties.getTo(); + } + + public Message setTo(String to) { + properties.setTo(to); + return this; + } + + public Date getScheduledEnqueueTimeUtc() { + return properties.getScheduledEnqueueTimeUtc(); + } + + public Message setScheduledEnqueueTimeUtc(Date scheduledEnqueueTimeUtc) { + properties.setScheduledEnqueueTimeUtc(scheduledEnqueueTimeUtc); + return this; + } + + public String getReplyToSessionId() { + return properties.getReplyToSessionId(); + } + + public Message setReplyToSessionId(String replyToSessionId) { + properties.setReplyToSessionId(replyToSessionId); + return this; + } + + public String getMessageLocation() { + return properties.getMessageLocation(); + } + + public String getLockLocation() { + return properties.getLockLocation(); } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/BrokerProperties.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/BrokerProperties.java index b38a84f900f5..f19c340e7c58 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/BrokerProperties.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/BrokerProperties.java @@ -1,31 +1,68 @@ package com.microsoft.azure.services.serviceBus.implementation; +import java.util.Date; + import org.codehaus.jackson.annotate.JsonGetter; import org.codehaus.jackson.annotate.JsonIgnore; import org.codehaus.jackson.annotate.JsonIgnoreProperties; import org.codehaus.jackson.annotate.JsonProperty; import org.codehaus.jackson.annotate.JsonWriteNullProperties; + +// +// members of this class defined per specification at +// http://msdn.microsoft.com/en-us/library/windowsazure/hh367521.aspx#BKMK_REST3prod +// + @JsonIgnoreProperties(ignoreUnknown=true) @JsonWriteNullProperties(false) public class BrokerProperties { + + @JsonProperty("CorrelationId") + String correlationId; + + @JsonProperty("SessionId") + String sessionId; + @JsonProperty("DeliveryCount") Integer deliveryCount; + @JsonProperty("LockedUntil") + Date lockedUntilUtc; + + @JsonProperty("LockToken") + String lockToken; + @JsonProperty("MessageId") String messageId; + @JsonProperty("Label") + String label; + + @JsonProperty("ReplyTo") + String replyTo; + @JsonProperty("SequenceNumber") Long sequenceNumber; - + @JsonProperty("TimeToLive") Long timeToLive; - @JsonProperty("LockToken") - String lockToken; - - @JsonProperty("LockedUntilUtc") - String lockedUntilUtc; + @JsonProperty("To") + String to; + + @JsonProperty("ScheduledEnqueueTimeUtc") + Date scheduledEnqueueTimeUtc; + + @JsonProperty("ReplyToSessionId") + String replyToSessionId; + + @JsonProperty("MessageLocation") + String messageLocation; + + @JsonProperty("LockLocation") + String lockLocation; + @JsonIgnore @@ -74,13 +111,94 @@ public void setLockToken(String lockToken) { } @JsonIgnore - public String getLockedUntilUtc() { + public Date getLockedUntilUtc() { return lockedUntilUtc; } - public void setLockedUntilUtc(String lockedUntilUtc) { + public void setLockedUntilUtc(Date lockedUntilUtc) { this.lockedUntilUtc = lockedUntilUtc; } + @JsonIgnore + public String getCorrelationId() { + return correlationId; + } + + public void setCorrelationId(String correlationId) { + this.correlationId = correlationId; + } + + @JsonIgnore + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + @JsonIgnore + public String getLabel() { + return label; + } + + public void setLabel(String label) { + this.label = label; + } + + @JsonIgnore + public String getReplyTo() { + return replyTo; + } + + public void setReplyTo(String replyTo) { + this.replyTo = replyTo; + } + + @JsonIgnore + public String getTo() { + return to; + } + + public void setTo(String to) { + this.to = to; + } + + @JsonIgnore + public Date getScheduledEnqueueTimeUtc() { + return scheduledEnqueueTimeUtc; + } + + public void setScheduledEnqueueTimeUtc(Date scheduledEnqueueTimeUtc) { + this.scheduledEnqueueTimeUtc = scheduledEnqueueTimeUtc; + } + + @JsonIgnore + public String getReplyToSessionId() { + return replyToSessionId; + } + + public void setReplyToSessionId(String replyToSessionId) { + this.replyToSessionId = replyToSessionId; + } + + @JsonIgnore + public String getMessageLocation() { + return messageLocation; + } + + public void setMessageLocation(String messageLocation) { + this.messageLocation = messageLocation; + } + + @JsonIgnore + public String getLockLocation() { + return lockLocation; + } + + public void setLockLocation(String lockLocation) { + this.lockLocation = lockLocation; + } + } diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapperTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapperTest.java index dfcab1863ad2..6ed6d22fff4e 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapperTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapperTest.java @@ -2,6 +2,11 @@ import static org.junit.Assert.*; +import java.util.Calendar; +import java.util.Date; +import java.util.TimeZone; + +import org.codehaus.jackson.annotate.JsonProperty; import org.junit.Test; import com.microsoft.azure.services.serviceBus.implementation.BrokerProperties; @@ -26,6 +31,7 @@ public void jsonStringMapsToBrokerPropertiesObject(){ public void nonDefaultPropertiesMapToJsonString(){ // Arrange BrokerPropertiesMapper mapper = new BrokerPropertiesMapper(); + // Act BrokerProperties properties = new BrokerProperties(); properties.setMessageId("foo"); @@ -36,4 +42,76 @@ public void nonDefaultPropertiesMapToJsonString(){ assertNotNull(json); assertEquals("{\"DeliveryCount\":7,\"MessageId\":\"foo\"}", json); } + + @Test + public void deserializingAllPossibleValues() { + // Arrange + BrokerPropertiesMapper mapper = new BrokerPropertiesMapper(); + + Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + calendar.set(1994, 10, 6, 8, 49, 37); + Date schedTimeUtc = calendar.getTime(); + + Calendar calendar2 = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + calendar2.set(2011, 9, 14, 12, 34, 56); + Date lockedUntilUtc = calendar2.getTime(); + + // Act + BrokerProperties properties = mapper.fromString( + "{"+ + "\"CorrelationId\": \"corid\","+ + "\"SessionId\": \"sesid\","+ + "\"DeliveryCount\": 5,"+ + "\"LockedUntil\": \" Fri, 14 Oct 2011 12:34:56 GMT\","+ + "\"LockToken\": \"loctok\","+ + "\"MessageId\": \"mesid\","+ + "\"Label\": \"lab\","+ + "\"ReplyTo\": \"repto\","+ + "\"SequenceNumber\": 7,"+ + "\"TimeToLive\": 8,"+ + "\"To\": \"to\","+ + "\"ScheduledEnqueueTimeUtc\": \" Sun, 06 Nov 1994 08:49:37 GMT\","+ + "\"ReplyToSessionId\": \"reptosesid\","+ + "\"MessageLocation\": \"mesloc\","+ + "\"LockLocation\": \"locloc\""+ + "}"); + + + + // Assert + assertNotNull(properties); + + long lockedUntilDelta = properties.getLockedUntilUtc().getTime() - lockedUntilUtc.getTime(); + long schedTimeDelta = properties.getScheduledEnqueueTimeUtc().getTime() - schedTimeUtc.getTime(); + + assertEquals("corid", properties.getCorrelationId()); + assertEquals("sesid", properties.getSessionId()); + assertEquals(5, (int)properties.getDeliveryCount()); + assertTrue(Math.abs(lockedUntilDelta) < 500); + assertEquals("loctok", properties.getLockToken()); + assertEquals("mesid", properties.getMessageId()); + assertEquals("lab", properties.getLabel()); + assertEquals("repto", properties.getReplyTo()); + assertEquals(7, (long)properties.getSequenceNumber()); + assertEquals(8, (long)properties.getTimeToLive()); + assertEquals("to", properties.getTo()); + assertTrue(Math.abs(schedTimeDelta) < 500); + assertEquals("reptosesid", properties.getReplyToSessionId()); + assertEquals("mesloc", properties.getMessageLocation()); + assertEquals("locloc", properties.getLockLocation()); + } + + @Test + public void missingDatesDeserializeAsNull() + { + // Arrange + BrokerPropertiesMapper mapper = new BrokerPropertiesMapper(); + + // Act + BrokerProperties properties = mapper.fromString("{}"); + + // Assert + assertNull(properties.getLockedUntilUtc()); + assertNull(properties.getScheduledEnqueueTimeUtc()); + } } From f92031ca13177bc6aedc97e998b57ba5fffb11dc Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 3 Nov 2011 16:18:36 -0700 Subject: [PATCH 55/59] Updating BrokerProperties and Message properties json field is named LockedUntilUtc TimeToLive is floating-point --- .../azure/services/serviceBus/Message.java | 4 +- .../azure/services/serviceBus/Queue.java | 26 +++++---- .../implementation/BrokerProperties.java | 8 +-- .../BrokerPropertiesMapperTest.java | 6 +- .../serviceBus/ServiceBusIntegrationTest.java | 56 +++++++++++++++++-- 5 files changed, 77 insertions(+), 23 deletions(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java index 4e1a3c472d0a..43d95f107b03 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Message.java @@ -89,11 +89,11 @@ public Long getSequenceNumber() { return properties.getSequenceNumber(); } - public Long getTimeToLive() { + public Double getTimeToLive() { return properties.getTimeToLive(); } - public Message setTimeToLive(Long timeToLive) { + public Message setTimeToLive(Double timeToLive) { properties.setTimeToLive(timeToLive); return this; } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java index 70d226c8677b..e1a57beda00f 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/Queue.java @@ -23,7 +23,6 @@ public Queue(Entry entry) { super(entry, entry.getContent().getQueueDescription()); } - public String getName() { return getEntry().getTitle(); } @@ -51,11 +50,19 @@ public Queue setMaxSizeInMegabytes(Long value) { return this; } + public Boolean isRequiresDuplicateDetection() { + return getModel().isRequiresDuplicateDetection(); + } + public Queue setRequiresDuplicateDetection(Boolean value) { getModel().setRequiresDuplicateDetection(value); return this; } + public Boolean isRequiresSession() { + return getModel().isRequiresSession(); + } + public Queue setRequiresSession(Boolean value) { getModel().setRequiresSession(value); return this; @@ -70,6 +77,10 @@ public Queue setDefaultMessageTimeToLive(Duration value) { return this; } + public Boolean isDeadLetteringOnMessageExpiration() { + return getModel().isDeadLetteringOnMessageExpiration(); + } + public Queue setDeadLetteringOnMessageExpiration(Boolean value) { getModel().setDeadLetteringOnMessageExpiration(value); return this; @@ -93,6 +104,10 @@ public Queue setMaxDeliveryCount(Integer value) { return this; } + public Boolean isEnableBatchedOperations() { + return getModel().isEnableBatchedOperations(); + } + public Queue setEnableBatchedOperations(Boolean value) { getModel().setEnableBatchedOperations(value); return this; @@ -102,17 +117,8 @@ public Long getSizeInBytes() { return getModel().getSizeInBytes(); } - public Queue setSizeInBytes(Long value) { - getModel().setSizeInBytes(value); - return this; - } - public Long getMessageCount() { return getModel().getMessageCount(); } - public Queue setMessageCount(Long value) { - getModel().setMessageCount(value); - return this; - } } diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/BrokerProperties.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/BrokerProperties.java index f19c340e7c58..860e788ffc98 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/BrokerProperties.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/BrokerProperties.java @@ -27,7 +27,7 @@ public class BrokerProperties { @JsonProperty("DeliveryCount") Integer deliveryCount; - @JsonProperty("LockedUntil") + @JsonProperty("LockedUntilUtc") Date lockedUntilUtc; @JsonProperty("LockToken") @@ -46,7 +46,7 @@ public class BrokerProperties { Long sequenceNumber; @JsonProperty("TimeToLive") - Long timeToLive; + Double timeToLive; @JsonProperty("To") String to; @@ -93,11 +93,11 @@ public void setSequenceNumber(Long sequenceNumber) { } @JsonIgnore - public Long getTimeToLive() { + public Double getTimeToLive() { return timeToLive; } - public void setTimeToLive(Long timeToLive) { + public void setTimeToLive(Double timeToLive) { this.timeToLive = timeToLive; } diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapperTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapperTest.java index 6ed6d22fff4e..12c6820eba34 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapperTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/BrokerPropertiesMapperTest.java @@ -62,13 +62,13 @@ public void deserializingAllPossibleValues() { "\"CorrelationId\": \"corid\","+ "\"SessionId\": \"sesid\","+ "\"DeliveryCount\": 5,"+ - "\"LockedUntil\": \" Fri, 14 Oct 2011 12:34:56 GMT\","+ + "\"LockedUntilUtc\": \" Fri, 14 Oct 2011 12:34:56 GMT\","+ "\"LockToken\": \"loctok\","+ "\"MessageId\": \"mesid\","+ "\"Label\": \"lab\","+ "\"ReplyTo\": \"repto\","+ "\"SequenceNumber\": 7,"+ - "\"TimeToLive\": 8,"+ + "\"TimeToLive\": 8.123,"+ "\"To\": \"to\","+ "\"ScheduledEnqueueTimeUtc\": \" Sun, 06 Nov 1994 08:49:37 GMT\","+ "\"ReplyToSessionId\": \"reptosesid\","+ @@ -93,7 +93,7 @@ public void deserializingAllPossibleValues() { assertEquals("lab", properties.getLabel()); assertEquals("repto", properties.getReplyTo()); assertEquals(7, (long)properties.getSequenceNumber()); - assertEquals(8, (long)properties.getTimeToLive()); + assertEquals(8.123, properties.getTimeToLive(), .001); assertEquals("to", properties.getTo()); assertTrue(Math.abs(schedTimeDelta) < 500); assertEquals("reptosesid", properties.getReplyToSessionId()); diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java index 1b23e338b39c..f2e8a833bb39 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java @@ -1,6 +1,9 @@ package com.microsoft.azure.services.serviceBus; import java.util.Arrays; +import java.util.Date; + +import javax.sound.sampled.ReverbType; import org.junit.Before; import org.junit.Test; @@ -79,10 +82,11 @@ public void sendMessageWorks() throws Exception { @Test public void receiveMessageWorks() throws Exception { // Arrange - service.sendMessage("TestAlpha", new Message("Hello World")); + service.createQueue(new Queue().setName("TestReceiveMessageWorks")); + service.sendMessage("TestReceiveMessageWorks", new Message("Hello World")); // Act - Message message = service.receiveMessage("TestAlpha", 500, ReceiveMode.RECEIVE_AND_DELETE); + Message message = service.receiveMessage("TestReceiveMessageWorks", 500, ReceiveMode.RECEIVE_AND_DELETE); byte[] data = new byte[100]; int size = message.getBody().read(data); @@ -94,10 +98,11 @@ public void receiveMessageWorks() throws Exception { @Test public void peekLockMessageWorks() throws Exception { // Arrange - service.sendMessage("TestAlpha", new Message("Hello Again")); + service.createQueue(new Queue().setName("TestPeekLockMessageWorks")); + service.sendMessage("TestPeekLockMessageWorks", new Message("Hello Again")); // Act - Message message = service.receiveMessage("TestAlpha", 500, ReceiveMode.PEEK_LOCK); + Message message = service.receiveMessage("TestPeekLockMessageWorks", 500, ReceiveMode.PEEK_LOCK); // Assert byte[] data = new byte[100]; @@ -105,4 +110,47 @@ public void peekLockMessageWorks() throws Exception { assertEquals(11, size); assertEquals("Hello Again", new String(data, 0, size)); } + + @Test + public void peekLockedMessageCanBeCompleted() throws Exception { + // Arrange + service.createQueue(new Queue().setName("TestPeekLockedMessageCanBeCompleted")); + service.sendMessage("TestPeekLockedMessageCanBeCompleted", new Message("Hello Again")); + Message message = service.receiveMessage("TestPeekLockedMessageCanBeCompleted", 1500, ReceiveMode.PEEK_LOCK); + + // Act + String lockToken = message.getLockToken(); + Date lockedUntil = message.getLockedUntilUtc(); + String lockLocation = message.getLockLocation(); + + service.completeMessage(message); + + // Assert + assertNotNull(lockToken); + assertNotNull(lockedUntil); + assertNotNull(lockLocation); + } + + @Test + public void peekLockedMessageCanBeAbandoned() throws Exception { + // Arrange + service.createQueue(new Queue().setName("TestPeekLockedMessageCanBeAbandoned")); + service.sendMessage("TestPeekLockedMessageCanBeAbandoned", new Message("Hello Again")); + Message peekedMessage = service.receiveMessage("TestPeekLockedMessageCanBeAbandoned", 1500, ReceiveMode.PEEK_LOCK); + + // Act + String lockToken = peekedMessage.getLockToken(); + Date lockedUntil = peekedMessage.getLockedUntilUtc(); + + service.abandonMessage(peekedMessage); + Message receivedMessage = service.receiveMessage("TestPeekLockedMessageCanBeAbandoned", 1500, ReceiveMode.RECEIVE_AND_DELETE); + + + // Assert + assertNotNull(lockToken); + assertNotNull(lockedUntil); + assertNull(receivedMessage.getLockToken()); + assertNull(receivedMessage.getLockedUntilUtc()); + + } } From c09647f8b108deddda423297f1d04b20295d184b Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 3 Nov 2011 16:44:30 -0700 Subject: [PATCH 56/59] Attempting to implement abandonMessage to release lock Should this really be "deleteLock" or "deleteMessageLock"? --- .../implementation/ServiceBusServiceImpl.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java index 90ad46d4623e..a25eac4c266f 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java @@ -135,8 +135,17 @@ public Message receiveMessage(String topicPath, String subscriptionName, } public void abandonMessage(Message message) throws ServiceException { - // TODO Auto-generated method stub - + try { + getChannel() + .resource(message.getLockLocation()) + .delete(); + } + catch(UniformInterfaceException e) { + throw processCatch(new ServiceException(e)); + } + catch(ClientHandlerException e) { + throw processCatch(new ServiceException(e)); + } } public void completeMessage(Message message) throws ServiceException { From 2acca42f9156bebf6699064d29ba90859e967ba7 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Fri, 4 Nov 2011 09:55:34 -0700 Subject: [PATCH 57/59] Adding additional Message http headers Hardens the processing of BrokerProperties Takes the Date, ContentType, and Location http header into Message DTO --- .../implementation/ServiceBusServiceImpl.java | 25 ++++++++++++++++--- .../serviceBus/ServiceBusIntegrationTest.java | 5 ++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java index a25eac4c266f..79b0133d02fe 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java @@ -3,9 +3,11 @@ import java.io.InputStream; import java.rmi.UnexpectedException; import java.util.ArrayList; +import java.util.Date; import javax.inject.Inject; import javax.inject.Named; +import javax.ws.rs.core.MediaType; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -65,12 +67,12 @@ private ServiceException processCatch(ServiceException e) { return ServiceExceptionFactory.process("serviceBus", e); } - // REVIEW: contentType will be needed public void sendMessage(String path, Message message) throws ServiceException { try { getResource() .path(path) .path("messages") + .type(message.getContentType()) .header("BrokerProperties", mapper.toString(message.getProperties())) .post(message.getBody()); } @@ -121,9 +123,26 @@ else if (receiveMode == ReceiveMode.PEEK_LOCK) { throw new RuntimeException("Unknown ReceiveMode"); } - // REVIEW: harden this - it's much too brittle. throws null exceptions very easily + String brokerProperties = clientResult.getHeaders().getFirst("BrokerProperties"); + String location = clientResult.getHeaders().getFirst("Location"); + MediaType contentType = clientResult.getType(); + Date date = clientResult.getResponseDate(); + + Message result = new Message(); - result.setProperties(mapper.fromString(clientResult.getHeaders().getFirst("BrokerProperties"))); + if (brokerProperties != null) + { + result.setProperties(mapper.fromString(brokerProperties)); + } + if (contentType != null) + { + result.setContentType(clientResult.toString()); + } + if (location != null) + { + result.getProperties().setLockLocation(location); + } + result.setDate(date); result.setBody(clientResult.getEntityInputStream()); return result; } diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java index f2e8a833bb39..425c131a52e0 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java @@ -153,4 +153,9 @@ public void peekLockedMessageCanBeAbandoned() throws Exception { assertNull(receivedMessage.getLockedUntilUtc()); } + + @Test + public void contentTypePassesThrough() throws Exception { + assertTrue(false); + } } From 9131c89fb00dc7a563b06840411375b75cc31c39 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Fri, 4 Nov 2011 10:19:14 -0700 Subject: [PATCH 58/59] Taking into account messages made with null values --- .../implementation/ServiceBusServiceImpl.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java index 79b0133d02fe..8a7af6f5f644 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java @@ -69,12 +69,17 @@ private ServiceException processCatch(ServiceException e) { public void sendMessage(String path, Message message) throws ServiceException { try { - getResource() + WebResource resource = getResource() .path(path) - .path("messages") - .type(message.getContentType()) - .header("BrokerProperties", mapper.toString(message.getProperties())) - .post(message.getBody()); + .path("messages"); + + if (message.getContentType() != null) + resource.type(message.getContentType()); + + if (message.getProperties() != null) + resource.header("BrokerProperties", mapper.toString(message.getProperties())); + + resource.post(message.getBody()); } catch(UniformInterfaceException e) { throw processCatch(new ServiceException(e)); From b1336ad5e8eecb5a09305463417926c47c3198fe Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Fri, 4 Nov 2011 10:27:47 -0700 Subject: [PATCH 59/59] Fixing bug in how content type was moved from response to Message --- .../implementation/ServiceBusServiceImpl.java | 14 ++++++++------ .../serviceBus/ServiceBusIntegrationTest.java | 14 +++++++++++++- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java index 8a7af6f5f644..5dd895000d10 100644 --- a/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java +++ b/microsoft-azure-api/src/main/java/com/microsoft/azure/services/serviceBus/implementation/ServiceBusServiceImpl.java @@ -28,6 +28,7 @@ import com.sun.jersey.api.client.ClientResponse; import com.sun.jersey.api.client.UniformInterfaceException; import com.sun.jersey.api.client.WebResource; +import com.sun.jersey.api.client.WebResource.Builder; public class ServiceBusServiceImpl implements ServiceBusService { @@ -69,17 +70,18 @@ private ServiceException processCatch(ServiceException e) { public void sendMessage(String path, Message message) throws ServiceException { try { - WebResource resource = getResource() + Builder request = getResource() .path(path) - .path("messages"); + .path("messages") + .getRequestBuilder(); if (message.getContentType() != null) - resource.type(message.getContentType()); + request = request.type(message.getContentType()); if (message.getProperties() != null) - resource.header("BrokerProperties", mapper.toString(message.getProperties())); + request = request.header("BrokerProperties", mapper.toString(message.getProperties())); - resource.post(message.getBody()); + request.post(message.getBody()); } catch(UniformInterfaceException e) { throw processCatch(new ServiceException(e)); @@ -141,7 +143,7 @@ else if (receiveMode == ReceiveMode.PEEK_LOCK) { } if (contentType != null) { - result.setContentType(clientResult.toString()); + result.setContentType(contentType.toString()); } if (location != null) { diff --git a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java index 425c131a52e0..48817ad64bd9 100644 --- a/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java +++ b/microsoft-azure-api/src/test/java/com/microsoft/azure/services/serviceBus/ServiceBusIntegrationTest.java @@ -156,6 +156,18 @@ public void peekLockedMessageCanBeAbandoned() throws Exception { @Test public void contentTypePassesThrough() throws Exception { - assertTrue(false); + // Arrange + service.createQueue(new Queue().setName("TestContentTypePassesThrough")); + + // Act + service.sendMessage("TestContentTypePassesThrough", + new Message("Hello Again").setContentType("text/xml")); + + Message message = service.receiveMessage("TestContentTypePassesThrough", 1500, ReceiveMode.RECEIVE_AND_DELETE); + + + // Assert + assertNotNull(message); + assertEquals("text/xml", message.getContentType()); } }