mirror of
https://github.com/apache/jclouds.git
synced 2025-02-16 15:08:28 +00:00
modularized sqs
This commit is contained in:
parent
00da07aec4
commit
887d4d1de8
209
labs/sqs/src/main/java/org/jclouds/sqs/MessageApi.java
Normal file
209
labs/sqs/src/main/java/org/jclouds/sqs/MessageApi.java
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.sqs;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.jclouds.concurrent.Timeout;
|
||||||
|
import org.jclouds.sqs.domain.Message;
|
||||||
|
import org.jclouds.sqs.domain.MessageIdAndMD5;
|
||||||
|
import org.jclouds.sqs.options.ReceiveMessageOptions;
|
||||||
|
import org.jclouds.sqs.options.SendMessageOptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides access to SQS via their REST API.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @see SQSAsyncApi
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Timeout(duration = 30, timeUnit = TimeUnit.SECONDS)
|
||||||
|
public interface MessageApi {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The DeleteMessage action deletes the specified message from the specified
|
||||||
|
* queue. You specify the message by using the message's receipt handle and
|
||||||
|
* not the message ID you received when you sent the message. Even if the
|
||||||
|
* message is locked by another reader due to the visibility timeout setting,
|
||||||
|
* it is still deleted from the queue. If you leave a message in the queue
|
||||||
|
* for more than 4 days, SQS automatically deletes it.
|
||||||
|
*
|
||||||
|
* <h4>Note</h4>
|
||||||
|
*
|
||||||
|
* The receipt handle is associated with a specific instance of receiving the
|
||||||
|
* message. If you receive a message more than once, the receipt handle you
|
||||||
|
* get each time you receive the message is different. When you request
|
||||||
|
* DeleteMessage, if you don't provide the most recently received receipt
|
||||||
|
* handle for the message, the request will still succeed, but the message
|
||||||
|
* might not be deleted.
|
||||||
|
*
|
||||||
|
* <h4>Important</h4>
|
||||||
|
*
|
||||||
|
* It is possible you will receive a message even after you have deleted it.
|
||||||
|
* This might happen on rare occasions if one of the servers storing a copy
|
||||||
|
* of the message is unavailable when you request to delete the message. The
|
||||||
|
* copy remains on the server and might be returned to you again on a
|
||||||
|
* subsequent receive request. You should create your system to be idempotent
|
||||||
|
* so that receiving a particular message more than once is not a problem.
|
||||||
|
*
|
||||||
|
* @param queue
|
||||||
|
* the queue the message is in
|
||||||
|
* @param receiptHandle
|
||||||
|
* The receipt handle associated with the message you want to
|
||||||
|
* delete.
|
||||||
|
*/
|
||||||
|
void delete(String receiptHandle);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ChangeMessageVisibility action changes the visibility timeout of a
|
||||||
|
* specified message in a queue to a new value. The maximum allowed timeout
|
||||||
|
* value you can set the value to is 12 hours. This means you can't extend
|
||||||
|
* the timeout of a message in an existing queue to more than a total
|
||||||
|
* visibility timeout of 12 hours. (For more information visibility timeout,
|
||||||
|
* see Visibility Timeout in the Amazon SQS Developer Guide.)
|
||||||
|
*
|
||||||
|
* For example, let's say the timeout for the queue is 30 seconds, and you
|
||||||
|
* receive a message. Once you're 20 seconds into the timeout for that
|
||||||
|
* message (i.e., you have 10 seconds left), you extend it by 60 seconds by
|
||||||
|
* calling ChangeMessageVisibility with VisibilityTimeoutset to 60 seconds.
|
||||||
|
* You have then changed the remaining visibility timeout from 10 seconds to
|
||||||
|
* 60 seconds.
|
||||||
|
*
|
||||||
|
* <h4>Important</h4>
|
||||||
|
*
|
||||||
|
* If you attempt to set the VisibilityTimeout to an amount more than the
|
||||||
|
* maximum time left, Amazon SQS returns an error. It will not automatically
|
||||||
|
* recalculate and increase the timeout to the maximum time remaining.
|
||||||
|
*
|
||||||
|
* <h4>Important</h4>
|
||||||
|
*
|
||||||
|
* Unlike with a queue, when you change the visibility timeout for a specific
|
||||||
|
* message, that timeout value is applied immediately but is not saved in
|
||||||
|
* memory for that message. If you don't delete a message after it is
|
||||||
|
* received, the visibility timeout for the message the next time it is
|
||||||
|
* received reverts to the original timeout value, not the value you set with
|
||||||
|
* the ChangeMessageVisibility action.
|
||||||
|
*
|
||||||
|
* @param queue
|
||||||
|
* the queue the message is in
|
||||||
|
* @param receiptHandle
|
||||||
|
* The receipt handle associated with the message whose visibility
|
||||||
|
* timeout you want to change. This parameter is returned by the
|
||||||
|
* ReceiveMessage action.
|
||||||
|
* @param visibilityTimeout
|
||||||
|
* The new value for the message's visibility timeout (in seconds)
|
||||||
|
* from 0 to 43200 (maximum 12 hours)
|
||||||
|
*/
|
||||||
|
void changeVisibility(String receiptHandle, int visibilityTimeout);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The SendMessage action delivers a message to the specified queue. The
|
||||||
|
* maximum allowed message size is 64 KB.
|
||||||
|
*
|
||||||
|
* <h4>Important</h4>
|
||||||
|
*
|
||||||
|
* The following list shows the characters (in Unicode) allowed in your
|
||||||
|
* message, according to the W3C XML specification (for more information, go
|
||||||
|
* to http://www.w3.org/TR/REC-xml/#charsets). If you send any characters not
|
||||||
|
* included in the list, your request will be rejected.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* {@code #x9 | #xA | #xD | [#x20 to #xD7FF] | [#xE000 to #xFFFD] | [#x10000 to #x10FFFF]}
|
||||||
|
*
|
||||||
|
* @param queue
|
||||||
|
* queue you want to send to
|
||||||
|
*
|
||||||
|
* @param message
|
||||||
|
* Type: String maximum 64 KB in size. For a list of allowed
|
||||||
|
* characters, see the preceding important note.
|
||||||
|
* @return id of the message and md5 of the content sent
|
||||||
|
*/
|
||||||
|
MessageIdAndMD5 send(String message);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* same as {@link #sendMessage(URI, String)} except you can control options
|
||||||
|
* such as delay seconds.
|
||||||
|
*
|
||||||
|
* @param options
|
||||||
|
* options such as delay seconds
|
||||||
|
* @see #sendMessage(URI, String)
|
||||||
|
*/
|
||||||
|
MessageIdAndMD5 send(String message, SendMessageOptions options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ReceiveMessage action retrieves one or more messages from the
|
||||||
|
* specified queue. The ReceiveMessage action does not delete the message
|
||||||
|
* after it is retrieved. To delete a message, you must use the DeleteMessage
|
||||||
|
* action. For more information about message deletion in the message life
|
||||||
|
* cycle, see Message Lifecycle.
|
||||||
|
*
|
||||||
|
* <h4>Note</h4>
|
||||||
|
*
|
||||||
|
* Due to the distributed nature of the queue, a weighted random set of
|
||||||
|
* machines is sampled on a ReceiveMessage call. That means only the messages
|
||||||
|
* on the sampled machines are returned. If the number of messages in the
|
||||||
|
* queue is small (less than 1000), it is likely you will get fewer messages
|
||||||
|
* than you requested per ReceiveMessage call. If the number of messages in
|
||||||
|
* the queue is extremely small, you might not receive any messages in a
|
||||||
|
* particular ReceiveMessage response; in which case you should repeat the
|
||||||
|
* request.
|
||||||
|
*
|
||||||
|
* @param queue
|
||||||
|
* from where you are receiving messages
|
||||||
|
* @return message including the receipt handle you can use to delete it
|
||||||
|
*/
|
||||||
|
Message receive();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* same as {@link #receive(URI)} except you can provide options like
|
||||||
|
* VisibilityTimeout parameter in your request, which will be applied to the
|
||||||
|
* messages that SQS returns in the response. If you do not include the
|
||||||
|
* parameter, the overall visibility timeout for the queue is used for the
|
||||||
|
* returned messages.
|
||||||
|
*
|
||||||
|
* @param options
|
||||||
|
* options such as VisibilityTimeout
|
||||||
|
* @see #receive(URI)
|
||||||
|
*/
|
||||||
|
Message receive(ReceiveMessageOptions options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* same as {@link #receive(URI)} except you can receive multiple messages.
|
||||||
|
*
|
||||||
|
* @param max
|
||||||
|
* maximum messages to receive, current limit is 10
|
||||||
|
* @see #receive(URI)
|
||||||
|
*/
|
||||||
|
Set<Message> receive(int max);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* same as {@link #receive(URI, int)} except you can provide options like
|
||||||
|
* VisibilityTimeout parameter in your request, which will be applied to the
|
||||||
|
* messages that SQS returns in the response. If you do not include the
|
||||||
|
* parameter, the overall visibility timeout for the queue is used for the
|
||||||
|
* returned messages.
|
||||||
|
*
|
||||||
|
* @param options
|
||||||
|
* options such as VisibilityTimeout
|
||||||
|
* @see #receive(URI, int)
|
||||||
|
*/
|
||||||
|
Set<Message> receive(int max, ReceiveMessageOptions options);
|
||||||
|
}
|
130
labs/sqs/src/main/java/org/jclouds/sqs/MessageAsyncApi.java
Normal file
130
labs/sqs/src/main/java/org/jclouds/sqs/MessageAsyncApi.java
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.sqs;
|
||||||
|
|
||||||
|
import static org.jclouds.sqs.reference.SQSParameters.ACTION;
|
||||||
|
import static org.jclouds.sqs.reference.SQSParameters.VERSION;
|
||||||
|
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.ws.rs.FormParam;
|
||||||
|
import javax.ws.rs.POST;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
|
||||||
|
import org.jclouds.Constants;
|
||||||
|
import org.jclouds.aws.filters.FormSigner;
|
||||||
|
import org.jclouds.rest.annotations.FormParams;
|
||||||
|
import org.jclouds.rest.annotations.RequestFilters;
|
||||||
|
import org.jclouds.rest.annotations.ResponseParser;
|
||||||
|
import org.jclouds.rest.annotations.VirtualHost;
|
||||||
|
import org.jclouds.rest.annotations.XMLResponseParser;
|
||||||
|
import org.jclouds.sqs.domain.Message;
|
||||||
|
import org.jclouds.sqs.domain.MessageIdAndMD5;
|
||||||
|
import org.jclouds.sqs.options.ReceiveMessageOptions;
|
||||||
|
import org.jclouds.sqs.options.SendMessageOptions;
|
||||||
|
import org.jclouds.sqs.xml.MessageHandler;
|
||||||
|
import org.jclouds.sqs.xml.ReceiveMessageResponseHandler;
|
||||||
|
import org.jclouds.sqs.xml.RegexMessageIdAndMD5Handler;
|
||||||
|
|
||||||
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides access to SQS via their REST API.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@RequestFilters(FormSigner.class)
|
||||||
|
@FormParams(keys = VERSION, values = "{" + Constants.PROPERTY_API_VERSION + "}")
|
||||||
|
@VirtualHost
|
||||||
|
public interface MessageAsyncApi {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SQSApi#delete
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "DeleteMessage")
|
||||||
|
ListenableFuture<Void> delete(@FormParam("ReceiptHandle") String receiptHandle);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SQSApi#changeVisibility
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "ChangeMessageVisibility")
|
||||||
|
ListenableFuture<Void> changeVisibility(@FormParam("ReceiptHandle") String receiptHandle,
|
||||||
|
@FormParam("VisibilityTimeout") int visibilityTimeout);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SQSApi#send
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "SendMessage")
|
||||||
|
@ResponseParser(RegexMessageIdAndMD5Handler.class)
|
||||||
|
ListenableFuture<? extends MessageIdAndMD5> send(@FormParam("MessageBody") String message);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SQSApi#send
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "SendMessage")
|
||||||
|
@ResponseParser(RegexMessageIdAndMD5Handler.class)
|
||||||
|
ListenableFuture<? extends MessageIdAndMD5> send(@FormParam("MessageBody") String message, SendMessageOptions options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SQSApi#receive
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "ReceiveMessage")
|
||||||
|
@XMLResponseParser(MessageHandler.class)
|
||||||
|
ListenableFuture<Message> receive();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SQSApi#receive
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "ReceiveMessage")
|
||||||
|
@XMLResponseParser(MessageHandler.class)
|
||||||
|
ListenableFuture<? extends Message> receive(ReceiveMessageOptions options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SQSApi#receive
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "ReceiveMessage")
|
||||||
|
@XMLResponseParser(ReceiveMessageResponseHandler.class)
|
||||||
|
ListenableFuture<? extends Set<? extends Message>> receive(@FormParam("MaxNumberOfMessages") int max);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SQSApi#receive
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "ReceiveMessage")
|
||||||
|
@XMLResponseParser(ReceiveMessageResponseHandler.class)
|
||||||
|
ListenableFuture<? extends Set<? extends Message>> receive(@FormParam("MaxNumberOfMessages") int max,
|
||||||
|
ReceiveMessageOptions options);
|
||||||
|
|
||||||
|
}
|
87
labs/sqs/src/main/java/org/jclouds/sqs/PermissionApi.java
Normal file
87
labs/sqs/src/main/java/org/jclouds/sqs/PermissionApi.java
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.sqs;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.jclouds.concurrent.Timeout;
|
||||||
|
import org.jclouds.sqs.domain.Action;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides access to SQS via their REST API.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @see SQSAsyncApi
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Timeout(duration = 30, timeUnit = TimeUnit.SECONDS)
|
||||||
|
public interface PermissionApi {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The AddPermission action adds a permission to a queue for a specific
|
||||||
|
* principal. This allows for sharing access to the queue.
|
||||||
|
*
|
||||||
|
* When you create a queue, you have full control access rights for the
|
||||||
|
* queue. Only you (as owner of the queue) can grant or deny permissions to
|
||||||
|
* the queue. For more information about these permissions, see Shared Queues
|
||||||
|
* in the Amazon SQS Developer Guide.
|
||||||
|
*
|
||||||
|
* Note
|
||||||
|
*
|
||||||
|
* AddPermission writes an SQS-generated policy. If you want to write your
|
||||||
|
* own policy, use SetQueueAttributes to upload your policy.
|
||||||
|
*
|
||||||
|
* @param queue
|
||||||
|
* queue to change permissions on
|
||||||
|
* @param label
|
||||||
|
*
|
||||||
|
* The unique identification of the permission you're setting.
|
||||||
|
* example: AliceSendMessage
|
||||||
|
*
|
||||||
|
* Constraints: Maximum 80 characters; alphanumeric characters,
|
||||||
|
* hyphens (-), and underscores (_) are allowed.
|
||||||
|
* @param permission
|
||||||
|
* The action you want to allow for the specified principal.
|
||||||
|
* @param accountId
|
||||||
|
* The AWS account number of the principal who will be given
|
||||||
|
* permission. The principal must have an AWS account, but does not
|
||||||
|
* need to be signed up for Amazon SQS. For information about
|
||||||
|
* locating the AWS account identification, see Your AWS
|
||||||
|
* Identifiers in the Amazon SQS Developer Guide.
|
||||||
|
*
|
||||||
|
* Constraints: Valid 12-digit AWS account number, without hyphens
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void addPermissionToAccount(String label, Action permission, String accountId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The RemovePermission action revokes any permissions in the queue policy
|
||||||
|
* that matches the Label parameter. Only the owner of the queue can remove
|
||||||
|
* permissions.
|
||||||
|
*
|
||||||
|
* @param queue
|
||||||
|
* queue to change permissions on
|
||||||
|
*
|
||||||
|
* @param label
|
||||||
|
* The identification of the permission you want to remove. This is
|
||||||
|
* the label you added in AddPermission. example: AliceSendMessage
|
||||||
|
*/
|
||||||
|
void remove(String label);
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,65 @@
|
|||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.sqs;
|
||||||
|
|
||||||
|
import static org.jclouds.sqs.reference.SQSParameters.ACTION;
|
||||||
|
import static org.jclouds.sqs.reference.SQSParameters.VERSION;
|
||||||
|
|
||||||
|
import javax.ws.rs.FormParam;
|
||||||
|
import javax.ws.rs.POST;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
|
||||||
|
import org.jclouds.Constants;
|
||||||
|
import org.jclouds.aws.filters.FormSigner;
|
||||||
|
import org.jclouds.rest.annotations.FormParams;
|
||||||
|
import org.jclouds.rest.annotations.RequestFilters;
|
||||||
|
import org.jclouds.rest.annotations.VirtualHost;
|
||||||
|
import org.jclouds.sqs.domain.Action;
|
||||||
|
|
||||||
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides access to SQS via their REST API.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@RequestFilters(FormSigner.class)
|
||||||
|
@FormParams(keys = VERSION, values = "{" + Constants.PROPERTY_API_VERSION + "}")
|
||||||
|
@VirtualHost
|
||||||
|
public interface PermissionAsyncApi {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SQSApi#addPermissionToAccount
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "AddPermission")
|
||||||
|
ListenableFuture<Void> addPermissionToAccount(@FormParam("Label") String label,
|
||||||
|
@FormParam("ActionName.1") Action permission, @FormParam("AWSAccountId.1") String accountId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SQSApi#remove
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "RemovePermission")
|
||||||
|
ListenableFuture<Void> remove(@FormParam("Label") String label);
|
||||||
|
|
||||||
|
}
|
212
labs/sqs/src/main/java/org/jclouds/sqs/QueueApi.java
Normal file
212
labs/sqs/src/main/java/org/jclouds/sqs/QueueApi.java
Normal file
@ -0,0 +1,212 @@
|
|||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.sqs;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
import org.jclouds.concurrent.Timeout;
|
||||||
|
import org.jclouds.sqs.domain.QueueAttributes;
|
||||||
|
import org.jclouds.sqs.options.CreateQueueOptions;
|
||||||
|
import org.jclouds.sqs.options.ListQueuesOptions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides access to SQS via their REST API.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @see SQSAsyncApi
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Timeout(duration = 30, timeUnit = TimeUnit.SECONDS)
|
||||||
|
public interface QueueApi {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ListQueues action returns a list of your queues. The maximum number of
|
||||||
|
* queues that can be returned is 1000. If you specify a value for the
|
||||||
|
* optional QueueNamePrefix parameter, only queues with a name beginning with
|
||||||
|
* the specified value are returned
|
||||||
|
*
|
||||||
|
* @param region
|
||||||
|
* Queues are Region-specific.
|
||||||
|
* @param options
|
||||||
|
* specify prefix or other options
|
||||||
|
*
|
||||||
|
* @see <a href=
|
||||||
|
* "http://docs.amazonwebservices.com/AWSSimpleQueueService/2011-10-01/APIReference/Query_QueryListQueues.html"
|
||||||
|
* />
|
||||||
|
*/
|
||||||
|
Set<URI> list();
|
||||||
|
|
||||||
|
Set<URI> list(ListQueuesOptions options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The CreateQueue action creates a new queue.
|
||||||
|
*
|
||||||
|
* When you request CreateQueue, you provide a name for the queue. To
|
||||||
|
* successfully create a new queue, you must provide a name that is unique
|
||||||
|
* within the scope of your own queues.
|
||||||
|
*
|
||||||
|
* <h4>Note</h4>
|
||||||
|
*
|
||||||
|
* If you delete a queue, you must wait at least 60 seconds before creating a
|
||||||
|
* queue with the same name.
|
||||||
|
*
|
||||||
|
* If you provide the name of an existing queue, along with the exact names
|
||||||
|
* and values of all the queue's attributes, CreateQueue returns the queue
|
||||||
|
* URL for the existing queue. If the queue name, attribute names, or
|
||||||
|
* attribute values do not match an existing queue, CreateQueue returns an
|
||||||
|
* error.
|
||||||
|
*
|
||||||
|
* <h4>Tip</h4>
|
||||||
|
*
|
||||||
|
* Use GetQueueUrl to get a queue's URL. GetQueueUrl requires only the
|
||||||
|
* QueueName parameter.
|
||||||
|
*
|
||||||
|
* @param region
|
||||||
|
* Queues are Region-specific.
|
||||||
|
* @param queueName
|
||||||
|
* The name to use for the queue created. Constraints: Maximum 80
|
||||||
|
* characters; alphanumeric characters, hyphens (-), and
|
||||||
|
* underscores (_) are allowed.
|
||||||
|
*/
|
||||||
|
// this will gracefully attempt to resolve name issues
|
||||||
|
@Timeout(duration = 61, timeUnit = TimeUnit.SECONDS)
|
||||||
|
URI create(String queueName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* same as {@link #create(String, String)} except you can
|
||||||
|
* control options such as delay seconds.
|
||||||
|
*
|
||||||
|
* @param options
|
||||||
|
* options such as delay seconds
|
||||||
|
* @see #create(String, String)
|
||||||
|
*/
|
||||||
|
@Timeout(duration = 61, timeUnit = TimeUnit.SECONDS)
|
||||||
|
URI create(String queueName, CreateQueueOptions options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The DeleteQueue action deletes the queue specified by the queue URL,
|
||||||
|
* regardless of whether the queue is empty. If the specified queue does not
|
||||||
|
* exist, SQS returns a successful response.
|
||||||
|
*
|
||||||
|
* <h4>Caution</h4>
|
||||||
|
*
|
||||||
|
* Use DeleteQueue with care; once you delete your queue, any messages in the
|
||||||
|
* queue are no longer available.
|
||||||
|
*
|
||||||
|
* When you delete a queue, the deletion process takes up to 60 seconds.
|
||||||
|
* Requests you send involving that queue during the 60 seconds might
|
||||||
|
* succeed. For example, a SendMessage request might succeed, but after the
|
||||||
|
* 60 seconds, the queue and that message you sent no longer exist. Also,
|
||||||
|
* when you delete a queue, you must wait at least 60 seconds before creating
|
||||||
|
* a queue with the same name.
|
||||||
|
*
|
||||||
|
* We reserve the right to delete queues that have had no activity for more
|
||||||
|
* than 30 days. For more information, see About SQS Queues in the Amazon SQS
|
||||||
|
* Developer Guide.
|
||||||
|
*
|
||||||
|
* @param queue
|
||||||
|
* queue you want to delete
|
||||||
|
*/
|
||||||
|
void delete(URI queue);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns all attributes of a queue.
|
||||||
|
*
|
||||||
|
* @param queue
|
||||||
|
* queue to get the attributes of
|
||||||
|
*/
|
||||||
|
QueueAttributes getAttributes(URI queue);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The SetQueueAttributes action sets one attribute of a queue per request.
|
||||||
|
* When you change a queue's attributes, the change can take up to 60 seconds
|
||||||
|
* to propagate throughout the SQS system.
|
||||||
|
*
|
||||||
|
* @param queue
|
||||||
|
* queue to set the attribute on
|
||||||
|
* @param name
|
||||||
|
*
|
||||||
|
* The name of the attribute you want to set.
|
||||||
|
*
|
||||||
|
* VisibilityTimeout - The length of time (in seconds) that a
|
||||||
|
* message received from a queue will be invisible to other
|
||||||
|
* receiving components when they ask to receive messages. For more
|
||||||
|
* information about VisibilityTimeout, see Visibility Timeout in
|
||||||
|
* the Amazon SQS Developer Guide.
|
||||||
|
*
|
||||||
|
* Policy - The formal description of the permissions for a
|
||||||
|
* resource. For more information about Policy, see Basic Policy
|
||||||
|
* Structure in the Amazon SQS Developer Guide.
|
||||||
|
*
|
||||||
|
* MaximumMessageSize - The limit of how many bytes a message can
|
||||||
|
* contain before Amazon SQS rejects it.
|
||||||
|
*
|
||||||
|
* MessageRetentionPeriod - The number of seconds Amazon SQS
|
||||||
|
* retains a message.
|
||||||
|
*
|
||||||
|
* DelaySeconds - The time in seconds that the delivery of all
|
||||||
|
* messages in the queue will be delayed.
|
||||||
|
* @param value
|
||||||
|
* The value of the attribute you want to set. To delete a queue's
|
||||||
|
* access control policy, set the policy to "".
|
||||||
|
*
|
||||||
|
* Constraints: Constraints are specific for each value.
|
||||||
|
*
|
||||||
|
* VisibilityTimeout - An integer from 0 to 43200 (12 hours). The
|
||||||
|
* default for this attribute is 30 seconds.
|
||||||
|
*
|
||||||
|
* Policy - A valid form-url-encoded policy. For more information
|
||||||
|
* about policy structure, see Basic Policy Structure in the Amazon
|
||||||
|
* SQS Developer Guide. For more information about
|
||||||
|
* form-url-encoding, see
|
||||||
|
* http://www.w3.org/MarkUp/html-spec/html-spec_8.html#SEC8.2.1.
|
||||||
|
*
|
||||||
|
* MaximumMessageSize - An integer from 1024 bytes (1 KiB) up to
|
||||||
|
* 65536 bytes (64 KiB). The default for this attribute is 65536
|
||||||
|
* (64 KiB).
|
||||||
|
*
|
||||||
|
* MessageRetentionPeriod - Integer representing seconds, from 60
|
||||||
|
* (1 minute) to 1209600 (14 days). The default for this attribute
|
||||||
|
* is 345600 (4 days).
|
||||||
|
*
|
||||||
|
* DelaySeconds - An integer from 0 to 900 (15 minutes). The
|
||||||
|
* default for this attribute is 0.
|
||||||
|
*/
|
||||||
|
void setAttribute(URI queue, String name, String value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns some attributes of a queue.
|
||||||
|
*
|
||||||
|
* @param queue
|
||||||
|
* queue to get the attributes of
|
||||||
|
*/
|
||||||
|
Map<String, String> getAttributes(URI queue, Iterable<String> attributeNames);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns an attribute of a queue.
|
||||||
|
*
|
||||||
|
* @param queue
|
||||||
|
* queue to get the attributes of
|
||||||
|
*/
|
||||||
|
String getAttribute(URI queue, String attributeName);
|
||||||
|
|
||||||
|
}
|
150
labs/sqs/src/main/java/org/jclouds/sqs/QueueAsyncApi.java
Normal file
150
labs/sqs/src/main/java/org/jclouds/sqs/QueueAsyncApi.java
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
/**
|
||||||
|
* Licensed to jclouds, Inc. (jclouds) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. jclouds licenses this file
|
||||||
|
* to you 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 org.jclouds.sqs;
|
||||||
|
|
||||||
|
import static org.jclouds.sqs.reference.SQSParameters.ACTION;
|
||||||
|
import static org.jclouds.sqs.reference.SQSParameters.VERSION;
|
||||||
|
|
||||||
|
import java.net.URI;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
import javax.ws.rs.FormParam;
|
||||||
|
import javax.ws.rs.POST;
|
||||||
|
import javax.ws.rs.Path;
|
||||||
|
|
||||||
|
import org.jclouds.Constants;
|
||||||
|
import org.jclouds.aws.filters.FormSigner;
|
||||||
|
import org.jclouds.rest.annotations.BinderParam;
|
||||||
|
import org.jclouds.rest.annotations.EndpointParam;
|
||||||
|
import org.jclouds.rest.annotations.ExceptionParser;
|
||||||
|
import org.jclouds.rest.annotations.FormParams;
|
||||||
|
import org.jclouds.rest.annotations.RequestFilters;
|
||||||
|
import org.jclouds.rest.annotations.ResponseParser;
|
||||||
|
import org.jclouds.rest.annotations.Transform;
|
||||||
|
import org.jclouds.rest.annotations.VirtualHost;
|
||||||
|
import org.jclouds.rest.annotations.XMLResponseParser;
|
||||||
|
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
|
||||||
|
import org.jclouds.sqs.binders.BindAttributeNamesToIndexedFormParams;
|
||||||
|
import org.jclouds.sqs.domain.QueueAttributes;
|
||||||
|
import org.jclouds.sqs.functions.MapToQueueAttributes;
|
||||||
|
import org.jclouds.sqs.options.CreateQueueOptions;
|
||||||
|
import org.jclouds.sqs.options.ListQueuesOptions;
|
||||||
|
import org.jclouds.sqs.xml.AttributesHandler;
|
||||||
|
import org.jclouds.sqs.xml.RegexListQueuesResponseHandler;
|
||||||
|
import org.jclouds.sqs.xml.RegexQueueHandler;
|
||||||
|
import org.jclouds.sqs.xml.ValueHandler;
|
||||||
|
|
||||||
|
import com.google.common.util.concurrent.ListenableFuture;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides access to SQS via their REST API.
|
||||||
|
* <p/>
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@RequestFilters(FormSigner.class)
|
||||||
|
@FormParams(keys = VERSION, values = "{" + Constants.PROPERTY_API_VERSION + "}")
|
||||||
|
@VirtualHost
|
||||||
|
public interface QueueAsyncApi {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SQSApi#list
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "ListQueues")
|
||||||
|
@ResponseParser(RegexListQueuesResponseHandler.class)
|
||||||
|
ListenableFuture<Set<URI>> list();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SQSApi#list
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "ListQueues")
|
||||||
|
@ResponseParser(RegexListQueuesResponseHandler.class)
|
||||||
|
ListenableFuture<Set<URI>> list(ListQueuesOptions options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SQSApi#create
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "CreateQueue")
|
||||||
|
@ResponseParser(RegexQueueHandler.class)
|
||||||
|
ListenableFuture<URI> create(@FormParam("QueueName") String queueName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SQSApi#create
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "CreateQueue")
|
||||||
|
@ResponseParser(RegexQueueHandler.class)
|
||||||
|
ListenableFuture<URI> create(@FormParam("QueueName") String queueName, CreateQueueOptions options);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SQSApi#delete
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "DeleteQueue")
|
||||||
|
ListenableFuture<Void> delete(@EndpointParam URI queue);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SQSApi#getAttributes(URI)
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = { ACTION, "AttributeName.1" }, values = { "GetQueueAttributes", "All" })
|
||||||
|
@Transform(MapToQueueAttributes.class)
|
||||||
|
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
|
||||||
|
@XMLResponseParser(AttributesHandler.class)
|
||||||
|
ListenableFuture<? extends QueueAttributes> getAttributes(@EndpointParam URI queue);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SQSApi#getAttributes(URI, Iterable)
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "GetQueueAttributes")
|
||||||
|
@XMLResponseParser(AttributesHandler.class)
|
||||||
|
ListenableFuture<Map<String, String>> getAttributes(@EndpointParam URI queue,
|
||||||
|
@BinderParam(BindAttributeNamesToIndexedFormParams.class) Iterable<String> attributeNames);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SQSApi#getAttribute
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "GetQueueAttributes")
|
||||||
|
@XMLResponseParser(ValueHandler.class)
|
||||||
|
ListenableFuture<String> getAttribute(@EndpointParam URI queue, @FormParam("AttributeName.1") String attributeName);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see SQSApi#setAttribute
|
||||||
|
*/
|
||||||
|
@POST
|
||||||
|
@Path("/")
|
||||||
|
@FormParams(keys = ACTION, values = "SetQueueAttributes")
|
||||||
|
ListenableFuture<Void> setAttribute(@EndpointParam URI queue, @FormParam("Attribute.Name") String name,
|
||||||
|
@FormParam("Attribute.Value") String value);
|
||||||
|
|
||||||
|
}
|
@ -19,420 +19,57 @@
|
|||||||
package org.jclouds.sqs;
|
package org.jclouds.sqs;
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import org.jclouds.concurrent.Timeout;
|
import org.jclouds.concurrent.Timeout;
|
||||||
import org.jclouds.javax.annotation.Nullable;
|
import org.jclouds.javax.annotation.Nullable;
|
||||||
import org.jclouds.sqs.domain.Action;
|
import org.jclouds.location.Region;
|
||||||
import org.jclouds.sqs.domain.Message;
|
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
|
||||||
import org.jclouds.sqs.domain.MessageIdAndMD5;
|
import org.jclouds.rest.annotations.Delegate;
|
||||||
import org.jclouds.sqs.domain.QueueAttributes;
|
import org.jclouds.rest.annotations.EndpointParam;
|
||||||
import org.jclouds.sqs.options.CreateQueueOptions;
|
|
||||||
import org.jclouds.sqs.options.ListQueuesOptions;
|
import com.google.common.annotations.Beta;
|
||||||
import org.jclouds.sqs.options.ReceiveMessageOptions;
|
import com.google.inject.Provides;
|
||||||
import org.jclouds.sqs.options.SendMessageOptions;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides access to SQS via their REST API.
|
* Provides access to SQS via their REST API.
|
||||||
* <p/>
|
* <p/>
|
||||||
*
|
*
|
||||||
* @see SQSAsyncApi
|
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
|
* @see SQSAsyncApi
|
||||||
*/
|
*/
|
||||||
|
@Beta
|
||||||
@Timeout(duration = 30, timeUnit = TimeUnit.SECONDS)
|
@Timeout(duration = 30, timeUnit = TimeUnit.SECONDS)
|
||||||
public interface SQSApi {
|
public interface SQSApi {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The ListQueues action returns a list of your queues. The maximum number of
|
|
||||||
* queues that can be returned is 1000. If you specify a value for the
|
|
||||||
* optional QueueNamePrefix parameter, only queues with a name beginning with
|
|
||||||
* the specified value are returned
|
|
||||||
*
|
*
|
||||||
* @param region
|
* @return the Region codes configured
|
||||||
* Queues are Region-specific.
|
|
||||||
* @param options
|
|
||||||
* specify prefix or other options
|
|
||||||
*
|
|
||||||
* @see <a href=
|
|
||||||
* "http://docs.amazonwebservices.com/AWSSimpleQueueService/2011-10-01/APIReference/Query_QueryListQueues.html"
|
|
||||||
* />
|
|
||||||
*/
|
*/
|
||||||
Set<URI> listQueuesInRegion(@Nullable String region);
|
@Provides
|
||||||
|
@Region
|
||||||
Set<URI> listQueuesInRegion(@Nullable String region, ListQueuesOptions options);
|
Set<String> getConfiguredRegions();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The CreateQueue action creates a new queue.
|
* Provides synchronous access to Queue features.
|
||||||
*
|
|
||||||
* When you request CreateQueue, you provide a name for the queue. To
|
|
||||||
* successfully create a new queue, you must provide a name that is unique
|
|
||||||
* within the scope of your own queues.
|
|
||||||
*
|
|
||||||
* <h4>Note</h4>
|
|
||||||
*
|
|
||||||
* If you delete a queue, you must wait at least 60 seconds before creating a
|
|
||||||
* queue with the same name.
|
|
||||||
*
|
|
||||||
* If you provide the name of an existing queue, along with the exact names
|
|
||||||
* and values of all the queue's attributes, CreateQueue returns the queue
|
|
||||||
* URL for the existing queue. If the queue name, attribute names, or
|
|
||||||
* attribute values do not match an existing queue, CreateQueue returns an
|
|
||||||
* error.
|
|
||||||
*
|
|
||||||
* <h4>Tip</h4>
|
|
||||||
*
|
|
||||||
* Use GetQueueUrl to get a queue's URL. GetQueueUrl requires only the
|
|
||||||
* QueueName parameter.
|
|
||||||
*
|
|
||||||
* @param region
|
|
||||||
* Queues are Region-specific.
|
|
||||||
* @param queueName
|
|
||||||
* The name to use for the queue created. Constraints: Maximum 80
|
|
||||||
* characters; alphanumeric characters, hyphens (-), and
|
|
||||||
* underscores (_) are allowed.
|
|
||||||
*/
|
*/
|
||||||
// this will gracefully attempt to resolve name issues
|
@Delegate
|
||||||
@Timeout(duration = 61, timeUnit = TimeUnit.SECONDS)
|
QueueApi getQueueApi();
|
||||||
URI createQueueInRegion(@Nullable String region, String queueName);
|
|
||||||
|
@Delegate
|
||||||
|
QueueApi getQueueApiForRegion(@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* same as {@link #createQueueInRegion(String, String)} except you can
|
* Provides synchronous access to Message features.
|
||||||
* control options such as delay seconds.
|
|
||||||
*
|
|
||||||
* @param options
|
|
||||||
* options such as delay seconds
|
|
||||||
* @see #createQueueInRegion(String, String)
|
|
||||||
*/
|
*/
|
||||||
@Timeout(duration = 61, timeUnit = TimeUnit.SECONDS)
|
@Delegate
|
||||||
URI createQueueInRegion(@Nullable String region, String queueName, CreateQueueOptions options);
|
MessageApi getMessageApiForQueue(@EndpointParam URI queue);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The DeleteQueue action deletes the queue specified by the queue URL,
|
* Provides synchronous access to Permission features.
|
||||||
* regardless of whether the queue is empty. If the specified queue does not
|
|
||||||
* exist, SQS returns a successful response.
|
|
||||||
*
|
|
||||||
* <h4>Caution</h4>
|
|
||||||
*
|
|
||||||
* Use DeleteQueue with care; once you delete your queue, any messages in the
|
|
||||||
* queue are no longer available.
|
|
||||||
*
|
|
||||||
* When you delete a queue, the deletion process takes up to 60 seconds.
|
|
||||||
* Requests you send involving that queue during the 60 seconds might
|
|
||||||
* succeed. For example, a SendMessage request might succeed, but after the
|
|
||||||
* 60 seconds, the queue and that message you sent no longer exist. Also,
|
|
||||||
* when you delete a queue, you must wait at least 60 seconds before creating
|
|
||||||
* a queue with the same name.
|
|
||||||
*
|
|
||||||
* We reserve the right to delete queues that have had no activity for more
|
|
||||||
* than 30 days. For more information, see About SQS Queues in the Amazon SQS
|
|
||||||
* Developer Guide.
|
|
||||||
*
|
|
||||||
* @param queue
|
|
||||||
* queue you want to delete
|
|
||||||
*/
|
*/
|
||||||
void deleteQueue(URI queue);
|
@Delegate
|
||||||
|
PermissionApi getPermissionApiForQueue(@EndpointParam URI queue);
|
||||||
|
|
||||||
/**
|
|
||||||
* The DeleteMessage action deletes the specified message from the specified
|
|
||||||
* queue. You specify the message by using the message's receipt handle and
|
|
||||||
* not the message ID you received when you sent the message. Even if the
|
|
||||||
* message is locked by another reader due to the visibility timeout setting,
|
|
||||||
* it is still deleted from the queue. If you leave a message in the queue
|
|
||||||
* for more than 4 days, SQS automatically deletes it.
|
|
||||||
*
|
|
||||||
* <h4>Note</h4>
|
|
||||||
*
|
|
||||||
* The receipt handle is associated with a specific instance of receiving the
|
|
||||||
* message. If you receive a message more than once, the receipt handle you
|
|
||||||
* get each time you receive the message is different. When you request
|
|
||||||
* DeleteMessage, if you don't provide the most recently received receipt
|
|
||||||
* handle for the message, the request will still succeed, but the message
|
|
||||||
* might not be deleted.
|
|
||||||
*
|
|
||||||
* <h4>Important</h4>
|
|
||||||
*
|
|
||||||
* It is possible you will receive a message even after you have deleted it.
|
|
||||||
* This might happen on rare occasions if one of the servers storing a copy
|
|
||||||
* of the message is unavailable when you request to delete the message. The
|
|
||||||
* copy remains on the server and might be returned to you again on a
|
|
||||||
* subsequent receive request. You should create your system to be idempotent
|
|
||||||
* so that receiving a particular message more than once is not a problem.
|
|
||||||
*
|
|
||||||
* @param queue
|
|
||||||
* the queue the message is in
|
|
||||||
* @param receiptHandle
|
|
||||||
* The receipt handle associated with the message you want to
|
|
||||||
* delete.
|
|
||||||
*/
|
|
||||||
void deleteMessage(URI queue, String receiptHandle);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The ChangeMessageVisibility action changes the visibility timeout of a
|
|
||||||
* specified message in a queue to a new value. The maximum allowed timeout
|
|
||||||
* value you can set the value to is 12 hours. This means you can't extend
|
|
||||||
* the timeout of a message in an existing queue to more than a total
|
|
||||||
* visibility timeout of 12 hours. (For more information visibility timeout,
|
|
||||||
* see Visibility Timeout in the Amazon SQS Developer Guide.)
|
|
||||||
*
|
|
||||||
* For example, let's say the timeout for the queue is 30 seconds, and you
|
|
||||||
* receive a message. Once you're 20 seconds into the timeout for that
|
|
||||||
* message (i.e., you have 10 seconds left), you extend it by 60 seconds by
|
|
||||||
* calling ChangeMessageVisibility with VisibilityTimeoutset to 60 seconds.
|
|
||||||
* You have then changed the remaining visibility timeout from 10 seconds to
|
|
||||||
* 60 seconds.
|
|
||||||
*
|
|
||||||
* <h4>Important</h4>
|
|
||||||
*
|
|
||||||
* If you attempt to set the VisibilityTimeout to an amount more than the
|
|
||||||
* maximum time left, Amazon SQS returns an error. It will not automatically
|
|
||||||
* recalculate and increase the timeout to the maximum time remaining.
|
|
||||||
*
|
|
||||||
* <h4>Important</h4>
|
|
||||||
*
|
|
||||||
* Unlike with a queue, when you change the visibility timeout for a specific
|
|
||||||
* message, that timeout value is applied immediately but is not saved in
|
|
||||||
* memory for that message. If you don't delete a message after it is
|
|
||||||
* received, the visibility timeout for the message the next time it is
|
|
||||||
* received reverts to the original timeout value, not the value you set with
|
|
||||||
* the ChangeMessageVisibility action.
|
|
||||||
*
|
|
||||||
* @param queue
|
|
||||||
* the queue the message is in
|
|
||||||
* @param receiptHandle
|
|
||||||
* The receipt handle associated with the message whose visibility
|
|
||||||
* timeout you want to change. This parameter is returned by the
|
|
||||||
* ReceiveMessage action.
|
|
||||||
* @param visibilityTimeout
|
|
||||||
* The new value for the message's visibility timeout (in seconds)
|
|
||||||
* from 0 to 43200 (maximum 12 hours)
|
|
||||||
*/
|
|
||||||
void changeMessageVisibility(URI queue, String receiptHandle, int visibilityTimeout);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The AddPermission action adds a permission to a queue for a specific
|
|
||||||
* principal. This allows for sharing access to the queue.
|
|
||||||
*
|
|
||||||
* When you create a queue, you have full control access rights for the
|
|
||||||
* queue. Only you (as owner of the queue) can grant or deny permissions to
|
|
||||||
* the queue. For more information about these permissions, see Shared Queues
|
|
||||||
* in the Amazon SQS Developer Guide.
|
|
||||||
*
|
|
||||||
* Note
|
|
||||||
*
|
|
||||||
* AddPermission writes an SQS-generated policy. If you want to write your
|
|
||||||
* own policy, use SetQueueAttributes to upload your policy.
|
|
||||||
*
|
|
||||||
* @param queue
|
|
||||||
* queue to change permissions on
|
|
||||||
* @param label
|
|
||||||
*
|
|
||||||
* The unique identification of the permission you're setting.
|
|
||||||
* example: AliceSendMessage
|
|
||||||
*
|
|
||||||
* Constraints: Maximum 80 characters; alphanumeric characters,
|
|
||||||
* hyphens (-), and underscores (_) are allowed.
|
|
||||||
* @param permission
|
|
||||||
* The action you want to allow for the specified principal.
|
|
||||||
* @param accountId
|
|
||||||
* The AWS account number of the principal who will be given
|
|
||||||
* permission. The principal must have an AWS account, but does not
|
|
||||||
* need to be signed up for Amazon SQS. For information about
|
|
||||||
* locating the AWS account identification, see Your AWS
|
|
||||||
* Identifiers in the Amazon SQS Developer Guide.
|
|
||||||
*
|
|
||||||
* Constraints: Valid 12-digit AWS account number, without hyphens
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
void addPermissionToAccount(URI queue, String label, Action permission, String accountId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The RemovePermission action revokes any permissions in the queue policy
|
|
||||||
* that matches the Label parameter. Only the owner of the queue can remove
|
|
||||||
* permissions.
|
|
||||||
*
|
|
||||||
* @param queue
|
|
||||||
* queue to change permissions on
|
|
||||||
*
|
|
||||||
* @param label
|
|
||||||
* The identification of the permission you want to remove. This is
|
|
||||||
* the label you added in AddPermission. example: AliceSendMessage
|
|
||||||
*/
|
|
||||||
void removePermission(URI queue, String label);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The SendMessage action delivers a message to the specified queue. The
|
|
||||||
* maximum allowed message size is 64 KB.
|
|
||||||
*
|
|
||||||
* <h4>Important</h4>
|
|
||||||
*
|
|
||||||
* The following list shows the characters (in Unicode) allowed in your
|
|
||||||
* message, according to the W3C XML specification (for more information, go
|
|
||||||
* to http://www.w3.org/TR/REC-xml/#charsets). If you send any characters not
|
|
||||||
* included in the list, your request will be rejected.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* {@code #x9 | #xA | #xD | [#x20 to #xD7FF] | [#xE000 to #xFFFD] | [#x10000 to #x10FFFF]}
|
|
||||||
*
|
|
||||||
* @param queue
|
|
||||||
* queue you want to send to
|
|
||||||
*
|
|
||||||
* @param message
|
|
||||||
* Type: String maximum 64 KB in size. For a list of allowed
|
|
||||||
* characters, see the preceding important note.
|
|
||||||
* @return id of the message and md5 of the content sent
|
|
||||||
*/
|
|
||||||
MessageIdAndMD5 sendMessage(URI queue, String message);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* same as {@link #sendMessage(URI, String)} except you can control options
|
|
||||||
* such as delay seconds.
|
|
||||||
*
|
|
||||||
* @param options
|
|
||||||
* options such as delay seconds
|
|
||||||
* @see #sendMessage(URI, String)
|
|
||||||
*/
|
|
||||||
MessageIdAndMD5 sendMessage(URI queue, String message, SendMessageOptions options);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The ReceiveMessage action retrieves one or more messages from the
|
|
||||||
* specified queue. The ReceiveMessage action does not delete the message
|
|
||||||
* after it is retrieved. To delete a message, you must use the DeleteMessage
|
|
||||||
* action. For more information about message deletion in the message life
|
|
||||||
* cycle, see Message Lifecycle.
|
|
||||||
*
|
|
||||||
* <h4>Note</h4>
|
|
||||||
*
|
|
||||||
* Due to the distributed nature of the queue, a weighted random set of
|
|
||||||
* machines is sampled on a ReceiveMessage call. That means only the messages
|
|
||||||
* on the sampled machines are returned. If the number of messages in the
|
|
||||||
* queue is small (less than 1000), it is likely you will get fewer messages
|
|
||||||
* than you requested per ReceiveMessage call. If the number of messages in
|
|
||||||
* the queue is extremely small, you might not receive any messages in a
|
|
||||||
* particular ReceiveMessage response; in which case you should repeat the
|
|
||||||
* request.
|
|
||||||
*
|
|
||||||
* @param queue
|
|
||||||
* from where you are receiving messages
|
|
||||||
* @return message including the receipt handle you can use to delete it
|
|
||||||
*/
|
|
||||||
Message receiveMessage(URI queue);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* same as {@link #receiveMessage(URI)} except you can provide options like
|
|
||||||
* VisibilityTimeout parameter in your request, which will be applied to the
|
|
||||||
* messages that SQS returns in the response. If you do not include the
|
|
||||||
* parameter, the overall visibility timeout for the queue is used for the
|
|
||||||
* returned messages.
|
|
||||||
*
|
|
||||||
* @param options
|
|
||||||
* options such as VisibilityTimeout
|
|
||||||
* @see #receiveMessage(URI)
|
|
||||||
*/
|
|
||||||
Message receiveMessage(URI queue, ReceiveMessageOptions options);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* same as {@link #receiveMessage(URI)} except you can receive multiple
|
|
||||||
* messages.
|
|
||||||
*
|
|
||||||
* @param max
|
|
||||||
* maximum messages to receive, current limit is 10
|
|
||||||
* @see #receiveMessage(URI)
|
|
||||||
*/
|
|
||||||
Set<Message> receiveMessages(URI queue, int max);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* returns all attributes of a queue.
|
|
||||||
*
|
|
||||||
* @param queue
|
|
||||||
* queue to get the attributes of
|
|
||||||
*/
|
|
||||||
QueueAttributes getQueueAttributes(URI queue);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The SetQueueAttributes action sets one attribute of a queue per request.
|
|
||||||
* When you change a queue's attributes, the change can take up to 60 seconds
|
|
||||||
* to propagate throughout the SQS system.
|
|
||||||
*
|
|
||||||
* @param queue
|
|
||||||
* queue to set the attribute on
|
|
||||||
* @param name
|
|
||||||
*
|
|
||||||
* The name of the attribute you want to set.
|
|
||||||
*
|
|
||||||
* VisibilityTimeout - The length of time (in seconds) that a
|
|
||||||
* message received from a queue will be invisible to other
|
|
||||||
* receiving components when they ask to receive messages. For more
|
|
||||||
* information about VisibilityTimeout, see Visibility Timeout in
|
|
||||||
* the Amazon SQS Developer Guide.
|
|
||||||
*
|
|
||||||
* Policy - The formal description of the permissions for a
|
|
||||||
* resource. For more information about Policy, see Basic Policy
|
|
||||||
* Structure in the Amazon SQS Developer Guide.
|
|
||||||
*
|
|
||||||
* MaximumMessageSize - The limit of how many bytes a message can
|
|
||||||
* contain before Amazon SQS rejects it.
|
|
||||||
*
|
|
||||||
* MessageRetentionPeriod - The number of seconds Amazon SQS
|
|
||||||
* retains a message.
|
|
||||||
*
|
|
||||||
* DelaySeconds - The time in seconds that the delivery of all
|
|
||||||
* messages in the queue will be delayed.
|
|
||||||
* @param value
|
|
||||||
* The value of the attribute you want to set. To delete a queue's
|
|
||||||
* access control policy, set the policy to "".
|
|
||||||
*
|
|
||||||
* Constraints: Constraints are specific for each value.
|
|
||||||
*
|
|
||||||
* VisibilityTimeout - An integer from 0 to 43200 (12 hours). The
|
|
||||||
* default for this attribute is 30 seconds.
|
|
||||||
*
|
|
||||||
* Policy - A valid form-url-encoded policy. For more information
|
|
||||||
* about policy structure, see Basic Policy Structure in the Amazon
|
|
||||||
* SQS Developer Guide. For more information about
|
|
||||||
* form-url-encoding, see
|
|
||||||
* http://www.w3.org/MarkUp/html-spec/html-spec_8.html#SEC8.2.1.
|
|
||||||
*
|
|
||||||
* MaximumMessageSize - An integer from 1024 bytes (1 KiB) up to
|
|
||||||
* 65536 bytes (64 KiB). The default for this attribute is 65536
|
|
||||||
* (64 KiB).
|
|
||||||
*
|
|
||||||
* MessageRetentionPeriod - Integer representing seconds, from 60
|
|
||||||
* (1 minute) to 1209600 (14 days). The default for this attribute
|
|
||||||
* is 345600 (4 days).
|
|
||||||
*
|
|
||||||
* DelaySeconds - An integer from 0 to 900 (15 minutes). The
|
|
||||||
* default for this attribute is 0.
|
|
||||||
*/
|
|
||||||
void setQueueAttribute(URI queue, String name, String value);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* returns some attributes of a queue.
|
|
||||||
*
|
|
||||||
* @param queue
|
|
||||||
* queue to get the attributes of
|
|
||||||
*/
|
|
||||||
Map<String, String> getQueueAttributes(URI queue, Iterable<String> attributeNames);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* returns an attribute of a queue.
|
|
||||||
*
|
|
||||||
* @param queue
|
|
||||||
* queue to get the attributes of
|
|
||||||
*/
|
|
||||||
String getQueueAttribute(URI queue, String attributeName);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* same as {@link #receiveMessages(URI, int)} except you can provide options
|
|
||||||
* like VisibilityTimeout parameter in your request, which will be applied to
|
|
||||||
* the messages that SQS returns in the response. If you do not include the
|
|
||||||
* parameter, the overall visibility timeout for the queue is used for the
|
|
||||||
* returned messages.
|
|
||||||
*
|
|
||||||
* @param options
|
|
||||||
* options such as VisibilityTimeout
|
|
||||||
* @see #receiveMessages(URI, int)
|
|
||||||
*/
|
|
||||||
Set<Message> receiveMessages(URI queue, int max, ReceiveMessageOptions options);
|
|
||||||
}
|
}
|
||||||
|
@ -18,243 +18,62 @@
|
|||||||
*/
|
*/
|
||||||
package org.jclouds.sqs;
|
package org.jclouds.sqs;
|
||||||
|
|
||||||
import static org.jclouds.sqs.reference.SQSParameters.ACTION;
|
|
||||||
import static org.jclouds.sqs.reference.SQSParameters.VERSION;
|
|
||||||
|
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.ws.rs.FormParam;
|
|
||||||
import javax.ws.rs.POST;
|
|
||||||
import javax.ws.rs.Path;
|
|
||||||
|
|
||||||
import org.jclouds.Constants;
|
|
||||||
import org.jclouds.aws.filters.FormSigner;
|
import org.jclouds.aws.filters.FormSigner;
|
||||||
import org.jclouds.javax.annotation.Nullable;
|
import org.jclouds.javax.annotation.Nullable;
|
||||||
|
import org.jclouds.location.Region;
|
||||||
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
|
import org.jclouds.location.functions.RegionToEndpointOrProviderIfNull;
|
||||||
import org.jclouds.rest.annotations.BinderParam;
|
import org.jclouds.rest.annotations.Delegate;
|
||||||
import org.jclouds.rest.annotations.EndpointParam;
|
import org.jclouds.rest.annotations.EndpointParam;
|
||||||
import org.jclouds.rest.annotations.ExceptionParser;
|
|
||||||
import org.jclouds.rest.annotations.FormParams;
|
|
||||||
import org.jclouds.rest.annotations.RequestFilters;
|
import org.jclouds.rest.annotations.RequestFilters;
|
||||||
import org.jclouds.rest.annotations.ResponseParser;
|
|
||||||
import org.jclouds.rest.annotations.Transform;
|
|
||||||
import org.jclouds.rest.annotations.VirtualHost;
|
import org.jclouds.rest.annotations.VirtualHost;
|
||||||
import org.jclouds.rest.annotations.XMLResponseParser;
|
|
||||||
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
|
|
||||||
import org.jclouds.sqs.binders.BindAttributeNamesToIndexedFormParams;
|
|
||||||
import org.jclouds.sqs.domain.Action;
|
|
||||||
import org.jclouds.sqs.domain.Message;
|
|
||||||
import org.jclouds.sqs.domain.MessageIdAndMD5;
|
|
||||||
import org.jclouds.sqs.domain.QueueAttributes;
|
|
||||||
import org.jclouds.sqs.functions.MapToQueueAttributes;
|
|
||||||
import org.jclouds.sqs.options.CreateQueueOptions;
|
|
||||||
import org.jclouds.sqs.options.ListQueuesOptions;
|
|
||||||
import org.jclouds.sqs.options.ReceiveMessageOptions;
|
|
||||||
import org.jclouds.sqs.options.SendMessageOptions;
|
|
||||||
import org.jclouds.sqs.xml.AttributesHandler;
|
|
||||||
import org.jclouds.sqs.xml.MessageHandler;
|
|
||||||
import org.jclouds.sqs.xml.ReceiveMessageResponseHandler;
|
|
||||||
import org.jclouds.sqs.xml.RegexListQueuesResponseHandler;
|
|
||||||
import org.jclouds.sqs.xml.RegexMessageIdAndMD5Handler;
|
|
||||||
import org.jclouds.sqs.xml.RegexQueueHandler;
|
|
||||||
import org.jclouds.sqs.xml.ValueHandler;
|
|
||||||
|
|
||||||
import com.google.common.util.concurrent.ListenableFuture;
|
import com.google.common.annotations.Beta;
|
||||||
|
import com.google.inject.Provides;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides access to SQS via their REST API.
|
* Provides access to SQS via REST API.
|
||||||
* <p/>
|
* <p/>
|
||||||
*
|
*
|
||||||
|
* @see <a
|
||||||
|
* href="http://docs.amazonwebservices.com/AWSSimpleQueueService/2011-10-01/APIReference/Welcome.html">SQS
|
||||||
|
* documentation</a>
|
||||||
* @author Adrian Cole
|
* @author Adrian Cole
|
||||||
*/
|
*/
|
||||||
|
@Beta
|
||||||
@RequestFilters(FormSigner.class)
|
@RequestFilters(FormSigner.class)
|
||||||
@FormParams(keys = VERSION, values = "{" + Constants.PROPERTY_API_VERSION + "}")
|
|
||||||
@VirtualHost
|
@VirtualHost
|
||||||
public interface SQSAsyncApi {
|
public interface SQSAsyncApi {
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return the Region codes configured
|
||||||
|
*/
|
||||||
|
@Provides
|
||||||
|
@Region
|
||||||
|
Set<String> getConfiguredRegions();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see SQSApi#listQueuesInRegion
|
* Provides asynchronous access to Queue features.
|
||||||
*/
|
*/
|
||||||
@POST
|
@Delegate
|
||||||
@Path("/")
|
QueueAsyncApi getQueueApi();
|
||||||
@FormParams(keys = ACTION, values = "ListQueues")
|
|
||||||
@ResponseParser(RegexListQueuesResponseHandler.class)
|
@Delegate
|
||||||
ListenableFuture<Set<URI>> listQueuesInRegion(
|
QueueAsyncApi getQueueApiForRegion(
|
||||||
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
|
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see SQSApi#listQueuesInRegion
|
* Provides asynchronous access to Message features.
|
||||||
*/
|
*/
|
||||||
@POST
|
@Delegate
|
||||||
@Path("/")
|
MessageAsyncApi getMessageApiForQueue(@EndpointParam URI queue);
|
||||||
@FormParams(keys = ACTION, values = "ListQueues")
|
|
||||||
@ResponseParser(RegexListQueuesResponseHandler.class)
|
|
||||||
ListenableFuture<Set<URI>> listQueuesInRegion(
|
|
||||||
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
|
|
||||||
ListQueuesOptions options);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see SQSApi#createQueueInRegion
|
* Provides asynchronous access to Permission features.
|
||||||
*/
|
*/
|
||||||
@POST
|
@Delegate
|
||||||
@Path("/")
|
PermissionAsyncApi getPermissionApiForQueue(@EndpointParam URI queue);
|
||||||
@FormParams(keys = ACTION, values = "CreateQueue")
|
|
||||||
@ResponseParser(RegexQueueHandler.class)
|
|
||||||
ListenableFuture<URI> createQueueInRegion(
|
|
||||||
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
|
|
||||||
@FormParam("QueueName") String queueName);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SQSApi#createQueueInRegion
|
|
||||||
*/
|
|
||||||
@POST
|
|
||||||
@Path("/")
|
|
||||||
@FormParams(keys = ACTION, values = "CreateQueue")
|
|
||||||
@ResponseParser(RegexQueueHandler.class)
|
|
||||||
ListenableFuture<URI> createQueueInRegion(
|
|
||||||
@EndpointParam(parser = RegionToEndpointOrProviderIfNull.class) @Nullable String region,
|
|
||||||
@FormParam("QueueName") String queueName, CreateQueueOptions options);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SQSApi#deleteQueue
|
|
||||||
*/
|
|
||||||
@POST
|
|
||||||
@Path("/")
|
|
||||||
@FormParams(keys = ACTION, values = "DeleteQueue")
|
|
||||||
ListenableFuture<Void> deleteQueue(@EndpointParam URI queue);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SQSApi#deleteMessage
|
|
||||||
*/
|
|
||||||
@POST
|
|
||||||
@Path("/")
|
|
||||||
@FormParams(keys = ACTION, values = "DeleteMessage")
|
|
||||||
ListenableFuture<Void> deleteMessage(@EndpointParam URI queue, @FormParam("ReceiptHandle") String receiptHandle);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SQSApi#changeMessageVisibility
|
|
||||||
*/
|
|
||||||
@POST
|
|
||||||
@Path("/")
|
|
||||||
@FormParams(keys = ACTION, values = "ChangeMessageVisibility")
|
|
||||||
ListenableFuture<Void> changeMessageVisibility(@EndpointParam URI queue,
|
|
||||||
@FormParam("ReceiptHandle") String receiptHandle, @FormParam("VisibilityTimeout") int visibilityTimeout);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SQSApi#sendMessage
|
|
||||||
*/
|
|
||||||
@POST
|
|
||||||
@Path("/")
|
|
||||||
@FormParams(keys = ACTION, values = "SendMessage")
|
|
||||||
@ResponseParser(RegexMessageIdAndMD5Handler.class)
|
|
||||||
ListenableFuture<? extends MessageIdAndMD5> sendMessage(@EndpointParam URI queue,
|
|
||||||
@FormParam("MessageBody") String message);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SQSApi#sendMessage
|
|
||||||
*/
|
|
||||||
@POST
|
|
||||||
@Path("/")
|
|
||||||
@FormParams(keys = ACTION, values = "SendMessage")
|
|
||||||
@ResponseParser(RegexMessageIdAndMD5Handler.class)
|
|
||||||
ListenableFuture<? extends MessageIdAndMD5> sendMessage(@EndpointParam URI queue,
|
|
||||||
@FormParam("MessageBody") String message, SendMessageOptions options);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SQSApi#receiveMessage
|
|
||||||
*/
|
|
||||||
@POST
|
|
||||||
@Path("/")
|
|
||||||
@FormParams(keys = ACTION, values = "ReceiveMessage")
|
|
||||||
@XMLResponseParser(MessageHandler.class)
|
|
||||||
ListenableFuture<Message> receiveMessage(@EndpointParam URI queue);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SQSApi#receiveMessage
|
|
||||||
*/
|
|
||||||
@POST
|
|
||||||
@Path("/")
|
|
||||||
@FormParams(keys = ACTION, values = "ReceiveMessage")
|
|
||||||
@XMLResponseParser(MessageHandler.class)
|
|
||||||
ListenableFuture<? extends Message> receiveMessage(@EndpointParam URI queue, ReceiveMessageOptions options);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SQSApi#getQueueAttributes(URI)
|
|
||||||
*/
|
|
||||||
@POST
|
|
||||||
@Path("/")
|
|
||||||
@FormParams(keys = { ACTION, "AttributeName.1" }, values = { "GetQueueAttributes", "All" })
|
|
||||||
@Transform(MapToQueueAttributes.class)
|
|
||||||
@ExceptionParser(ReturnNullOnNotFoundOr404.class)
|
|
||||||
@XMLResponseParser(AttributesHandler.class)
|
|
||||||
ListenableFuture<? extends QueueAttributes> getQueueAttributes(@EndpointParam URI queue);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SQSApi#getQueueAttributes(URI, Iterable)
|
|
||||||
*/
|
|
||||||
@POST
|
|
||||||
@Path("/")
|
|
||||||
@FormParams(keys = ACTION, values = "GetQueueAttributes")
|
|
||||||
@XMLResponseParser(AttributesHandler.class)
|
|
||||||
ListenableFuture<Map<String, String>> getQueueAttributes(@EndpointParam URI queue,
|
|
||||||
@BinderParam(BindAttributeNamesToIndexedFormParams.class) Iterable<String> attributeNames);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SQSApi#getQueueAttribute
|
|
||||||
*/
|
|
||||||
@POST
|
|
||||||
@Path("/")
|
|
||||||
@FormParams(keys = ACTION, values = "GetQueueAttributes")
|
|
||||||
@XMLResponseParser(ValueHandler.class)
|
|
||||||
ListenableFuture<String> getQueueAttribute(@EndpointParam URI queue,
|
|
||||||
@FormParam("AttributeName.1") String attributeName);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SQSApi#setQueueAttribute
|
|
||||||
*/
|
|
||||||
@POST
|
|
||||||
@Path("/")
|
|
||||||
@FormParams(keys = ACTION, values = "SetQueueAttributes")
|
|
||||||
ListenableFuture<Void> setQueueAttribute(@EndpointParam URI queue, @FormParam("Attribute.Name") String name,
|
|
||||||
@FormParam("Attribute.Value") String value);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SQSApi#receiveMessages
|
|
||||||
*/
|
|
||||||
@POST
|
|
||||||
@Path("/")
|
|
||||||
@FormParams(keys = ACTION, values = "ReceiveMessage")
|
|
||||||
@XMLResponseParser(ReceiveMessageResponseHandler.class)
|
|
||||||
ListenableFuture<? extends Set<? extends Message>> receiveMessages(@EndpointParam URI queue,
|
|
||||||
@FormParam("MaxNumberOfMessages") int max);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SQSApi#receiveMessages
|
|
||||||
*/
|
|
||||||
@POST
|
|
||||||
@Path("/")
|
|
||||||
@FormParams(keys = ACTION, values = "ReceiveMessage")
|
|
||||||
@XMLResponseParser(ReceiveMessageResponseHandler.class)
|
|
||||||
ListenableFuture<? extends Set<? extends Message>> receiveMessages(@EndpointParam URI queue,
|
|
||||||
@FormParam("MaxNumberOfMessages") int max, ReceiveMessageOptions options);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SQSApi#addPermissionToAccount
|
|
||||||
*/
|
|
||||||
@POST
|
|
||||||
@Path("/")
|
|
||||||
@FormParams(keys = ACTION, values = "AddPermission")
|
|
||||||
ListenableFuture<Void> addPermissionToAccount(@EndpointParam URI queue, @FormParam("Label") String label,
|
|
||||||
@FormParam("ActionName.1") Action permission, @FormParam("AWSAccountId.1") String accountId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @see SQSApi#removePermission
|
|
||||||
*/
|
|
||||||
@POST
|
|
||||||
@Path("/")
|
|
||||||
@FormParams(keys = ACTION, values = "RemovePermission")
|
|
||||||
ListenableFuture<Void> removePermission(@EndpointParam URI queue, @FormParam("Label") String label);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.jclouds.sqs.config;
|
package org.jclouds.sqs.config;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import org.jclouds.aws.config.FormSigningRestClientModule;
|
import org.jclouds.aws.config.FormSigningRestClientModule;
|
||||||
import org.jclouds.http.HttpErrorHandler;
|
import org.jclouds.http.HttpErrorHandler;
|
||||||
import org.jclouds.http.HttpRetryHandler;
|
import org.jclouds.http.HttpRetryHandler;
|
||||||
@ -25,11 +27,18 @@ import org.jclouds.http.annotation.ClientError;
|
|||||||
import org.jclouds.http.annotation.Redirection;
|
import org.jclouds.http.annotation.Redirection;
|
||||||
import org.jclouds.http.annotation.ServerError;
|
import org.jclouds.http.annotation.ServerError;
|
||||||
import org.jclouds.rest.ConfiguresRestClient;
|
import org.jclouds.rest.ConfiguresRestClient;
|
||||||
|
import org.jclouds.sqs.MessageApi;
|
||||||
|
import org.jclouds.sqs.MessageAsyncApi;
|
||||||
|
import org.jclouds.sqs.PermissionApi;
|
||||||
|
import org.jclouds.sqs.PermissionAsyncApi;
|
||||||
|
import org.jclouds.sqs.QueueApi;
|
||||||
|
import org.jclouds.sqs.QueueAsyncApi;
|
||||||
import org.jclouds.sqs.SQSApi;
|
import org.jclouds.sqs.SQSApi;
|
||||||
import org.jclouds.sqs.SQSAsyncApi;
|
import org.jclouds.sqs.SQSAsyncApi;
|
||||||
import org.jclouds.sqs.handlers.ParseSQSErrorFromXmlContent;
|
import org.jclouds.sqs.handlers.ParseSQSErrorFromXmlContent;
|
||||||
import org.jclouds.sqs.handlers.SQSErrorRetryHandler;
|
import org.jclouds.sqs.handlers.SQSErrorRetryHandler;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
import com.google.common.reflect.TypeToken;
|
import com.google.common.reflect.TypeToken;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -39,9 +48,14 @@ import com.google.common.reflect.TypeToken;
|
|||||||
*/
|
*/
|
||||||
@ConfiguresRestClient
|
@ConfiguresRestClient
|
||||||
public class SQSRestClientModule extends FormSigningRestClientModule<SQSApi, SQSAsyncApi> {
|
public class SQSRestClientModule extends FormSigningRestClientModule<SQSApi, SQSAsyncApi> {
|
||||||
|
public static final Map<Class<?>, Class<?>> DELEGATE_MAP = ImmutableMap.<Class<?>, Class<?>> builder()//
|
||||||
|
.put(QueueApi.class, QueueAsyncApi.class)
|
||||||
|
.put(MessageApi.class, MessageAsyncApi.class)
|
||||||
|
.put(PermissionApi.class, PermissionAsyncApi.class)
|
||||||
|
.build();
|
||||||
|
|
||||||
public SQSRestClientModule() {
|
public SQSRestClientModule() {
|
||||||
super(TypeToken.of(SQSApi.class), TypeToken.of(SQSAsyncApi.class));
|
super(TypeToken.of(SQSApi.class), TypeToken.of(SQSAsyncApi.class), DELEGATE_MAP);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -42,6 +42,8 @@ import com.google.common.collect.Iterables;
|
|||||||
@Test(groups = "unit", testName = "SQSApiExpectTest")
|
@Test(groups = "unit", testName = "SQSApiExpectTest")
|
||||||
public class SQSApiExpectTest extends BaseSQSApiExpectTest {
|
public class SQSApiExpectTest extends BaseSQSApiExpectTest {
|
||||||
|
|
||||||
|
URI queue = URI.create("https://sqs.us-east-1.amazonaws.com/993194456877/adrian-sqs11/");
|
||||||
|
|
||||||
public HttpRequest createQueue = HttpRequest.builder()
|
public HttpRequest createQueue = HttpRequest.builder()
|
||||||
.method("POST")
|
.method("POST")
|
||||||
.endpoint("https://sqs.us-east-1.amazonaws.com/")
|
.endpoint("https://sqs.us-east-1.amazonaws.com/")
|
||||||
@ -62,7 +64,8 @@ public class SQSApiExpectTest extends BaseSQSApiExpectTest {
|
|||||||
|
|
||||||
SQSApi apiWhenExist = requestSendsResponse(createQueue, createQueueResponse);
|
SQSApi apiWhenExist = requestSendsResponse(createQueue, createQueueResponse);
|
||||||
|
|
||||||
assertEquals(apiWhenExist.createQueueInRegion(null, "queueName").toString(), new CreateQueueResponseTest().expected().toString());
|
assertEquals(apiWhenExist.getQueueApi().create("queueName").toString(), new CreateQueueResponseTest().expected()
|
||||||
|
.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public HttpRequest sendMessage = HttpRequest.builder()
|
public HttpRequest sendMessage = HttpRequest.builder()
|
||||||
@ -85,7 +88,8 @@ public class SQSApiExpectTest extends BaseSQSApiExpectTest {
|
|||||||
|
|
||||||
SQSApi apiWhenExist = requestSendsResponse(sendMessage, sendMessageResponse);
|
SQSApi apiWhenExist = requestSendsResponse(sendMessage, sendMessageResponse);
|
||||||
|
|
||||||
assertEquals(apiWhenExist.sendMessage(URI.create("https://sqs.us-east-1.amazonaws.com/993194456877/adrian-sqs11/"), "hardyharhar").toString(), new SendMessageResponseTest().expected().toString());
|
assertEquals(apiWhenExist.getMessageApiForQueue(queue).send("hardyharhar").toString(),
|
||||||
|
new SendMessageResponseTest().expected().toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -108,9 +112,8 @@ public class SQSApiExpectTest extends BaseSQSApiExpectTest {
|
|||||||
|
|
||||||
SQSApi apiWhenExist = requestSendsResponse(receiveMessage, receiveMessageResponse);
|
SQSApi apiWhenExist = requestSendsResponse(receiveMessage, receiveMessageResponse);
|
||||||
|
|
||||||
assertEquals(
|
assertEquals(apiWhenExist.getMessageApiForQueue(queue).receive().toString(),
|
||||||
apiWhenExist.receiveMessage(URI.create("https://sqs.us-east-1.amazonaws.com/993194456877/adrian-sqs11/"))
|
Iterables.get(new ReceiveMessageResponseTest().expected(), 0).toString());
|
||||||
.toString(), Iterables.get(new ReceiveMessageResponseTest().expected(), 0).toString());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -134,9 +137,8 @@ public class SQSApiExpectTest extends BaseSQSApiExpectTest {
|
|||||||
|
|
||||||
SQSApi apiWhenExist = requestSendsResponse(receiveMessages, receiveMessagesResponse);
|
SQSApi apiWhenExist = requestSendsResponse(receiveMessages, receiveMessagesResponse);
|
||||||
|
|
||||||
assertEquals(
|
assertEquals(apiWhenExist.getMessageApiForQueue(queue).receive(10).toString(), new ReceiveMessageResponseTest()
|
||||||
apiWhenExist.receiveMessages(URI.create("https://sqs.us-east-1.amazonaws.com/993194456877/adrian-sqs11/"), 10)
|
.expected().toString());
|
||||||
.toString(), new ReceiveMessageResponseTest().expected().toString());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public HttpRequest deleteMessage = HttpRequest.builder()
|
public HttpRequest deleteMessage = HttpRequest.builder()
|
||||||
@ -163,8 +165,7 @@ public class SQSApiExpectTest extends BaseSQSApiExpectTest {
|
|||||||
|
|
||||||
SQSApi apiWhenExist = requestSendsResponse(deleteMessage, deleteMessageResponse);
|
SQSApi apiWhenExist = requestSendsResponse(deleteMessage, deleteMessageResponse);
|
||||||
|
|
||||||
apiWhenExist.deleteMessage(URI.create("https://sqs.us-east-1.amazonaws.com/993194456877/adrian-sqs11/"),
|
apiWhenExist.getMessageApiForQueue(queue).delete("eXJYhj5rDr9cAe");
|
||||||
"eXJYhj5rDr9cAe");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -193,8 +194,7 @@ public class SQSApiExpectTest extends BaseSQSApiExpectTest {
|
|||||||
|
|
||||||
SQSApi apiWhenExist = requestSendsResponse(changeMessageVisibility, changeMessageVisibilityResponse);
|
SQSApi apiWhenExist = requestSendsResponse(changeMessageVisibility, changeMessageVisibilityResponse);
|
||||||
|
|
||||||
apiWhenExist.changeMessageVisibility(URI.create("https://sqs.us-east-1.amazonaws.com/993194456877/adrian-sqs11/"),
|
apiWhenExist.getMessageApiForQueue(queue).changeVisibility("eXJYhj5rDr9cAe", 10);
|
||||||
"eXJYhj5rDr9cAe", 10);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public HttpRequest getQueueAttribute = HttpRequest.builder()
|
public HttpRequest getQueueAttribute = HttpRequest.builder()
|
||||||
@ -221,7 +221,7 @@ public class SQSApiExpectTest extends BaseSQSApiExpectTest {
|
|||||||
|
|
||||||
SQSApi apiWhenExist = requestSendsResponse(getQueueAttribute, getQueueAttributeResponse);
|
SQSApi apiWhenExist = requestSendsResponse(getQueueAttribute, getQueueAttributeResponse);
|
||||||
|
|
||||||
assertEquals(apiWhenExist.getQueueAttribute(URI.create("https://sqs.us-east-1.amazonaws.com/993194456877/adrian-sqs11/"), "VisibilityTimeout"), "30");
|
assertEquals(apiWhenExist.getQueueApi().getAttribute(queue, "VisibilityTimeout"), "30");
|
||||||
}
|
}
|
||||||
|
|
||||||
public HttpRequest getQueueAttributes = HttpRequest.builder()
|
public HttpRequest getQueueAttributes = HttpRequest.builder()
|
||||||
@ -244,7 +244,8 @@ public class SQSApiExpectTest extends BaseSQSApiExpectTest {
|
|||||||
|
|
||||||
SQSApi apiWhenExist = requestSendsResponse(getQueueAttributes, getQueueAttributesResponse);
|
SQSApi apiWhenExist = requestSendsResponse(getQueueAttributes, getQueueAttributesResponse);
|
||||||
|
|
||||||
assertEquals(apiWhenExist.getQueueAttributes(URI.create("https://sqs.us-east-1.amazonaws.com/993194456877/adrian-sqs11/")).toString(), new MapToQueueAttributesTest().expected().toString());
|
assertEquals(apiWhenExist.getQueueApi().getAttributes(queue).toString(), new MapToQueueAttributesTest()
|
||||||
|
.expected().toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public HttpRequest getQueueAttributesSubset = HttpRequest.builder()
|
public HttpRequest getQueueAttributesSubset = HttpRequest.builder()
|
||||||
@ -268,10 +269,8 @@ public class SQSApiExpectTest extends BaseSQSApiExpectTest {
|
|||||||
|
|
||||||
SQSApi apiWhenExist = requestSendsResponse(getQueueAttributesSubset, getQueueAttributesSubsetResponse);
|
SQSApi apiWhenExist = requestSendsResponse(getQueueAttributesSubset, getQueueAttributesSubsetResponse);
|
||||||
|
|
||||||
assertEquals(
|
assertEquals(apiWhenExist.getQueueApi()
|
||||||
apiWhenExist.getQueueAttributes(
|
.getAttributes(queue, ImmutableSet.of("VisibilityTimeout", "DelaySeconds")).toString(),
|
||||||
URI.create("https://sqs.us-east-1.amazonaws.com/993194456877/adrian-sqs11/"),
|
|
||||||
ImmutableSet.of("VisibilityTimeout", "DelaySeconds")).toString(),
|
|
||||||
new GetQueueAttributesResponseTest().expected().toString());
|
new GetQueueAttributesResponseTest().expected().toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -300,8 +299,7 @@ public class SQSApiExpectTest extends BaseSQSApiExpectTest {
|
|||||||
|
|
||||||
SQSApi apiWhenExist = requestSendsResponse(setQueueAttribute, setQueueAttributeResponse);
|
SQSApi apiWhenExist = requestSendsResponse(setQueueAttribute, setQueueAttributeResponse);
|
||||||
|
|
||||||
apiWhenExist.setQueueAttribute(URI.create("https://sqs.us-east-1.amazonaws.com/993194456877/adrian-sqs11/"),
|
apiWhenExist.getQueueApi().setAttribute(queue, "MaximumMessageSize", "1");
|
||||||
"MaximumMessageSize", "1");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public HttpRequest addPermission = HttpRequest.builder()
|
public HttpRequest addPermission = HttpRequest.builder()
|
||||||
@ -330,7 +328,7 @@ public class SQSApiExpectTest extends BaseSQSApiExpectTest {
|
|||||||
|
|
||||||
SQSApi apiWhenExist = requestSendsResponse(addPermission, addPermissionResponse);
|
SQSApi apiWhenExist = requestSendsResponse(addPermission, addPermissionResponse);
|
||||||
|
|
||||||
apiWhenExist.addPermissionToAccount(URI.create("https://sqs.us-east-1.amazonaws.com/993194456877/adrian-sqs11/"), "testLabel", Action.RECEIVE_MESSAGE, "125074342641");
|
apiWhenExist.getPermissionApiForQueue(queue).addPermissionToAccount("testLabel", Action.RECEIVE_MESSAGE, "125074342641");
|
||||||
}
|
}
|
||||||
|
|
||||||
public HttpRequest removePermission = HttpRequest.builder()
|
public HttpRequest removePermission = HttpRequest.builder()
|
||||||
@ -357,6 +355,6 @@ public class SQSApiExpectTest extends BaseSQSApiExpectTest {
|
|||||||
|
|
||||||
SQSApi apiWhenExist = requestSendsResponse(removePermission, removePermissionResponse);
|
SQSApi apiWhenExist = requestSendsResponse(removePermission, removePermissionResponse);
|
||||||
|
|
||||||
apiWhenExist.removePermission(URI.create("https://sqs.us-east-1.amazonaws.com/993194456877/adrian-sqs11/"), "testLabel");
|
apiWhenExist.getPermissionApiForQueue(queue).remove("testLabel");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.jclouds.sqs;
|
package org.jclouds.sqs;
|
||||||
|
|
||||||
|
import static com.google.common.collect.Iterables.get;
|
||||||
|
import static com.google.common.collect.Iterables.getLast;
|
||||||
import static org.jclouds.concurrent.MoreExecutors.sameThreadExecutor;
|
import static org.jclouds.concurrent.MoreExecutors.sameThreadExecutor;
|
||||||
import static org.jclouds.providers.AnonymousProviderMetadata.forClientMappedToAsyncClientOnEndpoint;
|
import static org.jclouds.providers.AnonymousProviderMetadata.forClientMappedToAsyncClientOnEndpoint;
|
||||||
import static org.jclouds.sqs.options.ListQueuesOptions.Builder.queuePrefix;
|
import static org.jclouds.sqs.options.ListQueuesOptions.Builder.queuePrefix;
|
||||||
@ -30,7 +32,6 @@ import static org.testng.Assert.assertNull;
|
|||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.SortedSet;
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
import javax.ws.rs.POST;
|
import javax.ws.rs.POST;
|
||||||
@ -51,7 +52,6 @@ import org.testng.annotations.Test;
|
|||||||
import com.google.common.base.Charsets;
|
import com.google.common.base.Charsets;
|
||||||
import com.google.common.base.Splitter;
|
import com.google.common.base.Splitter;
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
import com.google.common.collect.Iterables;
|
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
import com.google.common.hash.HashCode;
|
import com.google.common.hash.HashCode;
|
||||||
import com.google.common.hash.Hashing;
|
import com.google.common.hash.Hashing;
|
||||||
@ -74,10 +74,10 @@ public class SQSApiLiveTest extends BaseSQSApiLiveTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void listQueuesInRegion(String region) throws InterruptedException {
|
protected void listQueuesInRegion(String region) throws InterruptedException {
|
||||||
SortedSet<URI> allResults = Sets.newTreeSet(api().listQueuesInRegion(region));
|
Set<URI> allResults = api().getQueueApiForRegion(region).list();
|
||||||
assertNotNull(allResults);
|
assertNotNull(allResults);
|
||||||
if (allResults.size() >= 1) {
|
if (allResults.size() >= 1) {
|
||||||
URI queue = allResults.last();
|
URI queue = getLast(allResults);
|
||||||
assertQueueInList(region, queue);
|
assertQueueInList(region, queue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -91,11 +91,12 @@ public class SQSApiLiveTest extends BaseSQSApiLiveTest {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String recreateQueueInRegion(String queueName, String region) throws InterruptedException {
|
public String recreateQueueInRegion(String queueName, String region) throws InterruptedException {
|
||||||
Set<URI> result = api().listQueuesInRegion(region, queuePrefix(queueName));
|
QueueApi api = api().getQueueApiForRegion(region);
|
||||||
|
Set<URI> result = api.list(queuePrefix(queueName));
|
||||||
if (result.size() >= 1) {
|
if (result.size() >= 1) {
|
||||||
api().deleteQueue(Iterables.getLast(result));
|
api.delete(getLast(result));
|
||||||
}
|
}
|
||||||
URI queue = api().createQueueInRegion(region, queueName);
|
URI queue = api.create(queueName);
|
||||||
assertQueueInList(region, queue);
|
assertQueueInList(region, queue);
|
||||||
queues.add(queue);
|
queues.add(queue);
|
||||||
return queueName;
|
return queueName;
|
||||||
@ -104,8 +105,8 @@ public class SQSApiLiveTest extends BaseSQSApiLiveTest {
|
|||||||
@Test(dependsOnMethods = "testCanRecreateQueueGracefully")
|
@Test(dependsOnMethods = "testCanRecreateQueueGracefully")
|
||||||
protected void testGetQueueAttributes() {
|
protected void testGetQueueAttributes() {
|
||||||
for (URI queue : queues) {
|
for (URI queue : queues) {
|
||||||
Map<String, String> attributes = api().getQueueAttributes(queue, ImmutableSet.of("All"));
|
Map<String, String> attributes = api().getQueueApi().getAttributes(queue, ImmutableSet.of("All"));
|
||||||
assertEquals(api().getQueueAttributes(queue, attributes.keySet()), attributes);
|
assertEquals(api().getQueueApi().getAttributes(queue, attributes.keySet()), attributes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,29 +129,30 @@ public class SQSApiLiveTest extends BaseSQSApiLiveTest {
|
|||||||
@Test(dependsOnMethods = "testGetQueueAttributes")
|
@Test(dependsOnMethods = "testGetQueueAttributes")
|
||||||
protected void testAddAnonymousPermission() throws InterruptedException {
|
protected void testAddAnonymousPermission() throws InterruptedException {
|
||||||
for (URI queue : queues) {
|
for (URI queue : queues) {
|
||||||
QueueAttributes attributes = api().getQueueAttributes(queue);
|
QueueAttributes attributes = api().getQueueApi().getAttributes(queue);
|
||||||
assertNoPermissions(queue);
|
assertNoPermissions(queue);
|
||||||
|
|
||||||
String accountToAuthorize = getAccountToAuthorize(queue);
|
String accountToAuthorize = getAccountToAuthorize(queue);
|
||||||
api().addPermissionToAccount(queue, "fubar", Action.GET_QUEUE_ATTRIBUTES, accountToAuthorize);
|
api().getPermissionApiForQueue(queue).addPermissionToAccount("fubar", Action.GET_QUEUE_ATTRIBUTES,
|
||||||
|
accountToAuthorize);
|
||||||
|
|
||||||
String policyForAuthorizationByAccount = assertPolicyPresent(queue);
|
String policyForAuthorizationByAccount = assertPolicyPresent(queue);
|
||||||
|
|
||||||
String policyForAnonymous = policyForAuthorizationByAccount.replace("\"" + accountToAuthorize + "\"", "\"*\"");
|
String policyForAnonymous = policyForAuthorizationByAccount.replace("\"" + accountToAuthorize + "\"", "\"*\"");
|
||||||
api().setQueueAttribute(queue, "Policy", policyForAnonymous);
|
api().getQueueApi().setAttribute(queue, "Policy", policyForAnonymous);
|
||||||
|
|
||||||
assertEquals(getAnonymousAttributesApi(queue).getQueueArn(), attributes.getQueueArn());
|
assertEquals(getAnonymousAttributesApi(queue).getQueueArn(), attributes.getQueueArn());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected String getAccountToAuthorize(URI queue) {
|
protected String getAccountToAuthorize(URI queue) {
|
||||||
return Iterables.get(Splitter.on('/').split(queue.getPath()), 1);
|
return get(Splitter.on('/').split(queue.getPath()), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(dependsOnMethods = "testAddAnonymousPermission")
|
@Test(dependsOnMethods = "testAddAnonymousPermission")
|
||||||
protected void testRemovePermission() throws InterruptedException {
|
protected void testRemovePermission() throws InterruptedException {
|
||||||
for (URI queue : queues) {
|
for (URI queue : queues) {
|
||||||
api().removePermission(queue, "fubar");
|
api().getPermissionApiForQueue(queue).remove("fubar");
|
||||||
assertNoPermissions(queue);
|
assertNoPermissions(queue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -158,22 +160,22 @@ public class SQSApiLiveTest extends BaseSQSApiLiveTest {
|
|||||||
@Test(dependsOnMethods = "testGetQueueAttributes")
|
@Test(dependsOnMethods = "testGetQueueAttributes")
|
||||||
protected void testSetQueueAttribute() {
|
protected void testSetQueueAttribute() {
|
||||||
for (URI queue : queues) {
|
for (URI queue : queues) {
|
||||||
api().setQueueAttribute(queue, "MaximumMessageSize", "1024");
|
api().getQueueApi().setAttribute(queue, "MaximumMessageSize", "1024");
|
||||||
assertEquals(api().getQueueAttributes(queue).getMaximumMessageSize(), 1024);
|
assertEquals(api().getQueueApi().getAttributes(queue).getMaximumMessageSize(), 1024);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(dependsOnMethods = "testGetQueueAttributes")
|
@Test(dependsOnMethods = "testGetQueueAttributes")
|
||||||
protected void testSendMessage() {
|
protected void testSendMessage() {
|
||||||
for (URI queue : queues) {
|
for (URI queue : queues) {
|
||||||
assertEquals(api().sendMessage(queue, message).getMD5(), md5);
|
assertEquals(api().getMessageApiForQueue(queue).send(message).getMD5(), md5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(dependsOnMethods = "testSendMessage")
|
@Test(dependsOnMethods = "testSendMessage")
|
||||||
protected void testReceiveMessageWithoutHidingMessage() {
|
protected void testReceiveMessageWithoutHidingMessage() {
|
||||||
for (URI queue : queues) {
|
for (URI queue : queues) {
|
||||||
assertEquals(api().receiveMessage(queue, attribute("All").visibilityTimeout(0)).getMD5(), md5);
|
assertEquals(api().getMessageApiForQueue(queue).receive(attribute("All").visibilityTimeout(0)).getMD5(), md5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -182,21 +184,22 @@ public class SQSApiLiveTest extends BaseSQSApiLiveTest {
|
|||||||
@Test(dependsOnMethods = "testReceiveMessageWithoutHidingMessage")
|
@Test(dependsOnMethods = "testReceiveMessageWithoutHidingMessage")
|
||||||
protected void testChangeMessageVisibility() {
|
protected void testChangeMessageVisibility() {
|
||||||
for (URI queue : queues) {
|
for (URI queue : queues) {
|
||||||
|
MessageApi api = api().getMessageApiForQueue(queue);
|
||||||
// start hiding it at 5 seconds
|
// start hiding it at 5 seconds
|
||||||
receiptHandle = api().receiveMessage(queue, attribute("None").visibilityTimeout(5)).getReceiptHandle();
|
receiptHandle = api.receive(attribute("None").visibilityTimeout(5)).getReceiptHandle();
|
||||||
// hidden message, so we can't see it
|
// hidden message, so we can't see it
|
||||||
assertNull(api().receiveMessage(queue));
|
assertNull(api.receive());
|
||||||
// this should unhide it
|
// this should unhide it
|
||||||
api().changeMessageVisibility(queue, receiptHandle, 0);
|
api.changeVisibility(receiptHandle, 0);
|
||||||
// so we can see it again
|
// so we can see it again
|
||||||
assertEquals(api().receiveMessage(queue, attribute("All").visibilityTimeout(0)).getMD5(), md5);
|
assertEquals(api.receive(attribute("All").visibilityTimeout(0)).getMD5(), md5);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test(dependsOnMethods = "testChangeMessageVisibility")
|
@Test(dependsOnMethods = "testChangeMessageVisibility")
|
||||||
protected void testDeleteMessage() throws InterruptedException {
|
protected void testDeleteMessage() throws InterruptedException {
|
||||||
for (URI queue : queues) {
|
for (URI queue : queues) {
|
||||||
api().deleteMessage(queue, receiptHandle);
|
api().getMessageApiForQueue(queue).delete(receiptHandle);
|
||||||
assertNoMessages(queue);
|
assertNoMessages(queue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -205,7 +208,7 @@ public class SQSApiLiveTest extends BaseSQSApiLiveTest {
|
|||||||
@AfterClass(groups = "live")
|
@AfterClass(groups = "live")
|
||||||
protected void tearDownContext() {
|
protected void tearDownContext() {
|
||||||
for (URI queue : queues) {
|
for (URI queue : queues) {
|
||||||
api().deleteQueue(queue);
|
api().getQueueApi().delete(queue);
|
||||||
}
|
}
|
||||||
super.tearDownContext();
|
super.tearDownContext();
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,7 @@ public class BaseSQSApiLiveTest extends BaseContextLiveTest<RestContext<SQSApi,
|
|||||||
final AtomicReference<String> policy = new AtomicReference<String>();
|
final AtomicReference<String> policy = new AtomicReference<String>();
|
||||||
assertEventually(new Runnable() {
|
assertEventually(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
String policyForAuthorizationByAccount = api().getQueueAttribute(queue, "Policy");
|
String policyForAuthorizationByAccount = api().getQueueApi().getAttribute(queue, "Policy");
|
||||||
|
|
||||||
assertNotNull(policyForAuthorizationByAccount);
|
assertNotNull(policyForAuthorizationByAccount);
|
||||||
policy.set(policyForAuthorizationByAccount);
|
policy.set(policyForAuthorizationByAccount);
|
||||||
@ -68,7 +68,7 @@ public class BaseSQSApiLiveTest extends BaseContextLiveTest<RestContext<SQSApi,
|
|||||||
protected void assertNoPermissions(final URI queue) throws InterruptedException {
|
protected void assertNoPermissions(final URI queue) throws InterruptedException {
|
||||||
assertEventually(new Runnable() {
|
assertEventually(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
String policy = api().getQueueAttribute(queue, "Policy");
|
String policy = api().getQueueApi().getAttribute(queue, "Policy");
|
||||||
assertTrue(policy == null || policy.indexOf("\"Statement\":[]") != -1, policy);
|
assertTrue(policy == null || policy.indexOf("\"Statement\":[]") != -1, policy);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -77,7 +77,7 @@ public class BaseSQSApiLiveTest extends BaseContextLiveTest<RestContext<SQSApi,
|
|||||||
protected void assertNoMessages(final URI queue) throws InterruptedException {
|
protected void assertNoMessages(final URI queue) throws InterruptedException {
|
||||||
assertEventually(new Runnable() {
|
assertEventually(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
Message message = api().receiveMessage(queue);
|
Message message = api().getMessageApiForQueue(queue).receive();
|
||||||
assertNull(message, "message: " + message + " left in queue " + queue);
|
assertNull(message, "message: " + message + " left in queue " + queue);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -87,7 +87,7 @@ public class BaseSQSApiLiveTest extends BaseContextLiveTest<RestContext<SQSApi,
|
|||||||
final URI finalQ = queue;
|
final URI finalQ = queue;
|
||||||
assertEventually(new Runnable() {
|
assertEventually(new Runnable() {
|
||||||
public void run() {
|
public void run() {
|
||||||
Set<URI> result = api().listQueuesInRegion(region);
|
Set<URI> result = api().getQueueApiForRegion(region).list();
|
||||||
assertNotNull(result);
|
assertNotNull(result);
|
||||||
assert result.size() >= 1 : result;
|
assert result.size() >= 1 : result;
|
||||||
assertTrue(result.contains(finalQ), finalQ + " not in " + result);
|
assertTrue(result.contains(finalQ), finalQ + " not in " + result);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user