Skip to content

Commit

Permalink
Merge pull request Azure#122 from loudej/message-properties
Browse files Browse the repository at this point in the history
Updating serviceBus to map custom properties. Fixes Azure#72
  • Loading branch information
rpaquay committed Nov 28, 2011
2 parents 80159b8 + 81641be commit 432199e
Show file tree
Hide file tree
Showing 4 changed files with 360 additions and 57 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
package com.microsoft.windowsazure.services.serviceBus.implementation;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import java.util.UUID;

public class CustomPropertiesMapper {
// Fri, 04 Mar 2011 08:49:37 GMT
private static final String RFC_1123 = "EEE, dd MMM yyyy HH:mm:ss zzz";

public String toString(Object value) {
if (value == null) {
return null;
}

Class<? extends Object> type = value.getClass();
if (type == Byte.class) {
return value.toString() + ";byte";
}
else if (type == Character.class) {
return value.toString() + ";char";
}
else if (type == Short.class) {
return value.toString() + ";short";
}
else if (type == Integer.class) {
return value.toString() + ";int";
}
else if (type == Long.class) {
return value.toString() + ";long";
}
else if (type == Float.class) {
return value.toString() + ";float";
}
else if (type == Double.class) {
return value.toString() + ";double";
}
else if (type == Boolean.class) {
return value.toString() + ";bool";
}
else if (type == UUID.class) {
return value.toString() + ";uuid";
}
else if (Calendar.class.isAssignableFrom(type)) {
DateFormat format = new SimpleDateFormat(RFC_1123);
Calendar calendar = (Calendar) value;
format.setTimeZone(calendar.getTimeZone());
String formatted = format.format(calendar.getTime());
return formatted + ";date";
}
else if (Date.class.isAssignableFrom(type)) {
DateFormat format = new SimpleDateFormat(RFC_1123);
format.setTimeZone(TimeZone.getTimeZone("GMT"));
String formatted = format.format((Date) value);
return formatted + ";date";
}
else {
return value.toString();
}
}

public Object fromString(String value) throws ParseException {
if (value == null) {
return null;
}

if (value.endsWith(";byte")) {
return Byte.parseByte(value.substring(0, value.length() - ";byte".length()));
}
else if (value.endsWith(";char") && value.length() == "X;char".length()) {
return new Character(value.charAt(0));
}
else if (value.endsWith(";short")) {
return Short.parseShort(value.substring(0, value.length() - ";short".length()));
}
else if (value.endsWith(";int")) {
return Integer.parseInt(value.substring(0, value.length() - ";int".length()));
}
else if (value.endsWith(";long")) {
return Long.parseLong(value.substring(0, value.length() - ";long".length()));
}
else if (value.endsWith(";float")) {
return Float.parseFloat(value.substring(0, value.length() - ";float".length()));
}
else if (value.endsWith(";double")) {
return Double.parseDouble(value.substring(0, value.length() - ";double".length()));
}
else if (value.endsWith(";bool")) {
return Boolean.parseBoolean(value.substring(0, value.length() - ";bool".length()));
}
else if (value.endsWith(";uuid")) {
return UUID.fromString(value.substring(0, value.length() - ";uuid".length()));
}
else if (value.endsWith(";date")) {
SimpleDateFormat format = new SimpleDateFormat(RFC_1123);
return format.parse(value.substring(0, value.length() - ";date".length()));
}
else {
return value;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.microsoft.windowsazure.services.serviceBus.implementation;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
Expand Down Expand Up @@ -51,6 +52,7 @@ public class ServiceBusRestProxy implements ServiceBusContract {
private Client channel;
private final String uri;
private final BrokerPropertiesMapper mapper;
private final CustomPropertiesMapper customPropertiesMapper;
static Log log = LogFactory.getLog(ServiceBusContract.class);

ServiceFilter[] filters;
Expand All @@ -63,6 +65,7 @@ public ServiceBusRestProxy(Client channel, @Named("serviceBus") WrapFilter authF
this.filters = new ServiceFilter[0];
this.uri = uri;
this.mapper = mapper;
this.customPropertiesMapper = new CustomPropertiesMapper();
channel.addFilter(authFilter);
}

Expand All @@ -71,6 +74,7 @@ public ServiceBusRestProxy(Client channel, ServiceFilter[] filters, String uri,
this.filters = filters;
this.uri = uri;
this.mapper = mapper;
this.customPropertiesMapper = new CustomPropertiesMapper();
}

@Override
Expand Down Expand Up @@ -103,8 +107,12 @@ public void sendMessage(String path, BrokeredMessage message) {
if (message.getContentType() != null)
request = request.type(message.getContentType());

if (message.getProperties() != null)
request = request.header("BrokerProperties", mapper.toString(message.getProperties()));
if (message.getBrokerProperties() != null)
request = request.header("BrokerProperties", mapper.toString(message.getBrokerProperties()));

for (java.util.Map.Entry<String, Object> entry : message.getProperties().entrySet()) {
request.header(entry.getKey(), customPropertiesMapper.toString(entry.getValue()));
}

request.post(message.getBody());
}
Expand Down Expand Up @@ -159,23 +167,41 @@ else if (options.isPeekLock()) {
throw new RuntimeException("Unknown ReceiveMode");
}

String brokerProperties = clientResult.getHeaders().getFirst("BrokerProperties");
String location = clientResult.getHeaders().getFirst("Location");
MediaType contentType = clientResult.getType();
Date date = clientResult.getResponseDate();
BrokerProperties brokerProperties;
if (clientResult.getHeaders().containsKey("BrokerProperties")) {
brokerProperties = mapper.fromString(clientResult.getHeaders().getFirst("BrokerProperties"));
}
else {
brokerProperties = new BrokerProperties();
}

BrokeredMessage message = new BrokeredMessage();
if (brokerProperties != null) {
message.setProperties(mapper.fromString(brokerProperties));
String location = clientResult.getHeaders().getFirst("Location");
if (location != null) {
brokerProperties.setLockLocation(location);
}

BrokeredMessage message = new BrokeredMessage(brokerProperties);

MediaType contentType = clientResult.getType();
if (contentType != null) {
message.setContentType(contentType.toString());
}
if (location != null) {
message.getProperties().setLockLocation(location);

Date date = clientResult.getResponseDate();
if (date != null) {
message.setDate(date);
}
message.setDate(date);
message.setBody(clientResult.getEntityInputStream());

InputStream body = clientResult.getEntityInputStream();
if (body != null) {
message.setBody(body);
}

for (String key : clientResult.getHeaders().keySet()) {
Object value = clientResult.getHeaders().getFirst(key);
message.setProperty(key, value);
}

return message;
}

Expand Down
Loading

0 comments on commit 432199e

Please sign in to comment.