//
// typica - A client library for Amazon Web Services
// Copyright (C) 2007 Xerox Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
package com.xerox.amazonws.sqs2;
import java.io.InputStream;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import javax.xml.bind.JAXBException;
import org.xml.sax.SAXException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.http.HttpException;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.methods.HttpGet;
import com.xerox.amazonws.common.AWSException;
import com.xerox.amazonws.common.AWSQueryConnection;
import com.xerox.amazonws.typica.sqs2.jaxb.CreateQueueResponse;
import com.xerox.amazonws.typica.sqs2.jaxb.ListQueuesResponse;
/**
* This class provides an interface with the Amazon SQS service. It provides high level
* methods for listing and creating message queues.
*
* @author D. Kavanagh
* @author developer@dotech.com
*/
public class QueueService extends AWSQueryConnection {
private static Log logger = LogFactory.getLog(QueueService.class);
/**
* Initializes the queue service with your AWS login information.
*
* @param awsAccessId The your user key into AWS
* @param awsSecretKey The secret string used to generate signatures for authentication.
*/
public QueueService(String awsAccessId, String awsSecretKey) {
this(awsAccessId, awsSecretKey, true);
}
/**
* Initializes the queue service with your AWS login information.
*
* @param awsAccessId The your user key into AWS
* @param awsSecretKey The secret string used to generate signatures for authentication.
* @param isSecure True if the data should be encrypted on the wire on the way to or from SQS.
*/
public QueueService(String awsAccessId, String awsSecretKey, boolean isSecure) {
this(awsAccessId, awsSecretKey, isSecure, "queue.amazonaws.com");
}
/**
* Initializes the queue service with your AWS login information.
*
* @param awsAccessId The your user key into AWS
* @param awsSecretKey The secret string used to generate signatures for authentication.
* @param isSecure True if the data should be encrypted on the wire on the way to or from SQS.
* @param server Which host to connect to. Usually, this will be queue.amazonaws.com
*/
public QueueService(String awsAccessId, String awsSecretKey, boolean isSecure,
String server)
{
this(awsAccessId, awsSecretKey, isSecure, server,
isSecure ? 443 : 80);
}
/**
* Initializes the queue service with your AWS login information.
*
* @param awsAccessId The your user key into AWS
* @param awsSecretKey The secret string used to generate signatures for authentication.
* @param isSecure True if the data should be encrypted on the wire on the way to or from SQS.
* @param server Which host to connect to. Usually, this will be queue.amazonaws.com
* @param port Which port to use.
*/
public QueueService(String awsAccessId, String awsSecretKey, boolean isSecure,
String server, int port)
{
super(awsAccessId, awsSecretKey, isSecure, server, port);
setVersionHeader(this);
}
/**
* Creates a new message queue. The queue name must be unique within the scope of the
* queues you own. Optionaly, you can supply a queue that might be one that belongs to
* another user that has granted you access to the queue. In that case, supply the fully
* qualified queue name (i.e. "/A98KKI3K0RJ7Q/grantedQueue").
*
* @param queueName name of queue to be created
* @return object representing the message queue
*/
public MessageQueue getOrCreateMessageQueue(String queueName) throws SQSException {
return getOrCreateMessageQueue(queueName, -1);
}
/**
* Creates a new message queue. The queue name must be unique within the scope of the
* queues you own. Optionaly, you can supply a queue that might be one that belongs to
* another user that has granted you access to the queue. In that case, supply the fully
* qualified queue name (i.e. "/A98KKI3K0RJ7Q/grantedQueue").
*
* @param queueName name of queue to be created
* @param timeout the duration (in seconds) the retrieved message is hidden from
* subsequent calls to retrieve.
* @return object representing the message queue
*/
public MessageQueue getOrCreateMessageQueue(String queueName, int timeout) throws SQSException {
if ((queueName.charAt(0) == '/' && queueName.lastIndexOf('/') > 0) ||
queueName.startsWith("http")) {
return getMessageQueue(queueName);
}
else {
Map<String, String> params = new HashMap<String, String>();
params.put("QueueName", queueName);
if (timeout >= 0) {
params.put("DefaultVisibilityTimeout", ""+timeout);
}
HttpGet method = new HttpGet();
CreateQueueResponse response =
makeRequestInt(method, "CreateQueue", params, CreateQueueResponse.class);
MessageQueue ret = new MessageQueue(response.getCreateQueueResult().getQueueUrl(),
getAwsAccessKeyId(), getSecretAccessKey(),
isSecure(), getPort(), getServer());
ret.setHttpClient(getHttpClient());
return ret;
}
}
/**
* Returns a new message queue. The queue name must be of a queue already created and/or
* accessible to your account. (i.e. "https://queue.amazonaws.com/A98KKI3K0RJ7Q/myQueue",
* "/B38IZ53W0RU2X/grantedQueue").
*
* @param queueName qualified name of queue
* @return object representing the message queue
*/
public MessageQueue getMessageQueue(String queueName) throws SQSException {
if (!(queueName.charAt(0) == '/' && queueName.lastIndexOf('/') > 0) &&
!queueName.startsWith("http")) {
throw new IllegalArgumentException("Queue name must be more fully specified or use getOrCreateMessageQueue().");
}
MessageQueue ret = new MessageQueue(queueName, getAwsAccessKeyId(), getSecretAccessKey(),
isSecure(), getPort(), getServer());
ret.setHttpClient(getHttpClient());
return ret;
}
/**
* Retrieves a list of message queues. A maximum of 1,000 queue URLs are returned.
* If a value is specified for the optional queueNamePrefix parameter, only those queues
* with a queue name beginning with the value specified are returned. The queue name is
* specified in the QueueName parameter when a queue is created.
*
* @param queueNamePrefix the optional prefix for filtering results. can be null.
* @return a list of objects representing the message queues defined for this account
*/
public List<MessageQueue> listMessageQueues(String queueNamePrefix) throws SQSException {
Map<String, String> params = new HashMap<String, String>();
if (queueNamePrefix != null && !queueNamePrefix.trim().equals("")) {
params.put("QueueNamePrefix", queueNamePrefix);
}
HttpGet method = new HttpGet();
ListQueuesResponse response =
makeRequestInt(method, "ListQueues", params, ListQueuesResponse.class);
List<String> urls = response.getListQueuesResult().getQueueUrls();
if (urls == null || urls.size() == 0) {
return new ArrayList<MessageQueue>();
}
else {
return MessageQueue.createList(urls.toArray(new String[urls.size()]),
getAwsAccessKeyId(), getSecretAccessKey(),
isSecure(), getPort(), getServer(), getHttpClient());
}
}
protected <T> T makeRequestInt(HttpRequestBase method, String action, Map<String, String> params, Class<T> respType)
throws SQSException {
try {
return makeRequest(method, action, params, respType);
} catch (AWSException ex) {
throw new SQSException(ex);
} catch (JAXBException ex) {
throw new SQSException("Problem parsing returned message.", ex);
} catch (SAXException ex) {
throw new SQSException("Problem parsing returned message.", ex);
} catch (HttpException ex) {
throw new SQSException(ex.getMessage(), ex);
} catch (IOException ex) {
throw new SQSException(ex.getMessage(), ex);
}
}
static void setVersionHeader(AWSQueryConnection connection) {
ArrayList vals = new ArrayList();
vals.add("2009-02-01");
connection.getHeaders().put("Version", vals);
}
}