All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.windowsazure.samples.internal.queue.DirectConnectQueueStrategy Maven / Gradle / Ivy

package com.windowsazure.samples.internal.queue;

import java.util.Collections;
import java.util.Comparator;
import java.util.Vector;

import com.windowsazure.samples.Metadata;
import com.windowsazure.samples.MetadataCollection;
import com.windowsazure.samples.internal.AzureOperation;
import com.windowsazure.samples.internal.AzureStrategy;
import com.windowsazure.samples.internal.AzureStrategyContext;
import com.windowsazure.samples.internal.authentication.BlobAndQueueServiceSharedKey;
import com.windowsazure.samples.internal.authentication.DirectConnectToken;
import com.windowsazure.samples.internal.util.Pair;
import com.windowsazure.samples.internal.util.Util;
import com.windowsazure.samples.internal.web.AzureHttpHeader;
import com.windowsazure.samples.internal.web.HttpHeader;
import com.windowsazure.samples.internal.web.HttpMethod;
import com.windowsazure.samples.internal.web.HttpUri;


public final class DirectConnectQueueStrategy extends AzureStrategy {

	public DirectConnectQueueStrategy(DirectConnectToken token) {
		super(token);
	}

	@Override
	protected void addCommonHeaders(AzureStrategyContext context, AzureHttpHeader headers)
		throws Exception {
		
		sharedKey = new BlobAndQueueServiceSharedKey();
		
		headers.put(AzureHttpHeader.XMS_Date, Util.dateToGmtString(context.getDate()));
		headers.put(AzureHttpHeader.XMS_VERSION, AzureHttpHeader.XMS_VERSION_VALUE);
	}

	@Override
	protected void addContentHeaders(AzureStrategyContext context, AzureHttpHeader headers) {
		
		String httpBody = context.getHttpBody();
		int contentLength = (httpBody != null) ? httpBody.length() : 0;
		
		sharedKey.setContentLength(Integer.toString(contentLength));
		headers.put(HttpHeader.CONTENT_LENGTH, contentLength);
			
		headers.put(HttpHeader.ACCEPT_CHARSET, "UTF-8");
		headers.put(HttpHeader.CONTENT_TYPE, null);
	}

	@Override
	protected void addOperationHeaders(AzureStrategyContext context, AzureHttpHeader headers)
		throws Exception {
		
		AzureOperation operation = context.getOperation();
		int maxResults = context.getMaxResults();
		MetadataCollection metadata = context.getMetadata();
		
		switch (operation) {
		
		case CreateQueue:
		case SetQueueMetadata:
			if (metadata != null)
				addMetadataToHeaders(headers, metadata);
			break;
			
		case ListQueues:
			headers.put("maxresults", maxResults);
			break;
		}
		
		HttpUri uri = getPath(context);
		String authenticationHeader = buildAuthenticationHeader(context, uri, headers);
		headers.put(HttpHeader.AUTHORIZATION, authenticationHeader);
	}

	@Override
	protected String getHost(AzureStrategyContext context) {
		return authenticationToken.getAccount() + ".queue.core.windows.net";
	}

	@Override
	protected HttpUri getPath(AzureStrategyContext context)
		throws Exception {
		
		HttpUri uri = new HttpUri("/");

		AzureOperation operation = context.getOperation();
		String messageId = context.getMessageId();
		int numberOfMessages = context.getNumberOfMessages();
		String popReceipt = context.getPopReceipt();
		String queueName = context.getQueueName();
		int timeToLiveInterval = context.getTimeToLiveInterval();
		int visibilityTimeout = context.getVisibilityTimeout();
		
		switch (operation) {
		
		case ClearMessages:
			uri.appendPath(queueName);
			uri.appendPath("/messages");
			break;
			
		case CreateQueue:
		case DeleteQueue:
			uri.appendPath(queueName);
			break;
			
		case DeleteMessage:
			uri.appendPath(queueName);
			uri.appendPath("/messages");
			uri.appendPath("/" + messageId);
			uri.addParameterWithoutEncoding("popreceipt", popReceipt);
			break;
			
		case GetMessages:
			uri.appendPath(queueName);
			uri.appendPath("/messages");
			uri.addParameterWithoutEncoding("numofmessages", Integer.toString(numberOfMessages));
			uri.addParameterWithoutEncoding("visibilitytimeout", Integer.toString(visibilityTimeout));
			break;
			
		case GetQueueMetadata:
		case SetQueueMetadata:
			uri.appendPath(queueName);
			uri.addParameterWithoutEncoding("comp", "metadata");
			break;
			
		case ListQueues:
			String prefix = context.getPrefix();
			String marker = context.getMarker();
			
			uri.addParameterWithoutEncoding("comp", "list");
			uri.addParameterWithoutEncoding("include", "metadata");
			if (! Util.isStringNullOrEmpty(prefix))
				uri.addParameterWithoutEncoding("prefix", prefix);
			if (! Util.isStringNullOrEmpty(marker))
				uri.addParameterWithoutEncoding("marker", marker);
			break;
			
		case PeekMessages:
			uri.appendPath(queueName);
			uri.appendPath("/messages");
			uri.addParameterWithoutEncoding("peekonly", "true");
			uri.addParameterWithoutEncoding("numofmessages", Integer.toString(numberOfMessages));
			break;
			
		case PutMessage:
			uri.appendPath(queueName);
			uri.appendPath("/messages");
			uri.addParameterWithoutEncoding("messagegetti", Integer.toString(timeToLiveInterval));
			break;
			
		default:
			throw new Exception("Missing case for operation " + operation);
		}
		
		return uri;
	}
	
	private class ParameterComparer implements Comparator> {
		@Override
		public int compare(Pair object1, Pair object2) {
			return object1.getFirst().compareTo(object2.getFirst());
		}
	}
	
	private void addMetadataToHeaders(AzureHttpHeader headers, MetadataCollection metadata) {
		for (Metadata datum : metadata) {
			headers.put(AzureHttpHeader.XMS_META_PREFIX + datum.getName(), datum.getValue());
		}
	}
	
	private String buildAuthenticationHeader(AzureStrategyContext context, HttpUri uri, AzureHttpHeader headers)
		throws 	Exception {
		
		AzureOperation operation = context.getOperation();
		HttpMethod httpMethod = operation.getHttpMethod();
		sharedKey
			.setVerb(httpMethod.toString())
			.setCanonicalizedHeaders(headers.toCanonicalizedForm())
			.setCanonicalizedResource(buildCanonicalizedResource(uri));
		
		return sharedKey.getAuthorizationHeader(authenticationToken.getAccount(), authenticationToken.getKey());
	}
	
	private String buildCanonicalizedResource(HttpUri uri)
		throws Exception {
		
		StringBuilder sb = new StringBuilder();
		
		sb.append('/');
		sb.append(authenticationToken.getAccount());
		sb.append(uri.getPath());
		
		Vector> parameters = new Vector>(uri.getParameters());
		Collections.sort(parameters, new ParameterComparer());
		for (Pair parameter : parameters) {
				sb.append('\n');
				sb.append(parameter.getFirst());
				sb.append(':');
				sb.append(parameter.getSecond());
		}
		
		return sb.toString();
	}
	
	private BlobAndQueueServiceSharedKey sharedKey;
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy