Skip to content
Permalink
Browse files
The list queues methods for the QueueApi.
  • Loading branch information
Everett Toews committed Nov 22, 2013
1 parent 4128671 commit 2e4c66675b0328f4fa9f528bdaf3c031deb6d0e8
Showing 8 changed files with 718 additions and 25 deletions.
@@ -0,0 +1,127 @@
/*
* 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.openstack.marconi.v1.domain;

import com.google.common.base.Objects;
import com.google.common.base.Optional;
import org.jclouds.javax.annotation.Nullable;

import java.util.Map;

import static com.google.common.base.Preconditions.checkNotNull;

/**
* A queue.
*
* @author Everett Toews
*/
public class Queue {

private final String name;
private final Map<String, String> metadata;

protected Queue(String name, @Nullable Map<String, String> metadata) {
this.name = checkNotNull(name, "id required");
this.metadata = metadata;
}

/**
* @return The name of this queue.
*/
public String getName() {
return name;
}

/**
* @return The key/value metadata for this queue.
*/
public Optional<Map<String, String>> getMetadata() {
return Optional.fromNullable(metadata);
}

@Override
public int hashCode() {
return Objects.hashCode(name);
}

@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Queue that = Queue.class.cast(obj);
return Objects.equal(this.name, that.name);
}

protected Objects.ToStringHelper string() {
return Objects.toStringHelper(this).omitNullValues()
.add("name", name).add("metadata", metadata);
}

@Override
public String toString() {
return string().toString();
}

public static Builder builder() {
return new ConcreteBuilder();
}

public Builder toBuilder() {
return new ConcreteBuilder().fromMessage(this);
}

public static abstract class Builder {
protected abstract Builder self();

protected String name;
protected Map<String, String> metadata;

/**
* @param name The name of this queue.
*/
public Builder name(String name) {
this.name = name;
return self();
}

/**
* @param metadata The key/value metadata for this queue.
*/
public Builder metadata(Map<String, String> metadata) {
this.metadata = metadata;
return self();
}

public Queue build() {
return new Queue(name, metadata);
}

public Builder fromMessage(Queue in) {
return this.name(in.getName()).metadata(in.getMetadata().orNull());
}
}

private static class ConcreteBuilder extends Builder {
@Override
protected ConcreteBuilder self() {
return this;
}
}

}
@@ -0,0 +1,73 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.openstack.marconi.v1.domain;

import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.Multimap;
import org.jclouds.openstack.marconi.v1.options.ListQueuesOptions;
import org.jclouds.openstack.marconi.v1.options.StreamOptions;
import org.jclouds.openstack.v2_0.domain.Link;
import org.jclouds.openstack.v2_0.domain.PaginatedCollection;

import java.beans.ConstructorProperties;

import static org.jclouds.http.utils.Queries.queryParser;

public class Queues extends PaginatedCollection<Queue> {
public static final Queues EMPTY = new Queues(ImmutableSet.<Queue> of(), ImmutableSet.<Link> of());

@ConstructorProperties({ "queues", "links" })
protected Queues(Iterable<Queue> queues, Iterable<Link> links) {
super(queues, links);
}

/**
* Only call this method if {@code nextMarker().isPresent()} returns true.
*
* @return The options necessary to get the next page of queues.
*/
public ListQueuesOptions nextListQueuesOptions() {
return ListQueuesOptions.class.cast(nextMarker().get());
}

@Override
public Optional<Object> nextMarker() {
Optional<Link> nextMarkerLink = Iterables.tryFind(getLinks(), IS_NEXT_LINK);
return nextMarkerLink.transform(TO_LIST_OPTIONS);
}

private static final Predicate<Link> IS_NEXT_LINK = new Predicate<Link>() {
@Override
public boolean apply(Link link) {
return Link.Relation.NEXT == link.getRelation();
}
};

private static final Function<Link, Object> TO_LIST_OPTIONS = new Function<Link, Object>() {
@Override
public Object apply(Link link) {
Multimap<String, String> queryParams = queryParser().apply(link.getHref().getRawQuery());
ListQueuesOptions listQueuesOptions = ListQueuesOptions.Builder.queryParameters(queryParams);

return listQueuesOptions;
}
};
}
@@ -16,15 +16,21 @@
*/
package org.jclouds.openstack.marconi.v1.features;

import org.jclouds.Fallbacks;
import org.jclouds.collect.PagedIterable;
import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
import org.jclouds.openstack.marconi.v1.domain.Queue;
import org.jclouds.openstack.marconi.v1.domain.QueueStats;
import org.jclouds.openstack.marconi.v1.domain.Queues;
import org.jclouds.openstack.marconi.v1.functions.ParseQueueStats;
import org.jclouds.openstack.marconi.v1.functions.ParseQueues;
import org.jclouds.openstack.marconi.v1.functions.QueuesToPagedIterable;
import org.jclouds.openstack.marconi.v1.options.ListQueuesOptions;
import org.jclouds.rest.annotations.BinderParam;
import org.jclouds.rest.annotations.Fallback;
import org.jclouds.rest.annotations.RequestFilters;
import org.jclouds.rest.annotations.ResponseParser;
import org.jclouds.rest.annotations.SkipEncoding;
import org.jclouds.rest.annotations.Transform;
import org.jclouds.rest.binders.BindToJsonPayload;

