package io.fathom.cloud.storage.api.os.resources; import io.fathom.cloud.CloudException; import io.fathom.cloud.protobuf.FileModel.BucketData; import io.fathom.cloud.storage.state.FileStore; import java.util.Collections; import java.util.Date; import java.util.List; import javax.inject.Inject; import javax.ws.rs.GET; import javax.ws.rs.HEAD; import javax.ws.rs.Path; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; import javax.ws.rs.core.StreamingOutput; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Function; import com.google.common.collect.Lists; import com.google.common.collect.Ordering; import com.google.inject.persist.Transactional; @Path("/openstack/storage/{project}") @Transactional public class ProjectResource extends ObjectstoreResourceBase { private static final Logger log = LoggerFactory.getLogger(ProjectResource.class); @Inject FileStore fileStore; @QueryParam("marker") String marker; @HEAD public Response getStats() throws CloudException { // String projectId = getProjectId(); long containerCount = 0; long bytesUsed = 0; log.warn("Container stats not implemented"); ResponseBuilder response = Response.noContent(); response.header("X-Account-Container-Count", Long.toString(containerCount)); response.header("X-Account-Bytes-Used", Long.toString(bytesUsed)); response.header("Date", new Date()); return response.build(); } @GET public StreamingOutput listContainers(@QueryParam("format") String formatParam) throws CloudException { if ("json".equals(formatParam)) { } else { throw new UnsupportedOperationException(); } long projectId = getProject().getId(); List<BucketData> buckets = fileStore.getBuckets(projectId).list(); Collections.sort(buckets, Ordering.natural().onResultOf(new Function<BucketData, String>() { @Override public String apply(BucketData input) { return input.getKey(); } })); List<BucketData> filtered = buckets; if (marker != null) { log.warn("Marker query is inefficient"); List<BucketData> afterLimit = Lists.newArrayList(); for (BucketData bucket : buckets) { String name = bucket.getKey(); if (name.compareTo(marker) <= 0) { continue; } afterLimit.add(bucket); } filtered = afterLimit; } return new JsonBucketListWriter(filtered); } }