import javax.inject.Named;
@@ -35,9 +41,14 @@
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import java.util.Map;

import static org.jclouds.Fallbacks.EmptyPagedIterableOnNotFoundOr404;
import static org.jclouds.Fallbacks.FalseOnNotFoundOr404;
import static org.jclouds.openstack.keystone.v2_0.KeystoneFallbacks.EmptyPaginatedCollectionOnNotFoundOr404;

/**
* Provides access to Queues via their REST API.
*
@@ -46,8 +57,6 @@
@SkipEncoding({'/', '='})
@RequestFilters(AuthenticateRequest.class)
public interface QueueApi {
// TODO: Move name parameter into MarconiApi.getQueueApiForZone(String name, String zone)

/**
* Create a queue.
*
@@ -57,7 +66,7 @@ public interface QueueApi {
@Named("queue:create")
@PUT
@Path("queues/{name}")
@Fallback(Fallbacks.FalseOnNotFoundOr404.class)
@Fallback(FalseOnNotFoundOr404.class)
boolean create(@PathParam("name") String name);

/**
@@ -69,7 +78,7 @@ public interface QueueApi {
@Named("queue:delete")
@DELETE
@Path("queues/{name}")
@Fallback(Fallbacks.FalseOnNotFoundOr404.class)
@Fallback(FalseOnNotFoundOr404.class)
boolean delete(@PathParam("name") String name);

/**
@@ -81,10 +90,33 @@ public interface QueueApi {
@Named("queue:get")
@GET
@Path("queues/{name}")
@Fallback(Fallbacks.FalseOnNotFoundOr404.class)
@Fallback(FalseOnNotFoundOr404.class)
boolean exists(@PathParam("name") String name);

// TODO stream method!
/**
* List the queues.
*
* @param detailed Determines whether queue metadata is included in the list.
*/
@Named("queue:list")
@GET
@Consumes(MediaType.APPLICATION_JSON)
@ResponseParser(ParseQueues.class)
@Transform(QueuesToPagedIterable.class)
@Path("queues")
@Fallback(EmptyPagedIterableOnNotFoundOr404.class)
PagedIterable<Queue> list(@QueryParam("detailed") boolean detailed);

/**
* Use this method to manually page through the list of queues.
*/
@Named("record:list")
@GET
@ResponseParser(ParseQueues.class)
@Consumes(MediaType.APPLICATION_JSON)
@Fallback(EmptyPaginatedCollectionOnNotFoundOr404.class)
@Path("queues")
Queues list(ListQueuesOptions options);

/**
* Sets metadata for the specified queue.
@@ -102,7 +134,7 @@ public interface QueueApi {
@PUT
@Path("queues/{name}/metadata")
@Produces(MediaType.APPLICATION_JSON)
@Fallback(Fallbacks.FalseOnNotFoundOr404.class)
@Fallback(FalseOnNotFoundOr404.class)
boolean setMetadata(@PathParam("name") String name,
@BinderParam(BindToJsonPayload.class) Map<String, String> metadata);

@@ -116,7 +148,7 @@ boolean setMetadata(@PathParam("name") String name,
@GET
@Path("queues/{name}/metadata")
@Consumes(MediaType.APPLICATION_JSON)
@Fallback(Fallbacks.FalseOnNotFoundOr404.class)
@Fallback(FalseOnNotFoundOr404.class)
Map<String, String> getMetadata(@PathParam("name") String name);


@@ -131,6 +163,6 @@ boolean setMetadata(@PathParam("name") String name,
@Path("queues/{name}/stats")
@Consumes(MediaType.APPLICATION_JSON)
@ResponseParser(ParseQueueStats.class)
@Fallback(Fallbacks.FalseOnNotFoundOr404.class)
@Fallback(FalseOnNotFoundOr404.class)
QueueStats getStats(@PathParam("name") String name);
}
@@ -0,0 +1,54 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF 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.openstack.marconi.v1.functions;

import com.google.common.base.Function;
import com.google.common.collect.ImmutableSet;
import org.jclouds.http.HttpResponse;
import org.jclouds.http.functions.ParseJson;
import org.jclouds.openstack.marconi.v1.domain.Queue;
import org.jclouds.openstack.marconi.v1.domain.Queues;
import org.jclouds.openstack.v2_0.domain.Link;
import org.jclouds.openstack.v2_0.domain.PaginatedCollection;

import javax.inject.Inject;
import java.beans.ConstructorProperties;

import static com.google.common.base.Preconditions.checkNotNull;

/**
* @author Everett Toews
*/
public class ParseQueues implements Function<HttpResponse, PaginatedCollection<Queue>> {

private final ParseJson<Queues> json;

@Inject
ParseQueues(ParseJson<Queues> json) {
this.json = checkNotNull(json, "json");
}

@Override
public PaginatedCollection<Queue> apply(HttpResponse response) {
// An empty message stream has a 204 response code
if (response.getStatusCode() == 204) {
return Queues.EMPTY;
}

return json.apply(response);
}
}

0 comments on commit 2e4c666

Please sign in to comment.